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

StatelessWidget

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

StaefluWidget

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

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



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

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'));
            });
          }
        )
      ],
    );
  }

}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值