0

私は、ユーザーが別の画面でアイテムを注文したときに同じタブの画面から戻ったときに表示される黒いバナーを取得するという課題を負っています。以下の現在のコードは、ユーザーが別のタブを選択して終了し、画面に戻った場合にのみ、黒いバナーを適切に表示します。動的に提示する必要がある部分は、「if (OrderProvider.listOrderSummary.isNotEmpty)」で始まります。これには、ステートレス ウィジェットをステートフルにすることが含まれると思いますが、その結果、正しいアプローチではない可能性があることを示すエラーが発生します。

class GridItems extends StatelessWidget {
  GridItems({@required this.infinityPageController});

  final InfinityPageController infinityPageController;

  @override
  Widget build(BuildContext context) {
    final List<Item> itemList = Provider.of<List<Item>>(context);
    if (itemList == null) {
       return Center(
       child: CupertinoActivityIndicator(
         radius: 20,
       ),
    );
  }
  final List<Item> mapItemList = itemList.toList();
    return Column(
      children: <Widget>[
        TopMenuNavigation(
          infinityPageController: infinityPageController,
          title: 'ALL ITEMS',
        ),
        Divider(
          color: Colors.grey,
        ),
        Expanded(
          child: GridView.builder(
            gridDelegate:
               SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
            itemCount: itemList.length,
            itemBuilder: (BuildContext contex, int index) {
              return Center(
                child: InkWell(
                  onTap: () {
                    Navigator.of(context)
                        .pushNamed('/order', arguments: mapItemList[index]);
                  },
                  child: Container(
                    width: 310,
                    margin: EdgeInsets.all(7),
                    decoration: BoxDecoration(
                      color: Colors.white,
                      border: Border.all(width: 1, color: Colors.grey),
                      borderRadius: BorderRadius.all(
                        Radius.circular(7.0),
                      ),
                    ),
                    child: Column(
                      children: <Widget>[
                        Container(
                          padding: EdgeInsets.only(left: 10, top: 10),
                          width: double.infinity,
                          child: Text('${mapItemList[index].itemName}'),
                        ),
                        Expanded(
                          child: Image.network(
                            '${mapItemList[index].imageUrl}',
                          ),
                        ),
                      ],
                    ),
                  ),
                ),
              );
            },
          ),
        ),
        if (OrderProvider.listOrderSummary.isNotEmpty)
          GestureDetector(
            onTap: () {
              Navigator.of(context).pushNamed('/review_order');
            },
            child: Container(
              height: 55,
              color: Colors.black,
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: <Widget>[
                  Spacer(),
                  Text(
                    'REVIEW ORDER (${OrderProvider.listOrderSummary.length} items)',
                    style: TextStyle(
                        fontSize: 17,
                        color: Colors.white,
                        fontFamily: 'OpenSans',
                        fontWeight: FontWeight.bold),
                  ),
                  SizedBox(width: 8),
                  Icon(
                    Icons.navigate_next,
                    color: Colors.white,
                    size: 35,
                  ),
                  SizedBox(
                    width: MediaQuery.of(context).size.height * 0.065,
                  ),
                ],
              ),
            ),
          )
        else
          SizedBox(),
     ],
    );
  }
}
4

1 に答える 1