首页 > 解决方案 > 在运行时更改主题需要 StatefulWidget,但这不是非常昂贵吗?

问题描述

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

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

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

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

提前致谢!

标签: performanceflutterdartflutter-widget

解决方案


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

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


推荐阅读