在运行时更改主题需要 StatefulWidget,但这不是贵得离谱吗?

Changing theme in runtime requires StatefulWidget, but isn't that ridiculously expensive?

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

据我了解,当遇到一些变化时,这两种解决方案都会继续重绘 MaterialApp 下面的整个小部件树(无论是 StatefulWidget 的状态变化还是我提供给消费者的任何 ChangeNotifier 的变化) .

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

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

提前致谢!

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

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