在Flutter中如何求解这种稳定状态

zbdgwd5y  于 2023-01-02  发布在  Flutter
关注(0)|答案(1)|浏览(140)

我完全无法以书面形式解释这个问题,所以我正尝试逐步解释
我有Stfl widget page
我把下面的代码放进去它是initState methood

  1. @override
  2. void initState(){
  3. Future.delayed(const Duration(seconds: 10), () {
  4. setState(() {});
  5. print('ok i rebuilt the state successfully');
  6. });
  7. super.initState();
  8. }

现在,如果我在Duration(seconds: 10)之前更改了UI中的任何内容,它将按预期成功更新用户界面。
现在,出于好奇,我想知道如果我退出页面,前一个方法是否仍处于挂起状态并在10秒后执行,我执行了以下操作
1-我登录到该页面以注册initstate中的函数
2-我在10秒内退出了页面
3-好的,现在我在差异页面等待print('ok i rebuilt the state successfully');打印
4-嗯..它按预期打印成功了
现在,我重复相同的步骤,但做了如下更改
1-我登录到该页面以注册initstate中的函数
2-我在10秒内退出了页面
3-i i在10秒完成之前再次登录到页面
好的,现在它应该打印两次..一次是第一个注册的函数,一次是第二个,是的,它按预期打印两次,但我注意到,如果我在10秒前在UI中进行更改,则UI将永远不会通过第一个注册的函数更新它自己(尽管我在控制台中看到该过程是成功的)。但它通过第二个注册的函数更新它自己。
现在我的问题是为什么它不更新的第一个注册函数。以及我怎么能使它更新用户界面的旧挂起setState方法。
事实上,它发生在setState或提供程序中。
我需要这种行为有很多原因

1yjd4xko

1yjd4xko1#

当您导航到页面时,每次都会创建一个新的小部件示例,因此setState会针对相应的小部件运行。
假设你在同一个屏幕上有两个这样的程序,你不希望一个更新另一个的状态,同样的事情也会发生。
另外,我不知道您是否正在使用future.delayed来测试这一点。如果您在应用中使用future.delayed,我建议您在设置状态之前检查mounted属性,以防止在已释放的Widget上设置状态,这可能会导致问题和异常。
比如

  1. Future.delayed(const Duration(seconds: 10), () {
  2. if (!mounted) return;
  3. setState(() {});
  4. print('ok i rebuilt the state successfully');
  5. });

相关问题