Flutter ListView封裝,下拉刷新、上拉加載更多

Flutter ListView封裝,下拉刷新、上拉加載更多

​ 封裝了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

1. refresh_list_view.dart

​ 能夠下拉刷新、上拉加載更多的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的刷新。下拉刷新的方法相似,不作過多介紹。

2. list_view_item.dart
@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。

3.refresh_list_view_demo.dart
@override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Column(
        children: <Widget>[
          new Expanded(
            child: RefreshListView(getListData, createListItem),
          ),],),);}}
複製代碼

getListDatacreateListItem分別是獲取數據和渲染子item的方法,傳遞方法進去(比JAVA靈活多了)本身定製更靈活。

以上是一個下拉刷新、上拉加載更多的ListView的簡單封裝,後續持續優化,方便使用。

微信公衆號:「Flutter入門」

相關文章
相關標籤/搜索