flutter 瀑布流分页 已实现

瀑布流插件:flutter_staggered_grid_view

参考:https://segmentfault.com/a/1190000019716289

说明:在瀑布流的上方还有很多ui内容,独自封装的瀑布流会使布局出现问题,本文方法使用LIstView中的刷新,接口调用是根据id来获取最新数据,和参考的不太一样,但是都可以用

 

页面布局:

 

1.引入插件

import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';

 

2.瀑布流组件及controller

ScrollController _scrollController = new ScrollController();

 

//  瀑布流
  Widget pubu() {
    return StaggeredGridView.countBuilder(
          shrinkWrap: true,
          controller: _scrollController,
          crossAxisCount: 4,
          crossAxisSpacing: 10,
          mainAxisSpacing: 10,
          itemCount: recommendPublishs.length,
          itemBuilder: (context, index) {
            return GestureDetector(
                  onTap: (){
                    NavigatorUtil.pushNamedWithParam(context, Routes.productdetail, recommendPublishs[index]['id']);
                  },
                  child: Container(
                      color: Colors.pink,
                      child: new Container(
                        color: Colors.white,
                        child: Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: [
                            Container(
                              margin: EdgeInsets.only(bottom: 10),
//                              color: Colors.orange,
                              child: FormFactory.netImg(recommendPublishs[index]['headImg'][0] ?? '',fit: BoxFit.fitWidth,height: null,width: null),
                            ),
                            Container(
                              margin: EdgeInsets.only(bottom: 10),
                              padding: EdgeInsets.only(left: 10, right: 10),
                              child:  Text(recommendPublishs[index]['title'], maxLines: 2, overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: ScreenUtil().setSp(20)),),
                            ),
                            Container(
                              padding: EdgeInsets.only(left: 13, right: 13, bottom: 15),
                              child: Row(
                                children: [
                                  Expanded(
                                      child: Row(
                                        children: [
                                          Expanded(
                                            child: Row(
                                              children: [
                                                Text("¥", style: TextStyle(fontSize: ScreenUtil().setSp(17), color: Colors.red),),
                                                Text(recommendPublishs[index]['price']??'', style: TextStyle(fontSize: ScreenUtil().setSp(20), color: Colors.red),),
                                              ],
                                            ),
                                          ),

                                          Container(
                                            margin: EdgeInsets.only(left: 10),
                                            child: Text("已售1万+", style: TextStyle(fontSize: ScreenUtil().setSp(17), color: Color(0xff777777)),),
                                          ),

//                                  Container(
//                                    margin: EdgeInsets.only(left: 10),
//                                    child: Text("2323付款"),
//                                  ),
                                        ],
                                      )
                                  ),
//                            IconButton(icon: Icon(Icons.more_horiz), onPressed: null)
                                ],
                              ),
                            ),
                          ],
                        ),

                      )
                  )
              );
          },
//        staggeredTileBuilder: (index) =>
//            StaggeredTile.count(2, index == 0 ? 2.9 : 2.9)

          staggeredTileBuilder: (index) =>
              StaggeredTile.fit(2) //自适应高度
      );
  }

 

3.下拉刷新

// 下拉刷新数据
  void _dataRequest(bool _beAdd) async{

    DioManager.get(Ajax.queryRecomendPublish, {"next": _id}, (result, resp) {
      var resultDataArr = result['data'];
      if (resultDataArr.length != 0) {
        for (var data in resultDataArr) {
          recommendPublishs.add(data);
          print("我应该要获取到数据");
          print(recommendPublishs);
          print(data);
        }
        _id = result['next'];
        if (mounted) {
          setState(() {
            if (!_beAdd) {
              recommendPublishs.clear();
              recommendPublishs = resultDataArr;
            } else {
              recommendPublishs.addAll(resultDataArr);
            }
          });
        }
      }else{
       // _pucontroller.finishLoad(noMore: true);
      }
    });
  }

 

4.上拉加载

// 上拉加载数据
  Future<Null> _addMoreData() async {

    _dataRequest(true);
  }

 

5.在 initState()中


    _dataRequest(true); // 初始化加载
    
    _scrollController.addListener(() {
      if (_scrollController.position.pixels ==
          _scrollController.position.maxScrollExtent) {
        _addMoreData(); // 上拉加载更多
        print("我已经是最底部了,要从这里请求");
      }


    });

 

posted @ 2021-01-07 11:55  lude1994  阅读(1083)  评论(0编辑  收藏  举报