该类StatelessWidget
被标记为immutable
。但是,我使用的是scoped model
,这意味着我避免StatefulWidget
使用来model
改变state
。StatelessWidget
这导致我有non-final fields
in StatelessWidget
,这不会导致errors
,因为它只是一个warning
. 但我想知道是否有更好的方法?
2 回答
无状态小部件应该只有 final 字段,没有例外。原因:当父widget由于某种原因被重建时(屏幕旋转、动画、滚动...),build
调用父widget的方法,导致所有widget被重建。
扩展的类StatefulWidget
必须遵循相同的规则,因为它们也会被重构。只有State
可以包含可变字段的 ,在布局树中的小部件的生命周期内保留。
没有理由避免StatefulWidget
。它是 Flutter 的基本构建块。
其实ScopedModelDescendant
也是一个有状态的widget。scoped_model 的主要好处是您可以将业务逻辑与小部件层分离。它并没有消除对有状态小部件的需求。
将有状态小部件用于:
- 将作用域模型注入树(构建小部件的
ScopedModel
小部件)。将Model
实例存储在State
. - 存储用户输入(
TextEditingController
复选框的状态) - 需要
AnimationController
s 的动画小部件 Controller
存储以(TabController
,ScrollController
, ...)结尾的任何内容
使“页面”小部件(构建 的小部件Scaffold
,可使用 访问Navigator
)有状态通常是一个好主意。通常这些是作用域模型的宿主。
这是你的问题:
您是否认为有更好的方法来完成我想要的,同时保持“短类结构”,帮助我保持监督并能够从任何地方触发这些类的重建?
您在这里所要求的 ↑ 似乎是一种比范围模型更好的应用程序状态管理方法。
如您所知,应用程序状态管理方法是一组允许您作为开发人员的技术:
- 将数据与小部件绑定。
反过来,将数据与小部件绑定可以帮助您作为开发人员:
- 在绑定数据的每次更改时自动重建小部件。
也许,为此目的,您可以使用rxdart:
在这里,您将找到一些非常有用的应用程序状态管理方法列表,这些方法可以引导您找到更好的应用程序开发方式: