2017-08-12 267 views
0

我想在Flutter中创建一个ListView,在新数据到达时进行更新。我正在使用触发列表加载进行测试的RefreshIndicator。对于我的列表,我正在使用ListBuilder将我的对象映射到查看对象。Flutter ListView没有更新

从我的理解,setState()应该触发一个更新到我的列表,但它不。

调试表明我的_listContent实际上在调用setState()回调函数后填充了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), 
     ); 
    } 
} 
+0

我对RefreshCallback(_onRefresh())的实现有个问题。不是'completer.complete();'在* loadMangaItems()完成之前被调用? – sidecarcat

回答

5

原来,问题是,

List<Manga> _listContent = new List<Manga>(); 

已于widget.build的顶部定义,而不是对国家类的顶部。像这样定义它工作正常:

class _MyHomePageState extends State<MyHomePage> { 
    List<Manga> _listContent = new List<Manga>(); 

    @override 
    Widget build(BuildContext context) { 
    ... 
    } 
+1

你也可以在你的构建方法之外移动_addMangas和_onRefresh。没有理由在那里。 –