👀

今日の学び②

に公開

stateの更新方法

① viewModelに関数をつくる。

    Future<void> selectGender(gender) async {
    final data = state.requireValue;
    state = AsyncData(data.copyWith(selectedGender: gender));
  }

.requireValueはnullでない値であることを確認して値を使うメソッド。
viewでデータがあるときのみ使うのでrequireValueでオッケー。
.copywithはイミュータブルなオブジェクトを更新する。指定したプロパティだけを変更できる。便利。

② viewで呼び出す

例:DropdownButtonの場合

DropdownButton(
        items: data.dropDownGenderMap.entries
            .map(
              (entry) => DropdownMenuItem(
                value: entry.key,
                child: Text(entry.value),
              ),
            )
            .toList(),
        value: data.selectedGender,
        onChanged: (gender) async {
          await ref
              .read(questionnaireViewModelProvider.notifier)
              .selectGender(gender);
        },
      ),
ref.read(questionnaireViewModelProvider.notifier).selectGender(gender);

でstateの変更。
とにかくread()の中に.notifierを付ければメソッドを使えるっぽい。

あと、DropdownButton.valueとDropdownMenuItem.valueは必ず一致するようにする。

https://zenn.dev/szktty/articles/flutter-dropdown-button-errors

extendsについて

クラスが別のクラスを継承することを示す。
例えば、

class ParentClass {
  void someMethod() {
    print('親クラスのメソッド');
  }
}

class ChildClass extends ParentClass {
  
  void someMethod() {
    print('子クラスでオーバーライドされたメソッド');
  }
}

こんな感じのクラスがあるときを考える。
このとき、ChildClassがParentClassを継承している。

そして@overrideでParentClassを継承しつつ上書きしていくイメージ?

Discussion