推广

Flutter系列四:你真的了解StatelessWidget和StatefulWidget的区别吗?

iseeyu2年前 (2024-02-22)推广119

区别

一些思考

  • 既然StatefulWidget的主要作用只是为了赋予了其自我重新构建(self rebuild)的能力,那为什么需要State呢?

Widget依赖于构造函数和Build方法中的BuildContext中的外部信息,如果是外部触发的Build(例如:祖先Widget build),所有信息都是完整的。如果self rebuild则无法获取更新后的外部信息,所以需要内部维护一份不依赖于外部的信息,State就是这个作用。

  • 既然StatefulWidget的功能更完善,为什么又提供一个StatelessWidget呢?

这个题其实等同于为什么官方要限制我们使用self rebuild?每次Build都需要新建和销毁大量的Widget,Element Tree的diff,甚至繁重的渲染和重绘。官方推荐使用StatelessWidget,其实就是为了性能的考虑而对开发者进行的一些约束,限制开发者无节制的使用self rebuild造成的性能降低。

  • 可不可以在开发中全部都使用StatefulWidget?

当然可以,但是不推荐,理由见上个问题。

  • 可不可以在开发中全部都使用StatelessWidget?

如果是显示简单的不变的内容可以这样使用,但是这种场景太少了。至少在App应用中不太可能。

  • 开发中如何选择StatelessWidget还是StatefulWidget?

首选StatelessWidget,当无法满足需求的时候用VS Code或者Android Stutio的快捷键将其变成StatefulWidget。

实战分享

我们前面比较了StatelessWidget和StatefulWidget的区别,进行了一些分析,到底如何写出更好更优化的代码,现在我们就用Flutter官方的计数器Demo来练练手。

Counter

通过前面的分析,我们知道点击FloatingActionButton会调用_MyHomePageState的setState进行rebuild。如下图所示:

demo_build

细心的你可能发现问题了,我只是想修改Scaffold->Body->Center->Column->第二个Text中的文字。而Build的起点是Scaffold,这么长的构建链条相当于修改一个文字,把整个页面都重新构建了一次。就显然是一个无法忽视的问题。

注意:真实的Build链条不是我上面列的这么短,因为Scaffold等都进行了封装,真实的Build得进入他们的build方法去了解,真实的Build链条比我们代码中看到的Scaffold->Body->Center->Column->第二个Text这个逻辑复杂多了。

修改的思路就是我们只需要在第二个Text上封装一个StatefulWidget,让这个StatefulWidget的setState去触发第二个Text的文字修改。

我们抽提一个CounterText:

class CounterText extends StatefulWidget {

  final _CounterTextState state = _CounterTextState();

  CounterText({
    Key key,
  }) : super(key: key);

  @override
  _CounterTextState createState() => state;
}

class _CounterTextState extends State<CounterText> {

  int _counter = 0;
  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  } 

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text(
        '$_counter',
        style: Theme.of(context).textTheme.headline4,
      ),
    );
  }
}

CounterText的使用:

  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  CounterText counterText = CounterText();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            counterText,
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: counterText.state._incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), 
    );
  }

}

这样就改造完成了。

总结:

我们需要对StatelessWidget和StatefulWidget有一个全面的了解,才能正确的使用他们。欢迎一起探讨和学习。

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/56411.html

相关文章

这档节目刷屏,他们终于藏不住了

“当现代碰撞历史,当国潮遇上非遗,文能曲艺刺绣,武能耍刀弄剑。跨越历史的长河,一览唐朝的盛世。”11月9日,快手和河南卫视联合出品了节目《国潮盛典》,通过多元化的艺术形式,将网剧和网综结合,让国潮文化和科技相碰撞,利用VR和AR等技术为观众呈现了一场视觉盛宴。据了解,该节目...

富人定律:真正的有钱人,有这3种“稀缺”的富人思维,你有吗?

对大多数人来说,人生的梦想莫过于成为富人。成为富人,有了财富的自由,很多想做的事都能完成。不过,有一条富人定律是这样说的:“没有富人,再努力都是穷人。”其实是一门技术活,富人为什么成为富人,因为他们往往有着这3种“稀缺”思维。想要成为富人的你,有这3种思维吗?1、利他思维关...

你选择什么,就会得到什么,六种赚钱方式,你选择了哪种?

文/李果你选择什么,就会得到什么人生是一种选择,更是一种选择,你选择什么,就会得到什么。赚钱方式多种多样,你属于哪一种,你最终的财富就是哪种。一出卖自己的时间,靠时间赚钱,工作时间越久,赚得越多。如:普通上班族、打工仔、服务员。评:风险小,靠勤奋,吃不饱,饿不死,难挣大钱。...

了解seo排名的问题。

了解seo排名的问题。

很多人对seo排名特别感兴趣,因为优化没有行业限制,不少的人都是热衷于网站优化。想要了解seo排名的问题! 第一需要对整体的大环境进行综合的把握。不仅仅是需要各种各样的SEO技术,更是需要长时间的坚持,全国各地各种各样的网站现在饱和度很高,想要在竞争对手网站中脱颖而出都是特别困难! 很多广州网站...

淘宝特价版入驻类目不显示是怎么回事(为什么我的产品在淘宝特价版没有显示)

淘宝特价版入驻类目不显示是怎么回事(为什么我的产品在淘宝特价版没有显示)

淘宝特价版类目不显示,有可能是你的类目不知道淘宝特价版入驻。下面我们一起来看看淘宝特价版联合营销商品准入条件:...

《seo优化》如何做网站长尾词。

《seo优化》如何做网站长尾词。

网站长尾词,很多人都有一个误区,那就是网站长尾词,必须是由网站主关键词所衍生出来的词,才叫长尾词,其实不然,和网站关键词带有相关性的词,也是长尾词,这也就有了网站长尾词的广泛性。 前面讲到过增加长尾词的方法就是通过内容来增加,这个方法一直都比较行得通,当然也有部分人觉得网站的文章其实是给...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片