封裝了Flutter的ListView,只要傳遞請求數據的方法和繪製item的方法進去就能夠繪製ListView,同時支持下拉刷新、上拉加載更多。git
主要三個文件:refresh_list_view.dart
//封裝的ListView,github
list_view_item.dart
//ListView的子item渲染view微信
refersh_list_view_demo.dart
//封裝的ListView使用方法網絡
github地址:github.com/damengzai/f…async
能夠下拉刷新、上拉加載更多的ListViewide
@override
Widget build(BuildContext context) {
return RefreshIndicator(
child: ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
if (widget.listItemView is Function) {
return widget.listItemView(index, items[index]);
}
},
physics: const AlwaysScrollableScrollPhysics(),
controller: _scrollController,
),
onRefresh: _handleRefresh);
}
複製代碼
RefreshIndicator:一個Material風格的下拉刷新組件,包含一個可滾動的子組件,當子組件下拉是會有一個圓形刷新圖標,當下拉距離足夠的時候,會觸發onRefresh,而在onRefresh中會去刷新數據。優化
當子組件過短而不能滾動的時候,須要添加
physics: const AlwaysScrollableScrollPhysics(),
不然下拉刷新和上拉加載更多都無效,沒法觸發了。ui
ListView:itemBuilder
用於渲染子item,controller添加一個ScrollController
,用於響應滾動事件,監聽滾動到底部,作加載更多處理,同時ScrollController
能夠跳轉到指定位置,記住滾動位置等。this
@override
void initState() {
super.initState();
_loadMore();
_scrollController.addListener(() {
if (_scrollController.position.pixels ==
_scrollController.position.maxScrollExtent) {
//滾動到最後請求更多
_loadMore();
}
});
}
複製代碼
在初始換state中首先經過_loadMore()
獲取數據,同時使用_scrollController
監聽滾動滾動的位置,當滾動到最底部的時候,會觸發加載更多數據的方法。spa
//加載更多
Future _loadMore() async {
if (!isLoading) {
if(this.mounted) {
setState(() {
//經過setState去更新數據
isLoading = true;
});
}
}
List moreList = await mockHttpRequest();
if (this.mounted) {
setState(() {
items.addAll(moreList);
isLoading = false;
});
}
}
複製代碼
加載更多的方法,模擬了一個網絡請求,當有數據返回的時候,經過setState
將數據更新回state中,實現UI的刷新。下拉刷新的方法相似,不作過多介紹。
@override
Widget build(BuildContext context) {
return Card(
color: Colors.white,
elevation: 4.0,
child: Padding(
padding: const EdgeInsets.fromLTRB(8.0, 30.0, 8.0, 30.0),
child: Text(
this.title,
style: new TextStyle(
color: Colors.blue,
fontSize: 20,
),),),);}
複製代碼
不作過多介紹,能夠根據本身的須要定製UI,如今只顯示了一個TextView。
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Column(
children: <Widget>[
new Expanded(
child: RefreshListView(getListData, createListItem),
),],),);}}
複製代碼
getListData
、createListItem
分別是獲取數據和渲染子item的方法,傳遞方法進去(比JAVA靈活多了)本身定製更靈活。
以上是一個下拉刷新、上拉加載更多的ListView的簡單封裝,後續持續優化,方便使用。
微信公衆號:「Flutter入門」