SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Flutterで始めるモバイルアプリ開発

Flutterのマテリアルデザインをフル活用! テキスト入力の設定・取得~ラジオボタン・チェックスボックスの入力コンポーネントを紹介

Flutterで始めるモバイルアプリ開発 第16回

チェックボックス

 チェックボックス(Checkbox)はラジオと違い、複数の値を選択できる入力コントロールです。一般的には、チェック済みのtrueとチェックがないfalseの2つの状態を管理します。しかし、このチェックボックスはtrue/false/nullの3つの状態も管理可能です。

 これらの利用ケースを使った実行例が図2です。例えば、図2での(Group C)が複数のグループのチェック状態ですべてにチェック済みとすべてにチェック無し、そして一部チェック済みという状態が必要です。このような状態を管理することもこのチェックボックスを使って行えます。このような利用例がリスト6です。

図2:Checkboxを使ったコードの実行例
図2:Checkboxを使ったコードの実行例
[リスト6]Checkboxを使ったコード例(lib/checkbox/CheckboxWidget.dartの抜粋)
class _CheckboxWidget extends State<CheckboxWidget> {
  // (1) 選択した状態を管理する変数
  List _checkedValues = [];
  List _childValues = [];

  // : (省略)

  // (2) チェックボックスの利用
  Checkbox createCheck(int dataValue){
    return Checkbox(
      value: _checkedValues.contains(dataValue),
      onChanged: (bool? value) {
        setState(() {
          if(value != null && value){
            if(!_checkedValues.contains(dataValue)){
              _checkedValues.add(dataValue);
            }
          }
          else{
            if(_checkedValues.contains(dataValue)){
              _checkedValues.remove(dataValue);
            }
          }
        });
      },
    );
  }
  // (3) グループを扱うチェックボックス
  Checkbox createOtherCheckbox(){
    return Checkbox(
        // (4) true/false/nullの3つの状態を管理する
        tristate: true,
        // (5) 3つの状態に設定する
        value: _childValues.length == 2 ? true : (_childValues.length == 0)? false : null,
        onChanged: (bool? value){
          setState(() {
            // (6) チェックされたらすべて選択済みにする、それ以外は選択無しにする
            if(value != null){
              if(value){
                _childValues = [1,2];
              }
              else{
                _childValues = [];
              }
            }
            else{
              _childValues = [];
            }
          });
        },
    );
  }
  // : (省略)
  // (7) 利用できないチェックボックス
  Checkbox createDisableCheckbox(bool checked){
    return Checkbox(
      value: checked,
      onChanged: null,
    );
  }
}

 (1)でチェックボックスの状態を管理するListを用意します。通常のtrueとfalseを管理するチェックボックスが(2)のコードです。valueがtrueの場合にはチェック済みであり、falseの場合にチェック無しを示します。そして、(3)がグループを扱うためのチェックボックスのコード例で、このチェックボックスではtrue/false/nullを管理する必要があります。

 そこで、(4)tristateにtrueを設定して3つの状態を管理可能にします。(5)でvalueがtrueの場合にはすべてチェック済み、falseですべてチェック無し、nullで部分的にチェックされた状態を示すようにします。また、nullの場合には、表示が「-」のようになります。

 また、3つの状態の場合には、チェック状態がtrueからnull、nullからfalse、falseからtrueに変化します。少々、複雑なルールに感じますが、この例のようにnullが部分選択と解釈すれば理解しやすいと思います。そして、この状態にそって値が変わるので(6)のように状態に合わせて管理するグループの選択状態を作成します。選択できない状態にするには、他のコンポーネントと同様に(7)のようにonChangedにnullを設定すれば可能です。

まとめ

 約2回にわたりテキスト入力コンポーネント(TextFormField)について説明してきました。テキスト入力というのがもっとも自由度が求められるために、それに合わせて制御も複雑になりがちです。そのため、同じことを行う方法が複数用意されています。

 また、郵便番号など複数のテキスト入力を組み合わせて1つの入力のように扱うこともよくあります。そのような複雑なコンポーネントを作る際には、今回だけの情報では足りない部分が出てくることもあると思います。

 その場合には、今回紹介できなかったプロパティなども含めて調べてみてください。次回も引き続き、その他の入力コンポーネントを紹介します。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Flutterで始めるモバイルアプリ開発連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクト について> 有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/15268 2021/12/17 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー