2

フラッター プロジェクトにアニメーション リストがあります。

そのリストのすべての要素に対して、Firestore ストリームから動的に配置されるボタンのグリッドがあります。グリッドに 10 個のアイテムが返されることもありますが、0 個のアイテムが返されることもあります。

リスト要素のグリッド上のボタンが押されると、firestore が検索され、その下の次のリスト要素にボタンの新しいグリッドが作成されます。

私が抱えている問題は、グリッド ボタンが 0 で戻ってきたときに、新しいリスト要素 (グリッド ボタンのない空のリスト要素) を作成したくないことです。回避策としてサイズが 0 のコンテナーを返そうとしましたが、アニメーション化されたリストはまだ高さを与えているため、問題があることがわかります。また、リストに空のリスト要素が表示されないため、これは悪い習慣になることも理解しています。

文字列としての食品のリストから始めます。

  List foodListGrids = ['breads','drinks']

次に、アニメーション化されたリストがあります。

AnimatedList(
  shrinkWrap: true,
  physics: NeverScrollableScrollPhysics(),
  key: _FoodandDrinkKey,
  initialItemCount: foodListGrids.length,
  itemBuilder: (context, index, animation) {
        return SizeTransition(
                   sizeFactor: animation,
                   child: buildButtonGridItemsMenu(index),
             );
        },
   ),

AnimatedList のサイズを食品リストの長さに設定しました。

Animated List の子を、firebase を検索するクラスに設定し、次のようにボタンのグリッドを含むカードを返します。

StreamBuilder(
        stream: Firestore.instance
            .collection(widget.categoryType)
            .where(widget.relationship, isEqualTo: widget.searchString)
            .snapshots(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (!snapshot.hasData) {
            return Container(width: 0, height: 0,);
          } else if (snapshot.hasData) {
            List<Widget> widgetList = [];
            List<DocumentSnapshot> documentList = snapshot.data.documents;
            if (documentList.length > 0) {
              for (int i = 0; i < documentList.length; i++) {
                widgetList.add(ButtonTheme(
                  minWidth: 16,
                  height: 30,
                  child: GridButton(snapshot, i, widget.listIndex),
                ));
              }
              return Container(
                  width: double.infinity,
                  child: Wrap(
                    children: widgetList,
                    alignment: WrapAlignment.center,
                  ));
            } else{
              return Text('NO DATA BECAUSE NUMBER OF GRID ITEMS IS 0');
            }
          } else {
            return Text('NO DATA BECAUSE GRID ITEMS CALL IS NULL');
          }
        },
      ),

次に、各グリッド ボタンの on press メソッドで、次のような新しいリスト要素を追加します。

void _insertCategoryGridItem(String id, int index) {
  if (!foodListGrids.contains(id)) {
    foodListGrids.add(id);
    _FoodandDrinkKey.currentState.insertItem(index + 1);
  }
}

問題は、ニワトリが先か卵が先かの問題です。以下に示します。

  1. リスト アイテムは食品リストのインデックス 0 から生成され、すべてのストリーム データは食品リスト インデックス 0 の firebase 結果の場合です。
  2. 最初のリスト行のグリッド項目を押すと、グリッド項目の新しいセットを含む新しいリスト行が追加されます。これにより、食品リストの配列とリストの呼び出しが更新され、グリッド ボタンの新しい行が追加されます。問題は、これが最初の行グリッドの onpressed にあるためです。次の行に何が返されるかがわからないため、次のリスト行でサイズ 0 のグリッドが返されるかどうかを知る方法がありません。現在のセットアップ方法。

null、幅と高さが0のコンテナを返そうとしましたが、うまくいきませんでした。それを修正するために何ができるかわかりません。

ご協力いただきありがとうございます

4

1 に答える 1