【问题标题】:Flutter - SetState method parameter usageFlutter - SetState 方法参数使用
【发布时间】:2019-11-26 20:33:34
【问题描述】:

我今天才开始尝试 Flutter。我正在关注官方教程:https://flutter.dev/docs/development/ui/interactive(本题涉及步骤#3)

我了解Stateful Widgets 的概念和setState() 的必要性,但我不了解它的参数(函数)的意义。为什么我们要向它传递一个函数? setState 不能是无参数的,然后我们只需在调用 setState 之前放置状态更改代码(我们将放在该参数函数上)吗?

所以基本上我的问题是:有什么区别

A) setState(() { myCounter++; });

B) 我的计数器++; setState(() {} );

?

Obs:在我上面链接的教程中,如果我这样做,结果是(或似乎是)相同。

【问题讨论】:

  • this的可能重复项?
  • 供以后参考,学习了Flutter一个月我还是不知道答案,看来你可以做任何一种方式,唯一的区别是在方法A setState 有一些检查,不会执行如果检查失败(无效状态等),则其中的代码,而 B 方法没有这些检查。此外,不是建议的重复,下面的单一答案也不适用于该问题(我知道我不应该用繁重的计算锁定主线程,问题与此无关)。

标签: flutter


【解决方案1】:

回调函数可确保您对模型所做的更改是同步的,并且您应该只设置 UI 需要的内容。 这将确保在框架刷新 UI 之前设置更改,因为您无法对回调进行异步工作,并且结果可以预测。

如果您必须进行繁重的计算,您应该在调用 setState 之前进行。

在您的示例中,它是相同的,因为只是一个简单的变量增量,但实际上,如果您有繁重的操作或异步操作并且想要运行这些操作。如果允许,回调内部可能会对性能产生影响。

查看官方文档以获取更多示例:https://api.flutter.dev/flutter/widgets/State/setState.html

【讨论】:

  • 文档说“通常建议setState方法只用于包装对状态的实际更改,而不是任何可能与更改相关的计算。” 但是,如果我的更改是从 base64 字符串读取的大型高清图像怎么办?如果在此之前完成了图像的读取和转换,我在setState() 中放了什么?
  • 您应该创建一个异步方法,在其中执行 await BigCompurationFunction() 然后调用 setState。您可以在异步函数中使用 setState。您不能将异步函数传递给 setState。
【解决方案2】:

我也有同样的疑问,我查了setState的代码,还是没找到方法参数的特殊用法。所以我觉得setState方法参数的设计是不合理的,让setState做一个无参数函数比较好理解:

myCounter++; 
setState();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-21
    • 2020-12-17
    • 2019-08-24
    • 2021-04-06
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多