前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >10.Flutter学习之StatefulWidget有状态组件、页面绑定数据、改变数据

10.Flutter学习之StatefulWidget有状态组件、页面绑定数据、改变数据

作者头像
易帜
发布2022-02-09 15:59:56
8300
发布2022-02-09 15:59:56
举报
文章被收录于专栏:易帜的Android 学习之旅

StatelessWidget

StatelessWidget:无状态的widget,适用于我们描述用户界面不依赖对象中的配置信息时。例如:使用ImaegView/UIImageView来显示Logo,Logo在运行时不会改变,所以可以使用StatelessWidget

StaefluWidget

如果遇到HTTP网络请求或者用户交互接受数据后动态更改UI,则必须使用StatefluWidget并告诉Flutter框架Widget的状态已经更新。

让我们用代码来比较一下有状态与无状态的区别吧!

代码语言:javascript
复制
main()=>runApp(MyApp());

class MyApp extends StatelessWidget{

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('有状态与无状态对比'),
        ),
        body: HomePager(),
      ),
    );
  }

}

class HomePager extends StatelessWidget {
    int i=0;
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text('$i'),
          RaisedButton(
            child: Text('点击增加次数'),
            onPressed: (){
              this.i++;
              print('${i}');
            },
          ),
        ],
      ),
    );
  }
}

当我们点击按钮是,你会发现Text的文本并没有发生改变。

在这里插入图片描述
在这里插入图片描述

我们看一下日志,看看数值到底有没有发生改变。

在这里插入图片描述
在这里插入图片描述

我们可以清楚的看到,数据改变了,但是无法改变页面的数据。 接下来我们看一下有状态的是否能够发生改变 。

StatefulWidget

代码语言:javascript
复制
main()=>runApp(MyApp());

class MyApp extends StatelessWidget{

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('有状态与无状态对比'),
        ),
        body: HomePager(),
      ),
    );
  }

}

//有状态组件。必须继承自StatefulWidget,
class HomePager extends StatefulWidget {

  @override
  State<StatefulWidget> createState() {
    return _HomePagerWidget();
  }

}

class _HomePagerWidget extends State<HomePager> {
  int count=0;
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Chip(//一个标签的控件
              label:Text( '${count}')
             ),
          RaisedButton(//Button
            child: Text('点击进行数据+1'),
            onPressed: (){    //Button的点击事件
              setState(() {//是StatelessWidget所没有的方法,用于更新页面状态
                this.count++;
              });
            },
          ),
        ],
      ),
    );
  }

}
``
从图中我们可以看到页面数据发生了改变。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020022917594591.gif#pic_center)
### demo
我们进行点击一个button,然后我们的`ListView`条目进行增加
```dart
main()=>runApp(MyApp());

class MyApp extends StatelessWidget{

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('有状态与无状态对比'),
        ),
        body: HomePager(),
      ),
    );
  }

}

//有状态组件。必须继承自StatefulWidget,
class HomePager extends StatefulWidget {

  @override
  State<StatefulWidget> createState() {
    return _HomePagerWidget();
  }

}

class _HomePagerWidget extends State<HomePager> {
  List list=new List();

  @override
  Widget build(BuildContext context) {
    return ListView(
      children: <Widget>[
        Column(
          children: this.list.map((value){
            return ListTile(
              title: value,
            );
          }).toList(),
        ),
        SizedBox(
          height: 10,
        ),
        RaisedButton(
          child: Text('点击进行条目+1'),
          onPressed: (){
            setState(() {
              list.add(Text('新增数据1'));
              list.add(Text('新增数据2'));
            });
          }
        )
      ],
    );
  }

}
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • StatefulWidget
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档