#loops #flutter #markers
#циклы #трепетание #маркеры
Вопрос:
В моем приложении я использую пакеты flutter_bloc и flutter_map.Когда я отслеживаю маршрут, я хочу отобразить порядок отслеживаемых точек, поэтому, когда я получаю состояние с отслеживаемым маршрутом, я добавляю маркер для каждой точки маршрута с помощью цикла (forEach или normal), и у него есть значок и номер, чтобы я мог видеть порядок маркеров. Проблема в том, что, хотя маркеры правильно размещены на карте и значок отображается правильно, отображаемое число неверно. Если я печатаю переменную, содержащую значение для отображения в цикле, она печатает правильно, например, от 1 до 7, но при присвоении маркеру она получает неправильное значение 8. Я не могу выяснить, откуда берется это 8..
Вы видите, что я здесь делаю не так?
Это код в полученном состоянии:
if (state is TrackedRoute) {
route.clear();
trackedPoints.clear();
int num = 1;
setState(() {
route = state.trackedRoute;
});
// route.forEach((element) {
for (int i = 0; i < route.length; i ) {
LatLng element = route[i];
print('@@@@@ num is $num'); // TODO printed number is correct
LatLng point = LatLng(element.latitude, element.longitude);
Marker trackedPoint = Marker(
point: point,
height: 30,
width: 30,
builder: (context) => Stack(
alignment: Alignment.topCenter,
children: [
// TODO Prints all 8s ???!!!
IconButton(
icon: Icon(Icons.add_location),
color: Colors.greenAccent,
iconSize: 30,
onPressed: () {},
),
Text(
num.toString(),
style: TextStyle(color: Colors.red, fontSize: 25),
), // TODO : Displayed number is wrong
],
),
);
trackedPoints.add(trackedPoint);
num ;
}
// });
}
это консольная печать:
I/flutter (24597): @@@@@ num is 2
I/flutter (24597): @@@@@ num is 3
I/flutter (24597): @@@@@ num is 4
I/flutter (24597): @@@@@ num is 5
I/flutter (24597): @@@@@ num is 6
I/flutter (24597): @@@@@ num is 7
и это результирующий отображаемый маршрут с маркерами, отображающими число 8:
Ответ №1:
Это происходит потому builder
, что метод the Marker
вызывается только тогда, когда MarkerLayer
он отображается на экране. Поэтому ваша num
переменная достигнет своего максимума до вызова метода builder, следовательно, все маркеры будут одинаковыми num
.
Я не думаю, что есть хороший способ добиться того, чего вы хотите, с текущим flutter_map
пакетом. MarkerLayer
Единственный вызов builder с контекстом, поэтому для достижения этой цели вам нужны какие-то другие средства. Проблема в том, что конструктор маркеров не имеет возможности получить доступ к связанным данным маркера.
Возможно, решение кроется в этом комментарии к проблеме на Github. Однако это решение перестраивает всю карту при смене маркеров. В противном случае, возможно, было бы лучше открыть проблему в репозитории flutter_map
Github самостоятельно.
Комментарии:
1. действительно. Похоже, мне придется создать пользовательский виджет, как я делал это для других маркеров. Приветствия.
2. Если у вас есть решение вашего вопроса, пожалуйста, добавьте его в качестве ответа самостоятельно (или отредактируйте мой), чтобы другие, столкнувшиеся с той же проблемой, могли извлечь выгоду.
3. Конечно .. как только у меня будет код для загрузки в качестве ответа, я, конечно, сделаю это.