美文网首页
《你还在滥用StatefulWidget吗》的实践

《你还在滥用StatefulWidget吗》的实践

作者: 小吉快跑呀 | 来源:发表于2019-07-11 09:48 被阅读0次

"我的"TabBar的实现中,Tab是父widget,TabItem是子widget,在原来的实现中,Tab是StatefulWidget,TabItem是StatelessWidget。

然后看到了一篇文章:
[链接] https://lizhaoxuan.github.io/2019/01/02/Flutter-你还在滥用StatefulWidget吗

文章给了我一个优化的方向,StatefulWidget尽量出现在widget tree的叶子节点,这样能使state变化带来的影响降到最小,因为StatefulWiget状态改变会导致子widget都重建,滥用的话不仅会导致对象冗余创建,也有可能会导致卡顿。

反观Tabar原来的实现,可以用下图表示,Root是StatefulWidget,Leaf是StatelessWidget,这样导致的问题是,每次选中一个tab,改变的都是Root中的state,然后导致整个widget tree都要重建,但实际上选中tab只有两个tab会发生变化,其他tab的重建是多余的,不过这里的tree很小,卡顿什么的一般不存在。

image

基于上面的观点,我把原来的结构反过来,Root变成StatelessWidget,Leaf为StatelessWidget,但是这样有存在另一个问题,在上一份日报有写过,就是tab之间的状态是互斥的,需要父widget来保持互斥,所以在Leaf管理state不太可能,我的做法是把state交给Root去控制:

//Leaf
class MineTabItemState extends State<StatefulWidget> {
...
 bool _selected = false;
 //控制状态
 void setSelected(bool selected) => setState(() {
       _selected = selected;
    });
...
}
​
//Root
class MineTab extends StatelessWidget {
...
 void setSelected(MineTabItem tab) {
  ...
   //父widget控制state
   if (selected != -1) tabs[selected].state.setSelected(false);
   tabs[index].state.setSelected(true);
  ...
}
...
}

修改前每次点击tab,全部重建:


image.png

修改后只重建两个:


image.png

TabBar的widget tree都很小,优不优化区别也不明显,为了实践我强行优化了一下。

相关文章

  • 《你还在滥用StatefulWidget吗》的实践

    "我的"TabBar的实现中,Tab是父widget,TabItem是子widget,在原来的实现中,Tab是St...

  • 你还在滥用“药茶”吗?

    中药饮片属于药品,而药品是关系到人体健康和生命安危的特殊商品,其服用必须合理、科学。尽管与西药相比,中药副作用相对...

  • 你还在滥用抗生素吗?

    抗生素的滥用是一个世界性的问题,通俗的说法就是:“消炎药”。我国的问题尤为严重,原因是多方面的。抗生素的滥用导致细...

  • 益生菌将替代抗生素,对孩子是一种救赎

    你还在滥用抗生素吗?了解过国外文化的人一定知道,在外国买抗生素比买枪都难,但是中国对抗生素的滥用程度已经严重超标,...

  • 妇科消炎,抗生素你还在滥用吗?

    抗生素是我们最熟悉,也是最容易被“滥用”的药物。然而说到“滥用”,很多人其实并不清楚其中的含义。实际上,凡是超时、...

  • 新贵 Flutter StatefulWidget(8)

    会介绍 StatefulWidget 与 StatelessWidget 的不同以及 StatefulWidget...

  • Flutter生命周期

    StatefulWidget的生命周期 StatelessWidget的生命周期 同StatefulWidget更...

  • 飞鸟,起飞吗?

    飞鸟,起飞吗? 你还在悲伤你折断的翅膀吗? 飞鸟,起飞吗? 你还在惧怕独翼翱翔的蓝天吗? 飞鸟,起飞吗? 你还在黑...

  • 进步有什么好?

    每次看到抖音里的广告说“你还在用传统的抹布吗?”“你还在用以前的拖把吗?”“你还在用钢丝球吗”“你还在用老衣架吗”...

  • 父亲节,“父亲”的嘱咐

    你要走的这条路,是一条不断“降卑”的路!你还在恐惧吗?你还在不安吗?你还在忧虑吗?你还在为衣食住行驻足不前吗?你还...

网友评论

      本文标题:《你还在滥用StatefulWidget吗》的实践

      本文链接:https://www.haomeiwen.com/subject/scxrkctx.html