Ошибка диапазона (индекс): Недопустимое значение: Допустимый диапазон значений пуст: 0 на карте списка

#flutter #dart #listview #hashmap

Вопрос:

В моем приложении я хотел бы иметь представление списка с круговой диаграммой. Это библиотека pie_chart, которую я использую.

Но я получаю ошибку List<Map<String,double>> .

 List<Map<String, double>> map = List<Map<String, double>>();

 ListView.builder(
          physics: NeverScrollableScrollPhysics(),
          shrinkWrap: true,
          itemCount: data.length,
          itemBuilder: (context, index) {
            var item = data[index];
            map[index].putIfAbsent("< 1 Weeks ago>", () => (2.0));
            return PieChart(
                     ...
                dataMap: map[index],
                     ...
            )
    }
 

Ошибка

 RangeError (index): Invalid value: Valid value range is empty: 0
 

На ошибку указывали map[index].putIfAbsent("< 1 Weeks ago>", () => (2.0)); . Что здесь не так?

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

1. что есть в данных? разве это не равно нулю при запуске ListView.builder?

2. Данные @JaimeOrtiz не являются нулевыми.. Я могу получить item[index] без проблем, но после добавления map[index] ошибка сохраняется.

3. Почему вы используете в счете data.length элементов вместо map.length . И что это data за переменная?

4. возможно, расширитель списка выдает ошибку, потому что внутри данных больше элементов, чем на карте, и он пытается получить доступ к индексу на карте, которого не существует

5. @croxx5f вопрос отредактирован. Длина карты всегда должна быть одинаковой data.length .

Ответ №1:

Чтобы добавить каждый из элементов из данных и добавить их на карту, я сделал это:

   @override
  Widget build(BuildContext context) {
    List map = [];

    List data = [
      {'entry_1': 1},
      {'entry_2': 2},
      {'entry_3': 3}
    ];

    return MaterialApp(
      title: MyApp._title,
      home: Scaffold(
        body: ListView.builder(
          physics: NeverScrollableScrollPhysics(),
          shrinkWrap: true,
          itemCount: data.length,
          itemBuilder: (context, index) {
            var item = data[index];
            map.add(item);
            return Container(
              height: 100,
              child: Text('Entry: ${map[index]}'),
            );
          },
        ),
      ),
    );
  }
 

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

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

1. спасибо за ваш ответ, но dataMap должен принять <Map<String,double>> .

2. Это здорово, как тебе это удалось?

3. Я плохо разбираюсь в объяснениях, дал свой ответ ниже.

Ответ №2:

Удалось исправить это, основываясь на подсказке @Jamie

 ListView.builder(
          physics: NeverScrollableScrollPhysics(),
          shrinkWrap: true,
          itemCount: analytic.unitOwnerByWorkOrderCount.length,
          itemBuilder: (context, index) {
            var item = data[index];
            Map<String, double> map = Map<String, double>();
            List<Map<String, double>> list = List<Map<String, double>>();

            map.putIfAbsent("< 1 Weeks ago>",
                () => (item['less_one_weeks_ago'].toDouble()));
            list.add(map);
                 ....

           return PieChart(
               dataMap: list[index];
                 ....
           )
  }