From c8eb1d7346ce8ca819a7852fdeca9ba6b3ab4389 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Tue, 19 Jan 2021 09:14:29 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=88=97=E8=A1=A8=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=20see=20more=20search=20BeeListView?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../industry_committee_page.dart | 44 +++++-- .../things_page/widget/bee_list_view.dart | 115 ++++++++++++++++++ 2 files changed, 147 insertions(+), 12 deletions(-) create mode 100644 lib/pages/things_page/widget/bee_list_view.dart diff --git a/lib/pages/industry_committee/industry_committee_page.dart b/lib/pages/industry_committee/industry_committee_page.dart index ce8c262f..acf16c4c 100644 --- a/lib/pages/industry_committee/industry_committee_page.dart +++ b/lib/pages/industry_committee/industry_committee_page.dart @@ -2,6 +2,7 @@ import 'package:akuCommunity/base/base_style.dart'; import 'package:akuCommunity/constants/api.dart'; import 'package:akuCommunity/model/user/committee_item_model.dart'; import 'package:akuCommunity/pages/industry_committee/committee_mailbox/committee_mailbox_page.dart'; +import 'package:akuCommunity/pages/things_page/widget/bee_list_view.dart'; import 'package:akuCommunity/utils/network/base_list_model.dart'; import 'package:akuCommunity/utils/network/net_util.dart'; import 'package:akuCommunity/widget/bee_scaffold.dart'; @@ -158,20 +159,39 @@ class _IndustryCommitteePageState extends State { Widget build(BuildContext context) { return BeeScaffold( title: '业委会', - body: EasyRefresh( - firstRefresh: true, - header: MaterialHeader(), + body: BeeListView( + path: API.manager.commiteeStaff, + convert: (model) { + return model.tableList + .map((e) => CommitteeItemModel.fromJson(e)) + .toList(); + }, controller: _refreshController, - onRefresh: refresh, - child: ListView.separated( - padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 20.w), - itemBuilder: (context, index) { - return _buildCard(_committeeModels[index]); - }, - separatorBuilder: (context, index) => 20.hb, - itemCount: _committeeModels.length, - ), + builder: (items) { + return ListView.separated( + padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 20.w), + itemBuilder: (context, index) { + return _buildCard(items[index]); + }, + separatorBuilder: (context, index) => 20.hb, + itemCount: items.length, + ); + }, ), + // body: EasyRefresh( + // firstRefresh: true, + // header: MaterialHeader(), + // controller: _refreshController, + // onRefresh: refresh, + // child: ListView.separated( + // padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 20.w), + // itemBuilder: (context, index) { + // return _buildCard(_committeeModels[index]); + // }, + // separatorBuilder: (context, index) => 20.hb, + // itemCount: _committeeModels.length, + // ), + // ), bottomNavi: _buildBottomNavi(), ); } diff --git a/lib/pages/things_page/widget/bee_list_view.dart b/lib/pages/things_page/widget/bee_list_view.dart new file mode 100644 index 00000000..e298d5df --- /dev/null +++ b/lib/pages/things_page/widget/bee_list_view.dart @@ -0,0 +1,115 @@ +import 'package:akuCommunity/utils/network/base_list_model.dart'; +import 'package:akuCommunity/utils/network/net_util.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_easyrefresh/easy_refresh.dart'; + +/// ## BeeListView +///```dart +///BeeListView( +/// path: API.someAPI, +/// convert: (model) { +/// return model.tableList +/// .map((e) => SomeModel.fromJson(e)) +/// .toList(); +/// }, +/// controller: _refreshController, +/// builder: (items) { +/// return ListView.builder( +/// itemBuilder: (context, index) { +/// return _buildSomeItem(items[index]); +/// }, +/// itemCount: items.length, +/// ); +/// }, +///) +///``` +class BeeListView extends StatefulWidget { + ///API path + final String path; + + ///same as EasyRefreshController + final EasyRefreshController controller; + + ///转换器 + /// + ///BaseListModel to T + /// + ///T is a tableList item. + /// + ///```dart + ///... + ///convert: (model) { + /// return model.tableList + /// .map((e) => SomeModel.fromJson(e)) + /// .toList(); + ///}, + ///... + ///``` + final List Function(BaseListModel model) convert; + + ///子组件构造器 + final Widget Function(List items) builder; + + ///每页记录数 + final int size; + + ///额外的参数 + final Map extraParams; + BeeListView({ + Key key, + this.path, + @required this.controller, + this.convert, + this.builder, + this.size = 10, + this.extraParams, + }) : super(key: key); + + @override + _BeeListViewState createState() => _BeeListViewState(); +} + +class _BeeListViewState extends State { + int _pageNum = 1; + BaseListModel _model = BaseListModel.zero(); + List _models = []; + Map get _params { + Map tempMap = { + 'pageNum': _pageNum, + 'size': widget.size, + }; + tempMap.addAll(widget.extraParams ?? {}); + return tempMap; + } + + @override + Widget build(BuildContext context) { + return EasyRefresh( + controller: widget.controller, + header: MaterialHeader(), + footer: MaterialFooter(), + onRefresh: () async { + _pageNum = 1; + _model = await NetUtil().getList( + widget.path, + params: _params, + ); + _models = widget.convert(_model); + setState(() {}); + }, + firstRefresh: true, + onLoad: () async { + _pageNum++; + _model = await NetUtil().getList( + widget.path, + params: _params, + ); + _models.addAll(widget.convert(_model) as List); + if (_pageNum >= _model.pageCount) + widget.controller.finishLoad(noMore: true); + setState(() {}); + }, + child: widget.builder(_models), + ); + } +}