zoukankan      html  css  js  c++  java
  • Flutter 的setState与FutureBuilder及EasyRefresh示例

    用setState改变状态

    class CpwsList extends StatefulWidget {
      _CpwsListState createState() => _CpwsListState();
    }
    
    class _CpwsListState extends State<CpwsList> {
      int page = 1; 
      List<Map> hotList = []; 
      GlobalKey<RefreshFooterState> _footerKey = new GlobalKey<RefreshFooterState>(); //定义key
      var scrollController = new ScrollController(); //声明控制器变量
    
      @override
      void initState() { 
        super.initState();
        _getList();
      }
    
      void _getList(){
        var formData = {'page':page, 'isDebug':'aa'};
        request('get', 'cpwsList', formData: formData).then((val){
          var data = val.toString();
          //print(data);
          List<Map>newGoodsList = (val['data']['data'] as List).cast(); 
          print(newGoodsList);
          setState(() {
            hotList.addAll(newGoodsList); 
          });
        });
      }
    
      @override
      Widget build(BuildContext context) {
        
        return Container(
          height: ScreenUtil().setHeight(1000),
          margin: EdgeInsets.only(top:15),
          child: ListView.builder(
            itemCount: hotList.length,
            itemBuilder: (context, index) {
              final Map<String, dynamic> item = (hotList)[index];
              return Container(
                margin: EdgeInsets.fromLTRB(15, 20, 15, 10),
                child: Column(
                  children: <Widget>[
                    Container(
                      alignment: Alignment.centerLeft,
                      child: Text('${item["title"]}',style: TextStyle(fontSize: ScreenUtil().setSp(30)),),
                    ),
                    Container(
                      padding: EdgeInsets.only(top:5),
                      alignment: Alignment.centerLeft,
                      child: Text('${item["caseno"]}'),
                    ),
                    Container(
                      padding: EdgeInsets.only(top:5),
                      alignment: Alignment.centerLeft,
                      child: Row(
                        children: <Widget>[
                          Expanded(
                            child:Text('${item["court"]}',style: TextStyle(fontSize: ScreenUtil().setSp(22),color:Colors.black38)),
                          ),
                          Text('${item["judgedate"]}',style: TextStyle(fontSize: ScreenUtil().setSp(22),color:Colors.black38)),
                        ],
                      ),
                    ),
                  ],
                        
                ),
              );
            }
          )
        );
    
      }
    }

    再添加上拉加载和下拉刷新,代码如下:

    class CpwsList extends StatefulWidget {
      _CpwsListState createState() => _CpwsListState();
    }
    
    class _CpwsListState extends State<CpwsList> {
      int page = 1; 
      List<Map> hotList = []; 
      GlobalKey<RefreshHeaderState> _headerKey = new GlobalKey<RefreshHeaderState>(); //定义key
      GlobalKey<RefreshFooterState> _footerKey = new GlobalKey<RefreshFooterState>(); //定义key
      var scrollController = new ScrollController(); //声明控制器变量
    
      @override
      void initState() { 
        super.initState();
        _getList();
      }
    
      void _getList(){
        var formData = {'page':page, 'isDebug':'aa'};
        request('get', 'cpwsList', formData: formData).then((val){
          var data = val.toString();
          //print(data);
          List<Map>newGoodsList = (val['data']['data'] as List).cast(); 
          print(newGoodsList);
          setState(() {
            hotList.addAll(newGoodsList); 
          });
        });
      }
    
      @override
      Widget build(BuildContext context) {
    
        return Container(
          height: ScreenUtil().setHeight(1000),
          margin: EdgeInsets.only(top:15),
          child: EasyRefresh(
            refreshHeader: ClassicsHeader(//自定义下拉刷新效果
              key:_headerKey,
              bgColor:Colors.white,
              textColor: Colors.blueGrey,
              moreInfoColor: Colors.blueGrey,
              refreshingText: '加载中', //加载时显示的文字
              refreshedText: '刷新成功',
            ),
            refreshFooter:ClassicsFooter( //自定义上拉加载效果
              key:_footerKey,
              bgColor:Colors.white,
              textColor: Colors.blueGrey,
              moreInfoColor: Colors.blueGrey,
              showMore: true,
              noMoreText: '',
              moreInfo: '加载中', //加载时显示的文字
              loadReadyText: '上拉加载...', //准备时显示的文字
            ),
            child: ListView.builder(
            itemCount: hotList.length,
            itemBuilder: (context, index) {
              final Map<String, dynamic> item = (hotList)[index];
              return Container(
                margin: EdgeInsets.fromLTRB(15, 20, 15, 10),
                child: Column(
                  children: <Widget>[
                    Container(
                      alignment: Alignment.centerLeft,
                      child: Text('${item["title"]}',style: TextStyle(fontSize: ScreenUtil().setSp(30)),),
                    ),
                    Container(
                      padding: EdgeInsets.only(top:5),
                      alignment: Alignment.centerLeft,
                      child: Text('${item["caseno"]}'),
                    ),
                    Container(
                      padding: EdgeInsets.only(top:5),
                      alignment: Alignment.centerLeft,
                      child: Row(
                        children: <Widget>[
                          Expanded(
                            child:Text('${item["court"]}',style: TextStyle(fontSize: ScreenUtil().setSp(22),color:Colors.black38)),
                          ),
                          Text('${item["judgedate"]}',style: TextStyle(fontSize: ScreenUtil().setSp(22),color:Colors.black38)),
                        ],
                      ),
                    ),
                  ],
                        
                ),
              );
            }
          ),
          onRefresh: () async {
            await new Future.delayed(const Duration(seconds: 1), () {
              setState(() {
                  hotList.clear();
                  page = 1;
                  _getList();
              });
            });
          },
          loadMore: () async {
            await new Future.delayed(const Duration(seconds: 1), () {
              setState(() {
                  page++;
                  _getList();
              });
            });
          },
    
          )
        );
    
      }
    }

    异步请求再渲染 不用setState改变状态

    class CpwsList extends StatefulWidget {
      _CpwsListState createState() => _CpwsListState();
    }
    
    class _CpwsListState extends State<CpwsList> {
      @override
      Widget build(BuildContext context) {
        var formData = {'isDebug':'aa'};
        return Container(
          height: ScreenUtil().setHeight(1000),
          margin: EdgeInsets.only(top:15),
          child: FutureBuilder( //异步请求再渲染 不用setState改变状态
            future: request('get','cpwsList',formData:formData), //可选参数formData:formData=属性名:属性值
            builder: (context, snapshot){ //snapshot就是_calculation在时间轴上执行过程的状态快照
               if(snapshot.hasData){ //判断有没有值
                  //print(snapshot.data);
    
                  //数据处理
                  var data = snapshot.data;
                  List<Map> cpwsData = (data['data']['data'] as List).cast();
                  //print(chinaData);
    
                  return ListView.builder(
                    itemCount: cpwsData.length,
                    itemBuilder: (context, index) {
                      final Map<String, dynamic> item = (cpwsData)[index];
                      return Container(
                        margin: EdgeInsets.fromLTRB(15, 20, 15, 10),
                        child: Column(
                        children: <Widget>[
                          Container(
                            alignment: Alignment.centerLeft,
                            child: Text('${item["title"]}',style: TextStyle(fontSize: ScreenUtil().setSp(30)),),
                          ),
                          Container(
                            padding: EdgeInsets.only(top:5),
                            alignment: Alignment.centerLeft,
                            child: Text('${item["caseno"]}'),
                          ),
                          Container(
                            padding: EdgeInsets.only(top:5),
                            alignment: Alignment.centerLeft,
                            child: Row(
                              children: <Widget>[
                                Expanded(
                                  child:Text('${item["court"]}',style: TextStyle(fontSize: ScreenUtil().setSp(22),color:Colors.black38)),
                                ),
                                Text('${item["judgedate"]}',style: TextStyle(fontSize: ScreenUtil().setSp(22),color:Colors.black38)),
                              ],
                            ),
                          ),
                        ],
                        
                      ),
                      );
                    }
                  );
    
               }else{
                  return Center(
                    child: Text('加载中...'),
                  );
               }
             }  
          ),
        );
      }
    }

    EasyRefresh + ScrollController 实现下拉刷新和上拉加载

    FutureBuilder 需要结合 Future 使用,先定义一个 Future,异步网络请求。

    ///先定义一个 Future
      Future getDataFuture;
      ...
    
    @override
      void initState() { 
        super.initState();
        getDataFuture = _getList();
      }
    
    //获取数据
    Future _getList() async{
        var formData = {'page':page, 'isDebug':'aa'};
        var response = await request('get', 'cpwsList', formData: formData);
        //print(response);
        List<Map>newGoodsList = (response['data']['data'] as List).cast(); 
        //print(newGoodsList);
        if(newGoodsList != null){
          hotList.addAll(newGoodsList); 
        }
        return hotList;
      }

    通过 ScrollController 可以判断滚动列表是否滚动到底部,如果是,就调用上滑加载的功能获取数据即可。

    var scrollController = new ScrollController(); //声明控制器变量

    添加上拉加载及下拉刷新代码:

    class CpwsList extends StatefulWidget {
      _CpwsListState createState() => _CpwsListState();
    }
    
    class _CpwsListState extends State<CpwsList> {
      Future getDataFuture;
      int page = 1; 
      List<Map> hotList = []; 
      GlobalKey<RefreshHeaderState> _headerKey = new GlobalKey<RefreshHeaderState>(); //定义key
      GlobalKey<RefreshFooterState> _footerKey = new GlobalKey<RefreshFooterState>(); //定义key
      var scrollController = new ScrollController(); //声明控制器变量
    
      @override
      void initState() { 
        super.initState();
        getDataFuture = _getList();
      }
    
      Future _getList() async{
        var formData = {'page':page, 'isDebug':'aa'};
        var response = await request('get', 'cpwsList', formData: formData);
        //print(response);
        List<Map>newGoodsList = (response['data']['data'] as List).cast(); 
        //print(newGoodsList);
        if(newGoodsList != null){
          hotList.addAll(newGoodsList); 
        }
        return hotList;
      }
    
      @override
      Widget build(BuildContext context) {
    
        return Container(
          height: ScreenUtil().setHeight(1000),
          margin: EdgeInsets.only(top:15),
          child: FutureBuilder( //异步请求再渲染 不用setState改变状态
            future: getDataFuture,  
            builder: (context,AsyncSnapshot async){ 
               //print(async.hasData);
               if(async.hasData){ //判断有没有值
                  
                  return EasyRefresh(
                    refreshHeader: ClassicsHeader(//自定义下拉刷新效果
                      key:_headerKey,
                      bgColor:Colors.white,
                      textColor: Colors.blueGrey,
                      moreInfoColor: Colors.blueGrey,
                      refreshingText: '加载中', //加载时显示的文字
                      refreshedText: '刷新成功',
                    ),
                    refreshFooter: ClassicsFooter( //自定义refreshFooter
                      key: _footerKey,
                      bgColor: Colors.white,
                      textColor: Colors.blueGrey,
                      moreInfoColor: Colors.blueGrey,//加载时显示的文字颜色
                      showMore: true,
                      noMoreText: '', 
                      moreInfo: '加载中', //加载时显示的文字
                      loadReadyText: '上拉加载...', //准备文字
                    ),
                    child: ListView.builder(
                      controller: scrollController,
                      itemCount: hotList.length,
                      itemBuilder: (context, index) {
                        final Map<String, dynamic> item = (hotList)[index];
                        return Container(
                          margin: EdgeInsets.fromLTRB(15, 20, 15, 10),
                          child: Column(
                          children: <Widget>[
                            Container(
                              alignment: Alignment.centerLeft,
                              child: Text('${item["title"]}',style: TextStyle(fontSize: ScreenUtil().setSp(30)),),
                            ),
                            Container(
                              padding: EdgeInsets.only(top:5),
                              alignment: Alignment.centerLeft,
                              child: Text('${item["caseno"]}'),
                            ),
                            Container(
                              padding: EdgeInsets.only(top:5),
                              alignment: Alignment.centerLeft,
                              child: Row(
                                children: <Widget>[
                                  Expanded(
                                    child:Text('${item["court"]}',style: TextStyle(fontSize: ScreenUtil().setSp(22),color:Colors.black38)),
                                  ),
                                  Text('${item["judgedate"]}',style: TextStyle(fontSize: ScreenUtil().setSp(22),color:Colors.black38)),
                                ],
                              ),
                            ),
                          ],
                          
                        ),
                        );
                      }
                    ),
                    onRefresh: () async {
                      await new Future.delayed(const Duration(seconds: 1), () {
                        setState(() {
                            hotList.clear();
                            page = 1;
                            getDataFuture = _getList();
                        });
                      });
                    },
                    loadMore: () async {
                      await new Future.delayed(const Duration(seconds: 1), () {
                        setState(() {
                            page++;
                            getDataFuture = _getList();
                        });
                      });
                    },
                  );
    
               }else{
                  return Center(
                    child: Text('加载中...'),
                  );
               }
             }  
          ),
        );
      }
    }

    注意:getDataFuture = _getList(); 

    最后把子项剥离出来,单独写一个Widget,方便InkWell。

    Widget _cpwsitem(Map item, index) {
        return InkWell(
          onTap: () {},
          child: Column(
            children: <Widget>[
              Container(
                alignment: Alignment.centerLeft,
                child: Text(
                  '${item["title"]}',
                  style: TextStyle(fontSize: ScreenUtil().setSp(30)),
                ),
              ),
              Container(
                padding: EdgeInsets.only(top: 5),
                alignment: Alignment.centerLeft,
                child: Text('${item["caseno"]}'),
              ),
              Container(
                padding: EdgeInsets.only(top: 5),
                alignment: Alignment.centerLeft,
                child: Row(
                  children: <Widget>[
                    Expanded(
                      child: Text(
                        '${item["court"]}',
                        style: TextStyle(fontSize: ScreenUtil().setSp(22), color: Colors.black38)
                      ),
                    ),
                    Text(
                      '${item["judgedate"]}',
                      style: TextStyle(fontSize: ScreenUtil().setSp(22), color: Colors.black38)
                    ),
                  ],
                ),
              ),
            ],
          ),
        );
      }

    然后把上面Container的child改为:

    child: _cpwsitem(item, index)
  • 相关阅读:
    Ubuntu在下面LAMP(Linux+Apache+MySQL+PHP) 开发环境的搭建
    直接插入排序、折半插入排序、Shell排序、冒泡排序,选择排序
    java插入字符串
    bash,bg,bind,break,builtin,caller,compgen, complete,compopt,continue,declare,dirs,disown,enable,eval,exec,expo
    socket用法
    org.jsoup.select.Selector
    达达技术
    CentOS 6.4 文件夹打开方式
    shell加法
    shell统计
  • 原文地址:https://www.cnblogs.com/joe235/p/11652784.html
Copyright © 2011-2022 走看看