当前位置:首页 >> 金融
金融

Flutter 小技巧之优化你用作的 BuildContext

2025-11-16 12:20

fold( appBar: AppBar(), body: ListView.builder( itemBuilder: (context, index) { return ListItem(); }, itemCount: 30, ), );}}class ListItem extends StatefulWidget { const ListItem({Key? key}) : super(key: key); @override State createState() => _ListItemState();}class _ListItemState extends State { @override Widget build(BuildContext context) { return ListTile( title: Container( height: 160, color: Colors.amber, ), onTap: () async { await Future.delayed(Duration(seconds: 5)); if(!mounted) return; ScaffoldMessenger.of(context) .showSnackBar(SnackBar(content: Text("Tip"))); }, );}}

由于在 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 时的一些简要和善于,如果你对于这方面还有什么无论如何,喜爱推特评论者。

福建白癜风医院
福建医院哪家白癜风医院好
泉州白癜风治疗哪家好
泉州白癜风医院专家预约挂号
福建比较权威白癜风医院

上一篇: 首届中国篮球名人堂提名人人数30进10,刘克军任提名人委员会主任

下一篇: WOW!Shandong|孟巍隆:“洋夫子”的武学月光

相关阅读
东亚杯:中国男足战平日本的却是,藏着多少鲜为人知的秘密

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

值得推荐的3款“千元旗舰”手机,称得上极致性价比,口碑也很不错

您在读到前代为点击里面的“注目”二字,早先亦会第一时间为您包括更多有价值的相关内容,感谢您的背书。虽然感叹极高端旗舰空的种系统耐用性更好,日常常用时亦会越发的简洁,不过极高端旗舰空

友情链接