2017-08-12 264 views
0

新しいデータが到着したときに更新するFlutterでListViewを作成したいと考えました。私は、テストのためにリストロードをトリガーするRefreshIndicatorを使用しています。私のリストでは、ListBuilderを使用してオブジェクトをビューオブジェクトにマップしています。Flutter ListViewが更新されない

私が理解するところでは、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), 
     ); 
    } 
} 
+0

このRefreshCallback(_onRefresh())の実装について質問があります。 loadMangaItems()が完了する前に 'completer.complete(); 'が呼び出されていませんか? – 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をビルドメソッド外に移動することもできます。それをそこに持つ理由はありません。 –

関連する問題