美文网首页FlutterFlutter中文社区
flutter listview 加头加尾及刷新问题解决

flutter listview 加头加尾及刷新问题解决

作者: jhxlx | 来源:发表于2020-01-14 15:59 被阅读0次

flutter中listview我没有发现专门的方法去加头加尾,那就动手去实现吧;首先还是看效果


view4.gif

效果就是这样了,那接下来看下代码,首先贴上完整代码

class ListPage extends StatefulWidget  {

  List<Widget> listHeader,listBottom;
  int dataLength;

  final itemBuild;


  ListPage({this.listHeader, this.listBottom, this.dataLength, this.itemBuild});

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

class _ListPageState extends State<ListPage> {


  @override
  Widget build(BuildContext context) {
    return ListView.builder(itemCount:_itemCount(),itemBuilder: (context,index){
     if (index<_getHeaderCount()) {
         return Column(children: <Widget>[
           widget.listHeader[index]
         ] ,);
     }else if(index>=widget.dataLength+_getHeaderCount()){
       return Column(children: <Widget>[
         widget.listBottom[index-_getHeaderCount()-widget.dataLength]
       ],);
     }else{
       return widget.itemBuild(context,index-_getHeaderCount());
     }
      });
  }

  int _getHeaderCount(){
    return widget.listHeader!=null?widget.listHeader.length:0;
  }

  int _getBottomCount(){
    return widget.listBottom!=null?widget.listBottom.length:0;
  }

  int _itemCount(){
    return widget.dataLength+_getHeaderCount()+_getBottomCount();
  }
}

然后看下使用部分的完整代码

class ListHeaderBottomDemo extends StatefulWidget {
  @override
  _ListHeaderBottomDemoState createState() => _ListHeaderBottomDemoState();
}

class _ListHeaderBottomDemoState extends State<ListHeaderBottomDemo> {

  List<String> listData=[];

  List<Widget> listHeader=[];

  List<Widget> listFooter=[];

  bool isAddHeader=true,isAddFooter=true;

  @override
  void initState(){
    super.initState();
    listData.addAll(getList());
    listHeader=getHeaderList();
    listFooter=List.generate(1, (index){
      return Text("尾部 $index");
    });
  }

  List<String> getList(){
    return List.generate(3, (index){
      return "我是第$index项";
    });
  }

  List<Widget> getHeaderList(){
    return List.generate(1, (index){
      return Text("头部 ",style: TextStyle(color: Colors.red),);
    });
  }

  List<Widget> getFooterList(){
    return List.generate(1, (index){
      return Text("尾部 ",style: TextStyle(color: Colors.red),);
    });
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(appBar: AppBar(title: Text("list加头加尾"),centerTitle: true ,elevation:0),
        body:Column(children: <Widget>[
          GestureDetector(child: Container(color: Colors.red,height:40,width:double.infinity,child: Text("加头",style: TextStyle(color: Colors.white),),),onTap: (){
            listHeader.addAll(getHeaderList());
            setState(() {

            });
          },)  ,
          GestureDetector(child: Container(color: Colors.blue,height:40,width:double.infinity,child: Text("加尾",style: TextStyle(color: Colors.white),),),onTap: (){
            listFooter.addAll(getFooterList());
            setState(() {

            });

          },),
          Expanded(flex:1,child:ListPage(listHeader:listHeader,
            listBottom: listFooter,
            itemBuild: (context,index){
              return Text(listData[index]);
            },dataLength: listData.length,))
        ],));
  }
}

重点就在这段

 Expanded(flex:1,child:ListPage(listHeader:listHeader,
            listBottom: listFooter,
            itemBuild: (context,index){
              return Text(listData[index]);
            },dataLength: listData.length,))

就在我以为事情做完了之后,却发现个问题,在使用pull_to_refresh这个库去做刷新的时候去发现下拉不能使用,去查看了一下发现pull_to_refresh的文档有介绍


微信截图_20200114154401.png

问题是发现了,但该怎么解决呢,本着事情越简单越好的原则,我的想法是把刷新也放在listPage这个控件中去做 先看看更改后的效果以及代码

view5.gif
class ListPage extends StatefulWidget  {

  List<Widget> listHeader,listBottom;
  int dataLength;

  final itemBuild;

  final RefreshController controller;

  final VoidCallback fresh,load;

  final bool enablePullUp;



  ListPage({this.listHeader, this.listBottom, this.dataLength, this.itemBuild,@required this.controller, this.fresh, this.load, this.enablePullUp=true});

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

class _ListPageState extends State<ListPage> {


  @override
  Widget build(BuildContext context) {
    return SmartRefresher(
        controller: widget.controller,
        header: MaterialClassicHeader(),
        footer: ClassicFooter(),
        onRefresh: widget.fresh,
        onLoading: widget.load,
        enablePullDown: true,
        enablePullUp: widget.enablePullUp,
        child:ListView.builder(itemCount:_itemCount(),itemBuilder: (context,index){
          if (index<_getHeaderCount()) {
            return Column(children: <Widget>[
              widget.listHeader[index]
            ] ,);
          }else if(index>=widget.dataLength+_getHeaderCount()){
            return Column(children: <Widget>[
              widget.listBottom[index-_getHeaderCount()-widget.dataLength]
            ],);
          }else{
            return widget.itemBuild(context,index-_getHeaderCount());
          }
        },));
  }

  int _getHeaderCount(){
    return widget.listHeader!=null?widget.listHeader.length:0;
  }

  int _getBottomCount(){
    return widget.listBottom!=null?widget.listBottom.length:0;
  }

  int _itemCount(){
    return widget.dataLength+_getHeaderCount()+_getBottomCount();
  }
}

与原来相比,增加了SmartRefresher这个刷新控件,并且加了一些刷新加载的回调。这样子的话就可以对其进行刷新操作了。

相关文章

网友评论

    本文标题:flutter listview 加头加尾及刷新问题解决

    本文链接:https://www.haomeiwen.com/subject/rylaactx.html