瀑布流插件: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, 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("我已经是最底部了,要从这里请求"); } });