3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Flutter の DropdownButton の項目を、他の状態に応じて変更する

Posted at

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 の黒魔術がどうなっているのかほどかないと駄目そう。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?