android-无限滚动listview-在构建过程中调用setState()或markNeedsBuild

android-无限滚动listview-在构建过程中调用setState()或markNeedsBuild,第1张

概述我正在创建一个无限滚动listView,并且我想使用_loadNames函数中的setState将_loadingState字符串从’loading…’更改为’loaded’,但是当从itemBuilder调用_loadNames时,在构建过程中会得到’setState错误”.使用RefreshIndicator可以正常工作并更新项目,但滚动到底部会导致错误.

我正在创建一个无限滚动ListVIEw,并且我想使用_loadnames函数中的setState将_loadingState字符串从’loading …’更改为’loaded’,但是当从itemBuilder调用_loadnames时,在构建过程中会得到’setState错误”.使用Refreshindicator可以正常工作并更新项目,但滚动到底部会导致错误.我如何能够从ListVIEws构建器中调用_loadnames而不会出现错误或可以使用其他什么方法.
注意:不想使用redux或bloc.

class _HomePageState extends State<HomePage> {     List<String> names = [];     List<String> _shownnames = [];     int currentPage = 0;     int limit = 20;     String _loadingState = 'loading';     bool loading = true;     @overrIDe     voID initState() {       super.initState();       for (int i = 0; i < 200; i++) {         names.add("hello $i");       }       _loadnames();     }     @overrIDe     Widget build(BuildContext context) {       // Todo: implement build       return new Scaffold(         appbar: new Appbar(Title: new Text('User')),         body: Column(children: <Widget>[           Text(_loadingState),           Expanded(child:_getListVIEwWidget()),         ],)       );     }     Widget _getListVIEwWidget(){       ListVIEw lv =  new ListVIEw.builder(         itemCount: _shownnames.length,         itemBuilder: (context, index){         if(index >= _shownnames.length - 5 && !loading){           _loadnames(); // Getting error when this is called         }         return  ListTile(           Title: Text(_shownnames[index]),         );       });       Refreshindicator refreshindicator = new Refreshindicator(         key: _refreshindicatorKey,         onRefresh: (){           _loadnames();           return null;         },         child: lv       );       return refreshindicator;     }    _loadnames(){       loading = true;       setState(() {         _loadingState = 'loading...';       });       new Timer(const Duration(seconds: 5), () {          setState(() {            _shownnames.addAll(names.getRange(currentPage, currentPage + limit));           currentPage += limit;           _loadingState = 'loaded';         });         loading = false;       });     }  }

解决方法:

更改_loadnames(){

_loadnames(){   loading = true;   // setState(() {     _loadingState = 'loading...';   // });

     onRefresh: (){       _loadnames();       return null;     },

     onRefresh: (){       setState(() => _loadnames());     },

更新

_loadnames(){   loading = true;   new Future.delayed(Duration.zero, () => setState(() {     _loadingState = 'loading...';   }));
总结

以上是内存溢出为你收集整理的android-无限滚动listview-在构建过程中调用setState()或markNeedsBuild全部内容,希望文章能够帮你解决android-无限滚动listview-在构建过程中调用setState()或markNeedsBuild所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1092129.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存