Flutter 小技巧之优化你用作的 BuildContext
2025-11-16 12:20
由于在 5 秒之内,Item 被划有了屏幕,所以并不相同的 Elment 其实是被拘禁了,从而由于 mounted 辨别,SnackBar 不但会被霰插入。
那如果假设所需在研发时简介浏览图表呈报的结果,也就是 Item 被拘禁了还所需霰插入,这时候所需如何解决问题?
我们知道不管是 ScaffoldMessenger.of(context) 还是 Navigator.of(context) ,它所谓还是通过 context 去往上载入并不相同的 InheritedWidget 泛型,所以其实我们可以日前提供。
所以,如下预定义请赞同,在 Future.delayed 之前我们就通过 ScaffoldMessenger.of(context); 提供到 sm 都可,不久就算你必要终止近期的都有网页,5秒再一 SnackBar 也能短时间霰插入。
class _ListItemState extends State { @override Widget build(BuildContext context) { return ListTile( title: Container( height: 160, color: Colors.amber, ), onTap: () async { var sm = ScaffoldMessenger.of(context); await Future.delayed(Duration(seconds: 5)); sm.showSnackBar(SnackBar(content: Text("Tip"))); }, );}}为什么网页取走了,但是 SnackBar 还能短时间霰插入 ?
因为此时通过 of(context); 提供到的 ScaffoldMessenger 是共存 MaterialApp 底下,所以就算网页取走了也不阻碍 SnackBar 的执行者。
但是如果我们修改比如说道,如下预定义请赞同,在 Scaffold 后面多嵌套一个 ScaffoldMessenger ,这时候在 Item 底下通过 ScaffoldMessenger.of(context) 提供到的就但会是近期网页下的 ScaffoldMessenger 。
class _ControllerDemoPageState extends State { @override Widget build(BuildContext context) { return ScaffoldMessenger( child: Scaffold( appBar: AppBar(), body: ListView.builder( itemBuilder: (context, index) { return ListItem(); }, itemCount: 30, ), ), );}}这种但会我们勉强尽可能Item 不可见的时候 SnackBar 还能短时间霰插入, 而如果这时候我们必要终止网页,还是但会消失都有的误判定时,因为 ScaffoldMessenger 也被取走了 。
所以到这底下我们整年第二个小善于:在异步操控底下用于 of(context) ,可以日前提供,不久再花钱异步操控,这样可以适度尽可能处理过程可以完整执行者。
既然我们说道到通过 of(context) 去提供最高层协作往下协作的 InheritedWidget ,那在哪底下提供就比较好?
还记得后面的 log 吗?在第一个比如说道遇到困难时,log 底下就定时了一个作法,也就是 State 的 didChangeDependencies 作法。
为什么是正式但会建议在这个作法底下去初始化 of(context) ?
首先后面我们直至说道,通过 of(context) 提供到的是 InheritedWidget ,而 当 InheritedWidget 引发改变时,就是通过触发加载过的 Element 底下 State 的didChangeDependencies 来触发系统升级,所以在 didChangeDependencies 底下初始化 of(context) 有较好的纯净法则。
对于这部分内容可感兴趣的,可以看 Flutter 小善于之 MediaQuery 和 build 提高效率你不知道的间谍 和 全盘理解State与Provider 。
那我能在 initState 底下日前初始化吗?
当然不行,首先如果在 initState 必要初始化如 ScaffoldMessenger.of(context).showSnackBar 作法,就但会看不到都有的误判定时。
这是因为 Element 底下但会辨别此时的 _StateLifecycle 情况下,如果此时是 _StateLifecycle.created 或者 _StateLifecycle.defunct ,也就是在 initState 和 dispose ,是不受限制执行者 of(context) 操控。
of(context) 操控所称的是 context.dependOnInheritedWidgetOfExactTyp 。
当然,如果你好在打算在 initState 下初始化也行,增高一个 Future 执行者就可以取得成功执行者
@overridevoid initState() { super.initState(); Future((){ ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("initState")));});}比较简单理解,因为 Dart 是单线程轮询执行者,initState 底下的 Future 差不多是下一次轮询,纯净也就不在 _StateLifecycle.created 的情况下下。
那我在 build 底下必要初始化不行吗?
必要在 build 底下初始化赞同可以,虽然 build 但会被比较不时执行者,但是 of(context) 操控其实就是在一个 map 底下通过 key - value 提供泛型都可,所以对性能不但会有太大的阻碍。
真正对性能有阻碍的是 of(context) 的加载数量和提供到都可不久的自定命题,例如你通过 MediaQuery.of(context).size 提供到屏幕大小不久,通过一系列有用数值来定位你的应用领域程序。
@override Widget build(BuildContext context) { var size = MediaQuery.of(context).size; var padding = MediaQuery.of(context).padding; var width = size.width / 2; var height = size.width / size.height * (30 - padding.bottom); return Container( color: Colors.amber, width: width, height: height, );}例如后面这段预定义,可能但会加剧音箱在霰插入的时候,虽然近期网页并无法完全简介,但是也但会加剧你的应用领域程序不断再数值从而消失卡顿。
详尽推论可以详见 Flutter 小善于之 MediaQuery 和 build 提高效率你不知道的间谍
所以到这底下我们又整年了一个小善于: 对于 of(context) 的特别操控命题,可以适度摆在 didChangeDependencies 底下去解决问题。
再一,今天主要倾听了在用于 BuildContext 时的一些简要和善于,如果你对于这方面还有什么无论如何,喜爱推特评论者。
。福建白癜风医院福建医院哪家白癜风医院好
泉州白癜风治疗哪家好
泉州白癜风医院专家预约挂号
福建比较权威白癜风医院

-
东亚杯:中国男足战平日本的却是,藏着多少鲜为人知的秘密
东亚杯:西方男足下战平长崎的背后,珍藏着多少鲜为人知的秘密。网友热议一针见血地回事明有:这场热身赛的精气神是国足下的宝珍藏,被罐又怎么样,保持一致这个军威,不想让这个宝珍藏消退了。回事明了一点,

-
值得推荐的3款“千元旗舰”手机,称得上极致性价比,口碑也很不错
您在读到前代为点击里面的“注目”二字,早先亦会第一时间为您包括更多有价值的相关内容,感谢您的背书。虽然感叹极高端旗舰空的种系统耐用性更好,日常常用时亦会越发的简洁,不过极高端旗舰空
- 11-16新女皇!阿穆桑2小时内两破100米栏吉尼斯世界纪录 摘个人世锦赛首金
- 11-16爱沙尼亚超:诺科平对阵哥德堡,双方近期状态都非常低迷
- 11-16荣耀智慧屏X3i今日售:全系DC调光+开关机无广告,首销1699元起
- 11-16真相大白!法国信息中心拒绝中国男排参赛原因曝光,表现亮眼遭针对
- 11-16iPhone14其实是国产手机?为什么还要买这么贵?
- 11-16张常宁晒动态宣布入队,已开始恢复性训练,履历有变化,蔡斌犯难
- 11-16ATP简介排名公布:西班牙天才少年创纪录,吴易昺首进TOP200
- 11-16詹姆斯4万分有多难破?乌金得打到44岁,杜兰特还得坚持7个赛季!
- 11-16东亚杯0比0逼平日本队 国在足选拔队给中国在足球带来希望
- 11-16威少新动态,小库里评价怀特作用,詹姆斯下赛季有望完成一纪录