【问题标题】:Flutter: Mutable fields in stateless widgetsFlutter:无状态小部件中的可变字段
【发布时间】:2018-11-07 15:22:31
【问题描述】:

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

【问题讨论】:

  • 请添加一些示例代码。你在做什么听起来不对。

标签: dart flutter state immutability statelesswidget


【解决方案1】:

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

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

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

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

将有状态小部件用于:

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

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

【讨论】:

  • 非常有帮助!您是否认为将 ScopedModel 包裹在根 MaterialApp 周围是错误的,它充当“管理器”并在其中包含所有其他模型的实例以使它们可以从应用程序的所有部分访问?这会对性能产生负面影响吗?
  • 它不会影响性能,但是为您需要的每个模型使用单独的 ScopedModel 小部件会更干净(只需将它们交错,同样不会影响性能)。
  • 只有在需要 notifyListeners 功能时才创建作用域模型。一般来说,如果您只需要提供某种“全局”服务,您可以使用提供服务的简单InheritetWidget(服务将是一个简单的类)
  • 我真的建议你看一下 scoped_model 的源代码以了解发生了什么
  • 我就是这么做的。而且我想知道范围模型是否对我来说是正确的方法。如果你不介意,我会很快描述我在架构方面遇到的问题:我喜欢非常短的课程,因为它有助于我保持监督。在实践中,我会为每个页面创建一个小部件,然后为页面的每个 ui 部分创建一个小部件,然后如果它们有很多内容,可能会再次拆分它们。
【解决方案2】:

这是你的问题:

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

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

如您所知,应用状态管理方法是一组技术,可让您作为开发人员:

  • 将数据与小部件绑定

将数据与小部件绑定反过来有助于开发人员:

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

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

您会在此处找到一些非常有用的应用状态管理方法列表,它们可以引导您找到更好的应用开发方式:

【讨论】:

    猜你喜欢
    • 2018-09-01
    • 2020-05-27
    • 1970-01-01
    • 2020-05-20
    • 2020-11-13
    • 2019-06-10
    • 2020-03-10
    • 2019-09-23
    • 2021-09-21
    相关资源
    最近更新 更多