Flutter:无状态小部件中的可变字段

foo*_*ist 1 state immutability dart flutter statelesswidget

该课程StatelessWidget标记为immutable。不过,我现在用的scoped model,这意味着,我尽量避免StatefulWidget和使用model来改变stateStatelessWidget。这导致我non-final fields进入StatelessWidget,这不是原因errors,因为它只是一个warning。但是我想知道是否有更好的方法?

bof*_*mer 5

无状态窗口小部件应仅具有final字段,没有例外。原因:当出于某种原因(屏幕旋转,动画,滚动...)重建父级小部件时,将build调用父级的方法,这将导致所有小部件都被重建。

扩展的类StatefulWidget必须遵循相同的规则,因为它们也被重构。只有State,它可以包含可变领域,是小部件的布局树的生命周期内保持。

没有理由要避免StatefulWidget。它是Flutter的基本构建块。

实际上,ScopedModelDescendant它也是一个有状态的小部件。scoped_model的主要好处是您可以将业务逻辑与小部件层分开。它并不能消除对有状态小部件的需求。

将有状态小部件用于:

  • 将作用域模型注入树(用于构建ScopedModel窗口小部件的窗口小部件)。将Model实例存储在中State
  • 存储用户输入(TextEditingController,复选框的状态)
  • 需要AnimationControllers的动画小部件
  • 要存储任何与两端ControllerTabControllerScrollController,...)

使“页面”窗口小部件(Scaffold使用进行构建的窗口小部件Navigator)具有状态通常是一个好主意。通常,这些是范围模型的宿主。