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 Horizo​​ntal ListView - 如何“跳转”选定的索引

winform。 listview 更新数据后刷新

从ArrayAdapter每毫秒更新Android ListView中的一行

RenderBox 未布局,Flutter Listview Builder 未显示

尝试在 ListView 中使用其内容时未找到 Flutter FutureProvider