30代SEの自由帳

最初のタイトルは頓挫した

Flutterでチケライヘルパーを作ってみた話 その3

要件定義

まずはどんなヘルパーが欲しいか?

各プレイヤーが獲得した路線と点数を管理したい。

今回は個人開発かつ小規模(予定)なのでガッツリした設計はしないで場当たり的に進める。
けど、ある程度ばらした方がやることが明確になるので、ざっくりと思いつく範囲で分解する。

graph LR A[各プレイヤーが獲得した路線と点数を管理したい] A-->B1[プレイヤー選択] B1-->C(ドロップダウン) C-->D([プレイヤーリスト]) A-->B2[路線選択] B2-->E(ドロップダウン) E-->F([路線リスト]) F-->G([駅*2]) A-->B3[点数獲得] B3-->H(獲得ボタン) H-->I[計算] I-->J1([プレイヤー:点数]) I-->J2([路線:点数])

さっそく実装

まずはドロップダウンから作ってみようかな

Flutter ドロップダウン

DropdownButtonってのやるらしいのでAPI仕様を検索しなおし api.flutter.dev

プレイヤーを選択する方について、5人固定でとりあえず実装してみる。

DropdownButton(
  value: 0, // 選択されているDropdownMenuItemのvalue
  items: List.generate(
  // List.generate:リストを生成してくれる。便利
    5, // 生成するリストの要素数。プレイヤーは最大5人なので5
    (index) => DropdownMenuItem( // 生成するリストの内容。特定の型(今回はDropdownMenuItem)を返す無名関数
    //ドロップダウンに表示する内容の定義
    value: index, //各要素を特定するためのユニークID的なもの
    child: Text(
      "プレイヤー${index + 1}"), // 表示される内容。${}で変数の内容を直接文字列に出来る便利
    ),
  ),
  onChanged: (_) {})

これだけで、こんな感じのドロップダウンリストが完成。

わぉ。思ってたより簡単に実装できた

ただ、これだとvalueが0固定なので何を選択しても表示されるのはvalue:0の要素(プレイヤー1)。
選択されたvalueはonChangedで通知されるので、そこで値を保持して選択した内容が反映されるようにする。

DropdownButton<int>(
  value: selVal, // 選択されているvalueを示す変数を指定
  items: List.generate(
    5,
    (index) => DropdownMenuItem(
    value: index, //各要素を特定するためのユニークID的なもの
    child: Text(
      "プレイヤー${index + 1}"), 
    ),
  ),
  onChanged: (val) {selVal = val!;})  //selValに選択されているvalueを保持。nullがあり得るのでvalに!をつける

変数を保持する必要出てきたからStatelessWidgeからStatefulWidgetへ変更
リファクターで一発変換してくれるのですごく便利。

一回わかっちゃえばこんなに簡単なのね。手を動かすって大切

つづく。。

編集後記

一通り書いてから、新出の構文についての概要説明も書こうと思ってたけど、その前に時間切れ。 次は先に進めるか、新出構文の概要説明のターンにするか明日考える。