performance - 在运行时更改主题需要 StatefulWidget,但这不是非常昂贵吗?
问题描述
我最近在 Flutter 中完成了一个小型项目,当我尝试在运行时实现主题更改时,我遇到的大多数答案都涉及将我的 MaterialApp(具有主题)置于 StatefulWidget 或某种 Consumer<> 之下。
据我了解,当遇到某些更改(StatefulWidget 的状态更改或我提供给消费者的任何 ChangeNotifier 的更改)时,这两种解决方案都会继续重绘 MaterialApp 下方的整个小部件树。
所以我的主要问题是:那不是很贵而且不推荐吗?我的整个应用程序小部件树是否正在重绘(假设大部分都在 MaterialApp 下方)?
其次:为什么不调用 MaterialApp 树深处的一些我自己的小部件的构建方法?这意味着文档所暗示的昂贵的重建实际上并没有完成。是什么赋予了?
提前致谢!
解决方案
据我了解,如果您将您包装MaterialApp
在一个引用提供者的消费者中,该提供者仅在您的主题更改时发出一个值,那么这并不是非常低效。是的,当您更改主题时它会重绘应用程序,但是它不会在每次状态更改时重绘您的应用程序,只会重绘该值的更改。如果您有notifyListeners
很多提供者,那么您可以使用Selector
小部件仅关注主题的一个值。
但是,当用户更改主题时重绘您的应用程序不会很昂贵,而且会很快完成。在主题更改时无法重绘您的应用程序。如果您担心,您可以使用 Profiler 工具对此进行测试,但您会发现主题更改几乎没有问题。
推荐阅读
- c++ - C ++中的贪心算法最小搜索?
- loopbackjs - 远程方法递归调用自身时,回调不是函数
- jmeter - 使用 IF 控制器和全局变量的 JMETER 4.0
- git - Git stash 正在取消删除已删除的文件并将其添加到未跟踪的文件中
- cordova - 安装 mfp-plugin 时,android 应用程序未在发布模式下打开
- crm - 更新产品价格
- jenkins - 尝试发送测试配置电子邮件但无法发送电子邮件
- java - 在混合 Scala 和 Java Spark 项目中使用 Java 类类型的自定义 Accumulator Spark 错误
- laravel - 复制更多表 Laravel
- android - 如何在 WifiDirect 中设置用户设备名称?有什么方法可以在不建立连接的情况下使用 WiFiDirect 广播自定义字符串?