#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];
....
)
}