Flutter - Listview внутри Listview.Прокрутка вызывает неверную информацию - PullRequest
0 голосов
/ 26 марта 2019

У меня проблемы с listview.builder внутри listview.builder.Когда я прокручиваю до конца и возвращаюсь к началу, элементы списка во втором просмотре списка отображают информацию из других категорий.

Кажется, что информация об этом ограничена.Я попытался добавить ключ к каждому из создателей списка.Все безрезультатно.

См. Этот пример, где данные, которые отображаются в категории «Горячие продукты», изменяются с горячих продуктов на напитки после прокрутки вниз и снова. Gif экрана с правильными, затем неправильными данными.

body: new ListView.builder(
            key: new Key(new Random(20).toString()),
            shrinkWrap: true,
            itemCount: catData == null ? 0 : catData.length,
            itemBuilder: (BuildContext context, currCat) {
              currCatId = int.parse(catData[currCat]['itemCategoryId']);
              print(
                  "ListView1 catdata: " + catData[currCat]['itemCategoryDesc']);
              return new Column(mainAxisSize: MainAxisSize.min, children: <
                  Widget>[
                new Flexible(
                  fit: FlexFit.loose,
                  child: new Row(
                    mainAxisSize: MainAxisSize.min,
                    children: <Widget>[
                      new Expanded(
                        child: new ListTile(
                          title: new Text(catData[currCat]['itemCategoryDesc']),
                        ),
                      )
                    ],
                  ),
                ),
                new Flexible(
                  child:
                      menuSubList(int.parse(catData[currCat]['itemCategoryId'])),
                )
             ]);
            }));

return new ListView.builder(
      addAutomaticKeepAlives: true,
        key: new Key(new Random(20).toString()),
        physics: NeverScrollableScrollPhysics(),
        shrinkWrap: true,
        padding: EdgeInsets.all(0.0),
        itemCount: subCatData == null ? 0 : subCatData.length,
        itemBuilder: (BuildContext context, i) {
          return new Column(mainAxisSize: MainAxisSize.min,
                  children: <Widget>[
                    new Flexible(
                      fit: FlexFit.loose,
                      child: new Row(
                        mainAxisSize: MainAxisSize.min,
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          children: <Widget>[
                            new Flexible(
                              fit: FlexFit.loose,
                              child:
                              new ListTile(
                                leading: Image.network(
                                  "http://thisipswich.com/ssimg/${subCatData[i]['menuItemPic'] != null ? subCatData[i]['menuItemPic'] : 'noimage.png'}",
                                  fit: BoxFit.scaleDown,
                                  width: 75.0,
                                  height: 75.0,
                                ),
                                //                  dense: true,
                                title: new Text(new ConvertTitle().convertTitleCase(
                                    "${subCatData[i]['menuItemDesc']}   ${subCatData[i]['menuItemPrice']}")),
                                subtitle: new Text(
                                    "Cat: ${subCatData[i]["itemCategoryDesc"]} ${subCatData[i]['menuItemVegetarian'] == '1' ? '\nVeg' : ''}"),
                                onTap: () {
                                  var datapass = subCatData[i];
                                  var menuIdPass = subCatData[i]['menuItemId'];
                                  _selectMenuItem(datapass, menuIdPass);
                                },
                              ),
                            ),
                            new IconButton(
                                icon: new Icon(Icons.add_shopping_cart),
                                onPressed: () {
                                  _addItemToCart(context, i);
                                }
                            ),
                          ]
                      ),

                    ),

                  ]
              );

        }
        );
  List getMenuByCat(int catId) {
    print("getMenubyCat. catId: " + catId.toString());
    print("getMEnubyCat. Data: " + data.toString());
    List dataCopy = data.map((element)=>element).toList();
//    List dataCopy = new List.from(data);
    menuItemByCat = dataCopy
        .where((item) => item['menuItemCategory'] == catId.toString())
        .toList();
    return menuItemByCat;
  }
...