2017-06-05 76 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對此問題/答案做出了貢獻。