• StatefulWidget 有状态组件


    在 Flutter 中自定义组件其实就是一个类,这个类需要继承 StatelessWidget/StatefulWidget:
    • StatelessWidget 是无状态组件,状态不可变的 widget
    • StatefulWidget 是有状态组件,持有的状态可能在 widget 生命周期改变。通俗的讲:如果我们想改变页面中的数据的话这个时候就需要用到 StatefulWidget 

    StatelessWidget中实现数据变化

    在使用StatefulWidget前,先看一下在StatelessWidget中,点击按钮,改变数据后的效果:
    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {  
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home:Scaffold(
            appBar: AppBar(
              title: Text('Flutter Demo')
            ),
            body: HomePage(),
          )
        );
      }
    }
    
    class HomePage extends StatelessWidget {
      int countNum=1; 
      @override
      Widget build(BuildContext context) {
        return Column(
          children: <Widget>[
            SizedBox(height: 200),
            Text("${this.countNum}"),
            SizedBox(height: 20),
            RaisedButton(
              child: Text("按钮"),
              onPressed: (){
                  this.countNum++;
                print(this.countNum);
              },
            )
          ],
        );
      }
    }

      

     此时,当点击按钮,改变countNum的值时,发现控制台里面的打印中,数值是变化的,但是页面中却没有变化效果,此时就需要使用StatefulWidget了。

    StatefulWidget中改变数据

    StatefulWidget是一个抽象类,在这个类中,有一个抽象方法createState(),然后在这个抽象方法中调用自定义的_HomePageState()类,_HomePageState()类需要继承State类,最后在这个类中实现build()方法。

    class HomePage extends StatefulWidget {
      HomePage({Key key}) : super(key: key);
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
      int countNum=0;
      @override
      Widget build(BuildContext context) {
        return Column(
          children: <Widget>[
            SizedBox(height: 200),
            Chip(
              label:Text('${this.countNum}') ,
            ),
            SizedBox(height: 20),
            RaisedButton(
              child: Text('按钮'),
              onPressed: (){
                 setState(() {   //只有有状态组件里面才有
                      this.countNum++;
                 });
              },
            )
          ],
        );
      }
    }

     

    添加数据

    class HomePage extends StatefulWidget {
      HomePage({Key key}) : super(key: key);
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
    
      List list=new List();
      @override
      Widget build(BuildContext context) {
        return ListView(
    
          children: <Widget>[
            Column(
              children: this.list.map((value){
                return ListTile(
                  title: Text(value),
                );
              }).toList()
            ),
            SizedBox(height: 20),
            RaisedButton(
              child: Text("按钮"),
              onPressed: (){
                setState(() {
                    this.list.add('新增数据1');
                    this.list.add('新增数据2');
                });
              },
            )
          ],
        );
      }
    }

        

  • 相关阅读:
    闯荡Linux帝国:nginx的创业故事
    一个HTTP数据包的奇幻之旅
    远去的传说:安全软件群雄混战史
    默认浏览器争霸传奇
    浏览器主页锁定之战——IE:我太难了
    产品vs程序员:你知道www是怎么来的吗?
    手把手教你从零开始搭建SpringBoot后端项目框架
    使用IntelliJ IDEA新建Java Web后端resfulAPI模板
    如何正确的在项目中接入微信JS-SDK
    html2canvas关于图片不能正常截取
  • 原文地址:https://www.cnblogs.com/yuyujuan/p/11000310.html
Copyright © 2020-2023  润新知