Flutter ListView 未更新
Posted
技术标签:
【中文标题】Flutter ListView 未更新【英文标题】:Flutter ListView not updating 【发布时间】:2018-01-20 18:33:26 【问题描述】:我想在 Flutter 中创建一个 ListView,它会在新数据到达时更新。我正在使用 RefreshIndicator 触发列表加载以进行测试。对于我的列表,我使用 ListBuilder 将我的对象映射到视图对象。
据我了解,setState() 应该会触发对我的列表的更新,但它不会。
调试显示,在调用 setState() 回调后,我的 _listContent 实际上填充了 72 个项目。为什么我的列表不自动更新?我错过了什么吗?
class MyHomePage extends StatefulWidget
MyHomePage(Key key, this.title) : super(key: key);
final String title;
@override
_MyHomePageState createState() => new _MyHomePageState();
class _MyHomePageState extends State<MyHomePage>
@override
Widget build(BuildContext context)
List<Manga> _listContent = new List<Manga>();
void _addMangas(List<Manga> mangas)
setState(()
_listContent.addAll(mangas);
print('Cleared list');
);
Future<Null> _onRefresh()
Completer<Null> completer = new Completer<Null>();
loadMangaItems().then((mangas) => _addMangas(mangas));
completer.complete();
return completer.future;
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new RefreshIndicator(
child: new ListView.builder(
itemCount: _listContent.length,
itemBuilder: (BuildContext ctx, int index)
Manga manga = _listContent[index];
return new MangaItem(
name: manga.writtenName,
number: manga.currentNr,
state: false,
);
),
onRefresh: _onRefresh),
);
【问题讨论】:
我有一个关于 RefreshCallback (_onRefresh()) 的实现的问题。completer.complete();
不是在 loadMangaItems() 完成之前被调用吗?
【参考方案1】:
我通过调用setState method 解决了一个类似的问题(通知框架该对象的内部状态已更改)。
此处示例:https://googleflutter.com/flutter-add-item-to-listview-dynamically/
【讨论】:
【参考方案2】:原来问题是
List<Manga> _listContent = new List<Manga>();
是在 widget.build 之上定义的,而不是在 State 类之上。像这样定义它可以正常工作:
class _MyHomePageState extends State<MyHomePage>
List<Manga> _listContent = new List<Manga>();
@override
Widget build(BuildContext context)
...
【讨论】:
您还可以将 _addMangas 和 _onRefresh 移到构建方法之外。没有理由把它放在那里。以上是关于Flutter ListView 未更新的主要内容,如果未能解决你的问题,请参考以下文章
Flutter 在 ListView 中不显示有状态的子 Widget
Flutter Horizontal ListView - 如何“跳转”选定的索引
从ArrayAdapter每毫秒更新Android ListView中的一行