2017-06-05 77 views

回答

7

当Flutter具有“markNeedsBuild”功能时,开发人员最终只是随意调用它。当语法切换为setState(() { ... })时,开发人员更可能正确使用API​​。从机器的角度来看,它们在功能上是等价的,但是它们似乎可以唤起开发人员的不同代码。

如果你遵循的唯一一个突变关闭setState内部成员变量的约定,你会避免你重构一些代码,意外地删除调用setState,或致电setState不必要的情况。如果您的State未被安装,Flutter可能会失败一个断言,所以只要开始尝试对成员进行变异,而不是最后就知道出了错。

最终有可能会是一个analyzer warning执行的是一个突变的State成员时,setState总是被调用,这样的initState外面发生或setState回调将被标记为可疑的任何成员变量突变。

如果您刚开始使用Flutter状态,请查看Flutter widgets tour。我发现我拨打setState的很多案例可以使用FutureBuilderStreamBuilder,AnimatedWidgetAnimatedBuilder更优雅地处理,因此如果您发现自己拨打setState很多,请不要忘记考虑这些替代方案。

Adam Barth和Yaroslav Volovich对此问题/答案做出了贡献。