我完全无法以书面形式解释这个问题,所以我正尝试逐步解释
我有Stfl widget page
我把下面的代码放进去它是initState methood
@override
void initState(){
Future.delayed(const Duration(seconds: 10), () {
setState(() {});
print('ok i rebuilt the state successfully');
});
super.initState();
}
现在,如果我在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
或提供程序中。
我需要这种行为有很多原因
1条答案
按热度按时间1yjd4xko1#
当您导航到页面时,每次都会创建一个新的小部件示例,因此
setState
会针对相应的小部件运行。假设你在同一个屏幕上有两个这样的程序,你不希望一个更新另一个的状态,同样的事情也会发生。
另外,我不知道您是否正在使用
future.delayed
来测试这一点。如果您在应用中使用future.delayed
,我建议您在设置状态之前检查mounted
属性,以防止在已释放的Widget上设置状态,这可能会导致问题和异常。比如