栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在initState或类构造函数中定义小部件,而不是在构建?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在initState或类构造函数中定义小部件,而不是在构建?

这是合法的优化。实际上,您甚至可以对与状态相关的小部件(与结合使用

didUpdateWidget
)执行相同的操作。胜利是微不足道的。

小部件非常轻巧,Dart已针对许多微实例进行了优化。

这种方法有一个问题:您松开热装。


重用旧的窗口小部件实例仍然非常有用。仿佛小部件实例不变,Flutter中止了子树的构建。

这在动画中经常使用,而 不是
每帧都重建整个窗口小部件树。一个典型的例子是

AnimatedBuilder
(但全部
XXTransition
遵循相同的逻辑)

Animation animation;AnimatedBuilder(  animation: animation,  child: Text('Foo'),  builder: (context, child) {    return Align(      alignment: Alignment(.5, animation.value),      child: child,    );  },);

在这里,这会自愿重用

child
实例,以免
Text
再次调用build方法。


那么,我应该这样做吗?

好,是的,不是。优化您的应用程序总是很酷的。但是除了使用变量之外,还有一种更好的方法:const构造函数。

要重用您的示例,您可以将“总是相同的”小部件树提取到带有const构造函数的自定义小部件中:

class _Foo extends StatelessWidget {  const _Foo({Key key}): super(key: key);  @override  Widget build(BuildContext context) {    return Text(      'Oeschinen Lake Campground',      style: TextStyle(        fontWeight: FontWeight.bold,      ),    );  }}

然后在您的

build
方法中以这种方式使用它:

@overrideWidget build(BuildContext context) {  return Container(    padding: const EdgeInsets.only(bottom: 8.0),    child: const _Foo(),  );}

这样,您可以获得缓存小部件实例的好处。但是您不要松开热装。

完美吧?



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/449419.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号