3

该类StatelessWidget被标记为immutable。但是,我使用的是scoped model,这意味着我避免StatefulWidget使用来model改变stateStatelessWidget这导致我有non-final fieldsin StatelessWidget,这不会导致errors,因为它只是一个warning. 但我想知道是否有更好的方法?

4

2 回答 2

8

无状态小部件应该只有 final 字段,没有例外。原因:当父widget由于某种原因被重建时(屏幕旋转、动画、滚动...),build调用父widget的方法,导致所有widget被重建。

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

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

其实ScopedModelDescendant也是一个有状态的widget。scoped_model 的主要好处是您可以将业务逻辑与小部件层分离。它并没有消除对有状态小部件的需求。

将有状态小部件用于:

  • 将作用域模型注入树(构建小部件的ScopedModel小部件)。将Model实例存储在State.
  • 存储用户输入(TextEditingController复选框的状态)
  • 需要AnimationControllers 的动画小部件
  • Controller存储以( TabController, ScrollController, ...)结尾的任何内容

使“页面”小部件(构建 的小部件Scaffold,可使用 访问Navigator)有状态通常是一个好主意。通常这些是作用域模型的宿主。

于 2018-11-07T15:43:26.420 回答
0

这是你的问题:

您是否认为有更好的方法来完成我想要的,同时保持“短类结构”,帮助我保持监督并能够从任何地方触发这些类的重建?

您在这里所要求的 ↑ 似乎是一种比范围模型更好的应用程序状态管理方法

如您所知,应用程序状态管理方法是一组允许您作为开发人员的技术:

  • 数据与小部件绑定

反过来,将数据与小部件绑定可以帮助您作为开发人员:

  • 绑定数据的每次更改时自动重建小部件

也许,为此目的,您可以使用rxdart

在这里,您将找到一些非常有用的应用程序状态管理方法列表,这些方法可以引导您找到更好的应用程序开发方式:

于 2020-07-14T08:38:39.300 回答