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

时间:2018-11-07 15:22:31

标签: dart flutter state immutability statelesswidget

StatelessWidget被标记为immutable。但是,我正在使用scoped model,这意味着我避免使用StatefulWidget并使用model来更改state中的StatelessWidget。这导致我在non-final fields中有StatelessWidget,这不会导致errors,因为它只是warning。但是我想知道是否有更好的方法?

2 个答案:

答案 0 :(得分:4)

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

扩展StatefulWidget的类必须遵循相同的规则,因为它们也被重构。在布局树的窗口小部件生存期内,仅保留State(其中可以包含可变字段)。

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

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

将有状态小部件用于:

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

使“页面”小部件(构建Scaffold的小部件,可以使用Navigator访问)通常是有状态的。这些通常是范围模型的宿主。

答案 1 :(得分:0)

这是您的问题:

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

您在这里的要求↑似乎是一种更多的应用程序状态管理方法,该方法应该优于范围模型

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

  • 将数据与小部件绑定

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

  • 在绑定数据的每次更改时自动重新生成小部件

也许为此,您可以使用 rxdart

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