繁体   English   中英

我怎么能解决 flutter 中的那种 stful setState

[英]How could i solve that kind of stful setState in flutter

我完全无法以书面形式解释这个问题,所以我正在尝试逐步解决

我有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中的任何内容,它将按预期成功更新 ui。

现在,出于好奇,我想知道如果我退出页面,之前的方法是否仍然挂起并在 10 秒后执行,我做了以下操作

1-我登录页面在initstate中注册initstate

2- 我在 10 秒用完之前退出了页面

3- 好的,现在我在不同的页面等待print('ok i rebuilt the state successfully'); 打印

4- 嗯..它按预期成功打印

现在我重复相同的步骤并进行一些更改,例如以下

1-我登录页面在initstate中注册initstate

2- 我在 10 秒用完之前退出了页面

3- ii 在 10 秒完成之前再次登录页面

好的,现在它应该打印两次。第一次注册 function 一次,第二次注册一次,是的,它按预期打印两次,但我注意到,如果我在 10 秒之前对 ui 进行更改,那么 UI 将永远不会更新它self by 第一个注册的 function(虽然我在console看到这个过程是成功的)。 但它会在第二个注册的 function 时自行更新。

现在我的问题是为什么它不通过首次注册的 function 进行更新。我如何才能通过旧的挂起setState方法使其更新 ui。

事实上,它发生在setState或提供者身上。

我需要这种行为有很多原因

当您导航到该页面时,每次都会创建一个新的 Widget 实例。 所以setState是针对相应的小部件运行的。

假设您在同一个屏幕上有 2 个,您不希望一个更新另一个的 state。同样的事情发生在这里。

另外,我不知道你是否正在做future.delayed来测试这个。 如果你在你的应用程序中这样做,我建议你在设置 state 之前检查mounted属性,这样你就可以防止在处置的 Widget 上设置 state ,这可能会导致问题和异常。

就像是

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM