1. emaame

    Posted

    emaame
Changes in title
+Flutter の DropdownButton の項目を、他の状態に応じて変更する
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,49 @@
+# setState で関連させたい状態の値を一緒に変更する
+setState の中で変更したら良い。後は、build でその状態用のリストを動的に確保するだけ。
+気付けば簡単。
+
+ドロップダウンA に応じて、ドロップダウンB の項目を切り替える場合、以下のような感じ
+
+```dart
+ listForB() {
+ return List.generate(stateB, (i) => i); // stateB に応じてリストを作る
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ var listA = listForA();
+ var listB = listForB();
+ // ... 中略 ...
+ dropdownButton<_T>(
+ value: stateA,
+ onChanged: (newValue) {
+ setState(() {
+ stateA = newValue;
+ // stateA で stateB を正規化などする
+ // ここで選択肢に含まれるように修正する
+ stateB = normalizedStateB(stateA);
+ };
+ },
+ // ... 中略 ...
+ ),
+ dropdownButton<_T>(
+ value: stateB,
+ onChanged: (newValue) {
+ setState(() {
+ stateB = newValue; // そもそも有効な値しか選択されないようになる
+ };
+ },
+ // ... 以下略 ...
+```
+
+まだ、戯れているだけなので、効率がどうなのかはあまり気にしていない
+(`listForA`, `listForB` をキャッシュする必要があるかなど)。
+
+# onChanged を括り出したいのだけれど…
+上記のように無名関数だと動くのに、`State` のメンバ関数にすると、下記のようなエラーが出ることが。
+
+```
+type 'int' is not a subtype of type 'String'
+```
+
+持ってるスコープの問題だったりするんだろうなぁ。この辺、`setState` の黒魔術がどうなっているのかほどかないと駄目そう。