1. ホーム
  2. flutter

[解決済み] dispose() の後に setState() が呼ばれる。

2022-06-11 22:54:25

質問

レイズボタンをクリックすると、タイムピッカーが表示されます。ここで、例えば5秒待って、時間を確定すると、このようなエラーが発生します。 setState()がdispose()の後に呼び出されました。

flutter が親ウィジェットを更新しているのがコンソールでわかりますが、なぜでしょうか?私は何もしていません - ただ5秒待っているだけです! 下の例は通常のプロジェクトでは動作しますが、私のプロジェクトはかなり複雑で、私が待っている間にFlutterが状態を更新しているため動作しません...。 何が間違っているのでしょうか?誰か、Flutterが私の複雑なプロジェクトではランダムに更新し、シンプルなプロジェクトでは更新しない原因を知っていますか?

[UPDATE]です。 もう一度見てみたところ、私のサイトの TabBarTabBarView があります。 もしかして、"と関係があるのでしょうか? とTickerProviderStateMixinの のために必要なものです。 TabBarView ? それは、アプリが定期的かつランダムに更新される原因となっている可能性がありますか?

 class DateTimeButton extends State<DateTimeButtonWidget> {
  DateTime selectedDate = new DateTime.now();

  Future initTimePicker() async {
    final TimeOfDay picked = await showTimePicker(
      context: context,
      initialTime: new TimeOfDay(hour: selectedDate.hour, minute: selectedDate.minute),
    );

    if (picked != null) {
      setState(() {
        selectedDate = new DateTime(selectedDate.year, selectedDate.month, selectedDate.day, picked.hour, picked.minute);
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return new RaisedButton(
      child: new Text("${selectedDate.hour} ${selectedDate.minute}"),
      onPressed: () {
        initTimePicker();
      }
    );
  }
}

どのように解決するのですか?

booleanプロパティをチェックするだけです。 mounted を呼び出す前に、ウィジェットのステートクラスの setState() .

if (this.mounted) {
  setState(() {
    // Your state change code goes here
  });
}

あるいは、よりクリーンな方法として オーバーライド setState メソッドを StatelfulWidget メソッドに追加します。

class DateTimeButton extends StatefulWidget {
  @override
  void setState(fn) {
    if(mounted) {
      super.setState(fn);
    }
  }
}