flutter - Flutter 中的 Widget 生命周期是如何工作的?
问题描述
为了优化 Flutter App 的性能,重要的是只在实际需要重建 Widget 时才重建它们。在使用const Widgets、TransitionBuilder 模式、Keys和覆盖 == 运算符之间,似乎有不同的方法来减少 Widget 重建,但我不知道如何交互。
官方文档建议在构建方法中做尽可能少的工作。这与在 Widget 的构造函数中完成的工作相比如何?构造函数的调用频率是否与构建函数一样频繁,多于还是少于它?如果我有一个有状态的小部件,我可以通过在状态中而不是在构造函数或构建方法中缓存一些数据来提高性能吗?
在 Reddit 上有一个关于使用函数与无状态小部件的讨论,其中一些人认为无状态小部件导致重建较少,而另一些人则认为没有区别。我想充分了解 Flutter 的 Widget Lifecycle 以了解在特定情况下两者之间是否存在差异。
我正在寻找有关这些不同机制如何交互以就如何减少我的应用程序中不必要的 Widget 构建做出正确决策的解释。
解决方案
而是我从开发人员自己那里得到了一个很好的解释,这是一个解释小部件生命周期的短片
2019年Google Developer Days China做了更详细的解释
如果您谈论性能,那么功能方法会更好。考虑一下:
class TestWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final streamController = StreamController<String>.broadcast();
Future.delayed(Duration(seconds: 3)).then((_) {
streamController.sink.add('new value to received');
streamController.close();
});
return StreamBuilder(
stream: streamController.stream,
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
final newVal = snapshot.data;
return Text(newVal ?? 'this is initial value');
},
);
}
}
在函数式方法中,状态不是由小部件而是由 保存的streamController
,并且TestWidget
的 build 方法只调用一次,并且builder
每次在stream
.
我发现这种方法开发起来也是最灵活的,因为您可以在一个地方拥有多个流,并且作为一个木偶操作者来控制它们。
==== 一个小切线 ============================================ ==========
我建议你研究一下这种BLoC
模式。
根据我的经验,如果你狂热地遵循一种方法而不是另一种方法,你最终可能会“伤害自己”,所以我建议不要害怕同时使用这两种方法,具体取决于用例。
例如,如果你有一个按钮,里面有一个递增的 int 值(就像一个徽章),当你点击它时它会递增。将值发送到BLoC
并将其保存在那里,然后通过流发送回事件以更新 UI 是多余的,这就是我将使用StatefulWidget
.
推荐阅读
- azure - 创建将内容上传到 Web 服务的 Microsoft Teams 上传机器人的最佳方法是什么?
- go - 如何使用 GoLang 使用 Google PubSub opencensus 指标?
- java - 使用实体图从主表和子表中获取数据的 JPA 标准查询
- spring-boot - 如何在spring boot中请求完整的url(非默认)并打印响应
- javascript - 如何通过 JavaScript 添加 Django 表单字段?
- google-sheets - 谷歌表格图表/柱形图中的多行标签
- json - Angular Unexpected token c in JSON at JSON.parse 的位置 0 时需要一个字符串
- jquery - 当多个条目具有相同名称时绘制 sankey
- javascript - Firebase 电子邮件身份验证标记为危险
- php - 使用 fmod() 查找 2 个浮点数之间的提醒