簡単なメモ:
私のすべてのコード例では、のmaterial.Widget
代わりに次のようなものが表示されますWidget
。これは、インポートに次のような名前を付けるのが好きなためです。
import 'package:flutter/material.dart' as material;
私の質問:
ListViewに、新しく追加されたウィジェットをリストの一番上に表示させようとしています。モデルのリスト(ListViewに入るウィジェットを構築するために必要な情報を含むクラス)のみを含む単純なステートフルウィジェットがあり、そのリストに基づいてListViewの子を構築する必要があります。
class Page extends material.StatefulWidget {
final List<CardModel> cardModels;
Page(this.cardModels);
@override
_PageState createState() => new _PageState(cardModels);
}
class _PageState extends material.State<Page> {
List<CardModel> cardModels;
_PageState(this.cardModels);
@override
material.Widget build(material.BuildContext context) {
return new material.ListView(
children: cardModels.map((cardModel) => new Card(cardModel.cardID)).toList(),
);
}
}
これから私が期待する動作は、buildメソッドが呼び出される(そしてsetStateが適切に使用される)ときはいつでも、ListViewが適切に再構築され、リストの順序で子ウィジェットが含まれる必要があるということです。新しいモデルをcardModelsに順番に追加するだけで、これは正常に実行されます。
cardModels.add(new CardModel(nextID++));
ウィジェットが順番に追加され、IDが適切に増加していることがわかります。
ただし、新しいウィジェットを上部に挿入する必要があります(上部に高いIDで表示されます)。これを実現するために、リストの最初に新しいモデルを挿入してみます。
cardModels.insert(0, new CardModel(nextID++));
残念ながら、正しいウィジェットが表示される代わりに、ID0のウィジェットが何度も表示されます。
モデルのリストを印刷してIDを降順で確認できるため、モデルのリストが正しく更新されていることがわかります。フラッターがこの動作を引き起こしているウィジェットの変更を検出する方法について何かがあると思いますが、多くの読書の後、私はまだそれを理解することができませんでした。どんな助けでも大歓迎です。また、ページ(ListViewを含むウィジェット)をその子の1つとして構築するウィジェットでsetstateを呼び出します。
btn = new FloatingActionButton(
onPressed: () => setState(_pageController.addCard),
tooltip: 'Upload File',
child: new Icon(Icons.file_upload),
);
_pageControllerは、モデルのリストを変更するオブジェクトです。これで十分な情報が得られない場合は、お知らせください。コードを追加したり、質問に回答したりできます。
結局、私が作成したカードウィジェットはステートフルである必要はありませんでした。ステートレスに変更したところ、問題は解決しました。しかし、なぜそれらをステートフルにすることがそれを壊すのか分かりません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加