【问题标题】:Flutter ListView not updatingFlutter ListView 未更新
【发布时间】: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() 完成之前被调用吗?

标签: listview dart flutter


【解决方案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 移到构建方法之外。没有理由把它放在那里。
    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 2021-01-10
    • 2021-08-06
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 2020-11-16
    • 2020-09-28
    相关资源
    最近更新 更多