Flutter中函数调用在有状态小部件中的工作方式

uhry853o  于 2023-05-19  发布在  Flutter
关注(0)|答案(1)|浏览(164)

我在我的一个有状态小部件中创建了一个函数,我定期调用它,所以一旦我退出屏幕,该函数仍然会被调用。我定期调用一个API,当调用出错时,我会显示一个snackbar,所以有时当我退出应用程序时,snakbar会继续出现。

@override
  void initState() {
    super.initState();
    loadMessages();
  }

  @override
  void dispose() {
    super.dispose();
  }

  Future<void> loadMessages() async {
    Map<String, dynamic> data = await chatVM.fetchConvoApi();

    List<dynamic> messagesJson = data['messages'];

    setState(() {
      if (messagesJson.isEmpty == false) {
        _messages = messagesJson.map((e) => Message.fromJson(e)).toList();
      }
      startLoadingNewMessagesPeriodically();
    });
  }

  Future<void> loadNewMessages() async {
    String? time;
    if (_messages.isNotEmpty) {
      time = _messages[_messages.length - 1].sentTime;
    }
    Map<String, dynamic> data =
        await chatVM.fetchLatestApi(time ?? DateTime.now().toIso8601String());
    List<dynamic> messagesJson = data['messages'];
    if (messagesJson.isNotEmpty) {
      setState(() {
        _messages.addAll(messagesJson.map((e) => Message.fromJson(e)).toList());
      });
    }
  }

  void startLoadingNewMessagesPeriodically() {
    Timer.periodic(const Duration(seconds: 5), (timer) {
      // Your code to load new messages here
      loadNewMessages();
    });
  }
gv8xihay

gv8xihay1#

听了你的解释,我有点难以理解发生了什么事。你能给予我更多的信息吗?
我认为有两种可能的情况
1.您的Stateful小部件仍在小部件树中。
从技术上讲,如果小部件树中没有Stateful Wiget,它就不会调用任何函数。所以我建议你在Devtools中检查你的Widget树。如果它仍然在你的小部件树中,确保它从你的小部件树中卸载。
1.检查状态Widget的dispose()方法。
您是否在State Widget的dispose()方法上添加了任何新方法?在这种情况下,调用dispose()时可能会产生某种副作用。

相关问题