setState で関連させたい状態の値を一緒に変更する
setState の中で変更したら良い。後は、build でその状態用のリストを動的に確保するだけ。
気付けば簡単。
ドロップダウンA に応じて、ドロップダウンB の項目を切り替える場合、以下のような感じ
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
の黒魔術がどうなっているのかほどかないと駄目そう。