【问题标题】:Changing theme in runtime requires StatefulWidget, but isn't that ridiculously expensive?在运行时更改主题需要 StatefulWidget,但这不是非常昂贵吗?
【发布时间】:2021-07-08 15:28:33
【问题描述】:

我最近在 Flutter 中完成了一个小型项目,当我尝试在运行时实现主题更改时,我遇到的大多数答案都涉及将我的 MaterialApp(具有主题)置于 StatefulWidget 或 Consumer 之下一些。

据我了解,当遇到某些更改(StatefulWidget 的状态更改或我提供给 Consumer 的任何 ChangeNotifier 的更改)时,这两种解决方案都会继续重绘 MaterialApp 下方的整个小部件树。

所以我的主要问题是:这不是非常昂贵且不推荐吗?我的整个应用小部件树是否正在重绘(假设大部分都在 MaterialApp 下方)?

其次:为什么不调用 MaterialApp 树深处的一些我自己的小部件的构建方法?这意味着文档所暗示的昂贵的重建实际上并没有完成。什么给了?

提前致谢!

【问题讨论】:

  • 不确定如何在不重建整个应用程序的情况下更改应用程序的整个配色方案。昂贵与否,它在几毫秒内发生,就用户而言立即发生。它不会影响用户体验,因为它不会在他们使用应用程序的任何事情时持续发生。

标签: performance flutter dart flutter-widget


【解决方案1】:

据我了解,如果您将 MaterialApp 包装在一个 Consumer 中,该 Consumer 引用一个仅在主题更改时才发出值的提供者,那么这并不是非常低效。是的,它会在您更改主题时重绘应用程序,但是它不会在每次状态更改时重绘您的应用程序,只会重绘该值的更改。如果您有一个经常使用 notifyListeners 的 Provider,那么您可以使用 Selector 小部件只关注您的一个主题值。

但是,当用户更改主题时重绘您的应用程序不会很昂贵,而且会很快完成。在主题更改时无法重绘您的应用程序。如果您担心,可以使用 Profiler 工具对此进行测试,但您会发现主题更改几乎没有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 2010-10-28
    • 2014-02-05
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    相关资源
    最近更新 更多