Ошибка диапазона (индекс): недопустимое значение: не входит в инклюзивный диапазон 0 ..13: 14

#flutter #dart

#ошибка flutter #dart

Вопрос:

Я хочу установить пользовательское значение в 0-м индексе _menuItems.

Это то, что я сделал до сих пор:

   int _value;
  List<custom.DropdownMenuItem<int>> _menuItems;

  initDropdown() {
    dynamic data = Provider.of<RestApiData>(context, listen: false).data;
    List dataList = data[1]["offers"];

    _menuItems = List<custom.DropdownMenuItem<int>>(dataList.length 1);
    _menuItems[0] = custom.DropdownMenuItem(
      value: -1,
      child: Text(
        'allOffers'.tr().toString(),
        style: GoogleFonts.ubuntu(fontWeight: FontWeight.w500, fontSize: 14.0),
      ),
      decoration: BoxDecoration(
          border:
              Border(bottom: BorderSide(color: Colors.black54, width: 0.5))),
    );

    for (int i = 1; i <= _menuItems.length; i  ) {
      _menuItems[i] = custom.DropdownMenuItem(
        value: int.parse(dataList[i]["Offer"]["id"]),
        child: Text(
          "${dataList[i]["Offer"]["name"]}",
          style:
              GoogleFonts.ubuntu(fontWeight: FontWeight.w500, fontSize: 14.0),
        ),
        decoration: BoxDecoration(
            border:
                Border(bottom: BorderSide(color: Colors.black54, width: 0.5))),
      );
    }
  }

  @override
  void initState() {
    super.initState();
    initDropdown();
  }
 

Я пробовал этот способ, но получаю ошибку диапазона.
Любая помощь будет признательна.
Заранее спасибо.

Ответ №1:

RangeError означает, что вы пытаетесь получить элемент по индексу, который не существует. Y Ваш список состоит из 14 элементов и индексируется начиная с 0 до 13, и вы пытаетесь получить элемент с индексом 14, что невозможно

Удалите равенство из условия цикла, и оно будет работать

               
for (int i = 1; i < _menuItems.length; i  ){
           .....................
}
 

Если вы запутались, выведите значение i в цикле

Комментарии:

1. спасибо за ответ, но я хочу поместить пользовательское значение в индекс _menuItems[0] . предложенное вами решение не работает.

2. вы имеете в виду, что вы поместите некоторое значение в индекс 0 и предоставите остальным цикл for?

3. да, верно. другие индексы должны предоставляться данными json, поступающими из api.

4. я пробовал этот способ раньше, но пользовательское значение заменяет первый элемент dataList

5. разве это не то, чего вы хотели достичь?

Ответ №2:

Проблема решена. Я забыл вычесть 1 из упомянутых строк.

 int _value;
  List<custom.DropdownMenuItem<int>> _menuItems;

  initDropdown() {
    dynamic data = Provider.of<RestApiData>(context, listen: false).data;
    List dataList = data[1]["offers"];

    _menuItems = List<custom.DropdownMenuItem<int>>(dataList.length   1);

    _menuItems[0] = custom.DropdownMenuItem(
      value: -1,
      child: Text(
        'allOffers'.tr().toString(),
        style: GoogleFonts.ubuntu(fontWeight: FontWeight.w500, fontSize: 14.0),
      ),
      decoration: BoxDecoration(
          border:
              Border(bottom: BorderSide(color: Colors.black54, width: 0.5))),
    );

    for (int i = 1; i < _menuItems.length; i  ) {
      _menuItems[i] = custom.DropdownMenuItem(
        value: int.parse(dataList[i - 1]["Offer"]["id"]), //**here**
        child: Text(
          "${dataList[i - 1]["Offer"]["name"]}", //**here**
          style:
              GoogleFonts.ubuntu(fontWeight: FontWeight.w500, fontSize: 14.0),
        ),
        decoration: BoxDecoration(
            border:
                Border(bottom: BorderSide(color: Colors.black54, width: 0.5))),
      );
    }