Как ограничить длину элемента ListView, чтобы предотвратить ошибку - PullRequest
0 голосов
/ 08 мая 2020

Я создаю это приложение флаттера, в котором я хочу поместить элементы одного и того же списка с последовательными значениями индекса в одной строке, но я получаю эту ошибку с диапазоном списка (который я ожидал), но не могу выяснить решение. дочерний: Image.asset (menuItemList [index + 1] .image) -> из-за этой строки, особенно когда menuItemList достигает своего предела, он добавляет +1 к индексу, который выходит за пределы диапазона .. Я хотел бы знать, есть ли - другой способ сделать это, или если я могу использовать оператор if для ограничения диапазона

код

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:projectfooddelivery/Src/models/menu_item.dart';

List<MenuItem> menuItemList = [
  MenuItem(
      name: "Steak",
      image: "images/kfcfood.jpg",
      price: 8.99,
      icon: IconButton(
        icon: Icon(Icons.add_circle), color: Colors.deepOrange,
      )),
  MenuItem(name: "Steak", image: "images/kfcfood.jpg", price: 8.99, icon:IconButton(icon: IconButton(icon: Icon(Icons.add_circle,color: Colors.deepOrange,size: 35,), onPressed: null), onPressed: null),),
  MenuItem(name: "Chips", image: "images/kfcfood.jpg", price: 30.99),
  MenuItem(name: "Steak", image: "images/kfcfood.jpg", price: 8.99),
  MenuItem(name: "Steak", image: "images/kfcfood.jpg", price: 8.99),
  MenuItem(name: "Steak", image: "images/kfcfood.jpg", price: 8.99),
  MenuItem(name: "Steak", image: "images/kfcfood.jpg", price: 8.99),
  MenuItem(name: "Steak", image: "images/kfcfood.jpg", price: 8.99),
  MenuItem(name: "Steak", image: "images/kfcfood.jpg", price: 8.99),
  MenuItem(name: "Steak", image: "images/kfcfood.jpg", price: 8.99),
];

class MenuWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
        padding: EdgeInsets.only(top: 0),
        height: 200,
        child: ListView.builder(
          scrollDirection: Axis.vertical,
          itemCount: menuItemList.length,
          itemBuilder: (_, index) {
            return Padding(
              padding: const EdgeInsets.all(6.0),
              child: Container(
                  child: Row(
                children: <Widget>[
                  Container(
                    height: 150,
                    child: Stack(
                      children: <Widget>[
                        ClipRRect(
                            borderRadius: BorderRadius.circular(20),
                            child: Image.asset(menuItemList[index].image)
                        ),
                        Align(
                          alignment: Alignment.center,
                          child: Column(
                            children: <Widget>[
                              Text("bRO")
                            ],
                          ),
                        )
                      ],
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(left:18.0),
                    child: Container(
                      height: 150,
                  child:
                      Stack(
                        children: <Widget>[
                          ClipRRect(
                              borderRadius: BorderRadius.circular(20),
                              child: Image.asset(menuItemList[index+1].image)
                          ),
                          Align(
                            alignment: Alignment.center,
                            child: Column(
                              children: <Widget>[
                                Text("Something")
                              ],
                            ),
                          )
                        ],
                      ),
                    ),
                  )
                ],
              )),
            );
          },
        )
    );
  }
}

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Используйте оператор if в itemBuilder из ListView и верните null, когда индекс построителя больше длины вашего списка.

Что-то вроде

if(index >= menuItemList.length)
  return null;

должно быть в itemBuilder.

0 голосов
/ 09 мая 2020

Вы можете добавить второй элемент условно, используя функцию collection if:

Row(
  children: <Widget>[
    Container(
      ...
    ),
    if (index + 1 < menuItemList.length) // <-- collection if
      Padding(
        ...
      )
  ],
)

Примечание. collection if доступен начиная с Dart 2.3 и далее. Подробнее об этом здесь .

...