中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

FlutterListView怎么實現上拉加載更多下拉刷新的功能

發布時間:2021-09-13 17:10:22 來源:億速云 閱讀:164 作者:chen 欄目:編程語言

本篇內容主要講解“FlutterListView怎么實現上拉加載更多下拉刷新的功能”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“FlutterListView怎么實現上拉加載更多下拉刷新的功能”吧!

下拉刷新

跟原生開發一樣,下拉刷新在flutter里提供的有組件實現 RefreshIndicator

一直不明白為啥組件中都提供下拉刷新,但就是沒有上拉加載!!

我這請求接口數據用的是 http 庫,是個第三方的是需要安裝的 https://pub.dev/packages/http

用法如下

class MyHomePage extends StatefulWidget { MyHomePage({Key key}) : super(key: key); @override MyHomeWidget2 createState() => MyHomeWidget2();}class MyHomeWidget2 extends State<MyHomePage> { int page = 1; List data = new List(); var baseUrl = "https://cnodejs.org/api/v1"; @override void initState() { super.initState(); this._onRefresh(); } _fetchData() async { var response = await http.get(  '${this.baseUrl}/topics?mdrender=false&limit=10&page=${this.page}'); var json = await convert.jsonDecode(response.body); return json['data']; } Future<dynamic> _onRefresh() { data.clear(); this.page = 1; return _fetchData().then((data) {  setState(() => this.data.addAll(data)); }); } @override Widget build(BuildContext context) { return Scaffold(  body: RefreshIndicator( // 在ListView外包一層 RefreshIndicator 組件  onRefresh: _onRefresh, // 添加onRefresh方法  child: ListView.separated(   itemCount: this.data.length,   itemBuilder: (context, index) {   var _data = this.data[index];   return ListTile(    leading: Image.network(_data["author"]["avatar_url"]),    title: Text(_data["title"]),    subtitle: Text(_data["author"]["loginname"] +     " created at " +     new DateTime.now().toString()), // 為了看每次數據變動,這里直接取當前時間    trailing: Icon(Icons.chevron_right));   },   separatorBuilder: (context, index) {   return Divider();   },  ) )); }}

上拉加載

上拉加載原理還是一樣的,給ListView加一個 ScrollController 組件,然后通過事件監聽滾動條的高度來顯示和隱藏加載更多的組件

先將加載更多的組件寫好

Widget _loadMoreWidget() { return new Padding( padding: const EdgeInsets.all(15.0), // 外邊距 child: new Center(  child: new CircularProgressIndicator() ), );}

初始化一個 ScrollController 組件,將其設置給 ListView 組件的 controller 屬性上

ScrollController _scrollController = new ScrollController();child: ListView.separated( controller: _scrollController, //...)

然后通過重寫 dispost() 方法來處理加載更多組件的釋放

@overridevoid dispose() { _scrollController.dispose(); super.dispose();}

最后通過數據源來控制界面渲染哪個組件,當數據源循環渲染的 index 跟數據源一樣長時(其實少1,下標從0開始的)就渲染加載更多組件,讓其顯示出來,同時調用加載更多方法,獲取數據,再通過state實現組件ui的更新

完整代碼如下

class MyHomePage extends StatefulWidget { MyHomePage({Key key}) : super(key: key); @override MyHomeWidget2 createState() => MyHomeWidget2();}class MyHomeWidget2 extends State<MyHomePage> { int page = 1; bool isLoadmore = false; List data = new List(); var baseUrl = "https://cnodejs.org/api/v1"; ScrollController _scrollController = new ScrollController(); @override void initState() { super.initState(); this._onRefresh(); _scrollController.addListener(() {  if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) {  _onLoadmore();  } }); } _fetchData() async { var response = await http.get(  '${this.baseUrl}/topics?mdrender=false&limit=10&page=${this.page}'); var json = await convert.jsonDecode(response.body); return json['data']; } Future<dynamic> _onRefresh() { data.clear(); this.page = 1; return _fetchData().then((data) {  setState(() => this.data.addAll(data)); }); } Future<dynamic> _onLoadmore() { this.page++; return _fetchData().then((data) {  setState((){  this.data.addAll(data);  isLoadmore = false;  }); }); } @override void dispose() { _scrollController.dispose(); super.dispose(); } Widget _loadMoreWidget() { return new Padding(  padding: const EdgeInsets.all(15.0),  child: new Center(  child: new CircularProgressIndicator()  ), ); } @override Widget build(BuildContext context) { return Scaffold(  body: RefreshIndicator(  onRefresh: _onRefresh,  child: ListView.separated(   controller: _scrollController,   itemCount: this.data.length,   itemBuilder: (context, index) {   if (index == data.length - 1) {    return _loadMoreWidget();   } else {    var _data = this.data[index];    return ListTile(     leading: Image.network(_data["author"]["avatar_url"]),     title: Text(_data["title"]),     subtitle: Text(_data["author"]["loginname"] +      " created at " +      new DateTime.now().toString()),     trailing: Icon(Icons.chevron_right));   }   },   separatorBuilder: (context, index) {   return Divider();   },  ) )); }}

到此,相信大家對“FlutterListView怎么實現上拉加載更多下拉刷新的功能”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

六安市| 泰和县| 奉节县| 攀枝花市| 信宜市| 绩溪县| 瑞金市| 乐安县| 利辛县| 诸城市| 无为县| 清徐县| 赣州市| 五家渠市| 大庆市| 安多县| 门源| 宁安市| 石棉县| 南安市| 化州市| 黎平县| 南投市| 廊坊市| 全州县| 临武县| 离岛区| 喜德县| 邢台市| 孝感市| 信丰县| 泽州县| 和林格尔县| 莲花县| 伊宁市| 日喀则市| 双柏县| 清新县| 北票市| 剑河县| 公主岭市|