gpt4 book ai didi

android - 无限滚动 ListView - 在构建期间调用 setState() 或 markNeedsBuild

转载 作者:IT老高 更新时间:2023-10-28 12:44:36 25 4
gpt4 key购买 nike

我正在创建一个无限滚动的 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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51249879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com