【问题标题】:In Flutter does avoiding setState() achieve anything?在 Flutter 中,避免 setState() 有什么用吗?
【发布时间】:2019-12-29 19:14:20
【问题描述】:

在 Flutter 中避免 setState() 有什么用吗?

我有一个 StatefulWidget(屏幕),我在其中使用 Widget 来完全处理自己的状态,FAB 按钮除外。数据更改时禁用或启用 Fab 按钮,以便在数据更改时更新数据库。我在 SO 上发布了一个关于如何使用 Provider 来处理它的问题,从而避免了 setState() 的需要,并使用 Provider 实现了它。

当查看另一个屏幕来实现类似的东西时,我想知道另一种解决方案是否会更好。这个屏幕还包含所有处理自己状态的小部件 - 带有 TextEditControllers 的 TextFields,所以我调用 setState() 的唯一地方是启用或禁用 FAB。我之前创建了一个有状态的小部件来创建一个具有自己状态的 CheckBox,因为标准 CheckBox 没有状态。它相当简单,只有 50 行代码。所以,我对 FAB 做了同样的事情,我创建了一个封装 FAB 的 Stateful Widget (CustomFab)。当需要启用或禁用它时,会调用它来设置自己的状态,并返回一个 FAB,该 FAB 使用适当的颜色启用或禁用。因为我还有其他类似的屏幕,所以我可以使用相同的组件。

在这种情况下(对于移动设备和 Web),它是否通过避免 setState() 来实现任何目标,如果是,那么处理该问题的最佳方法是什么(Custom-Widget 或 Provider 或其他)?

【问题讨论】:

  • 根据频率,如果widget是要使用的频率,则做一个Custom-Widget,如果不是另一种选择(Bloc,StreamController,Provider...等)。 setState 可以用在低复杂度的页面中,这也让我意识到这个页面很简单,放松一下。但这些都是基于我的意见,所以我只是发表评论而不是回答。

标签: flutter state flutter-layout


【解决方案1】:

setState 在 Flutter 开发中被避免主要有两个原因:

  • 它会重建整个小部件,如果使用不当,可能会影响连续调用的性能。

  • 使用setState作为状态管理将业务逻辑耦合到 UI,这可能会降低代码的可重用性和可维护性。

在简单的应用程序中,使用setState 不会出现重大问题。但是,如果您需要对代码进行更多控制,我建议您使用更复杂的状态管理模式。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2018-12-19
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多