У меня есть приложение, которое считывает данные о парковках с базы данных и показывает некоторые метки на карте. Теперь приложение показывает только метки для парковок, но я также хочу добавить на карту метки с каждой отдельной парковки, сохраненной в подколлекции лотов коллекции Parkings. Как я могу это сделать?
maps.dart:
class StoreMap extends StatelessWidget {
StoreMap({
Key key,
@required this.documents,
@required this.initialPosition,
}) : super(key: key);
final List<DocumentSnapshot> documents;
final LatLng initialPosition;
final Completer<GoogleMapController> _controller = Completer();
static final CameraPosition _initialPosition = CameraPosition(
target: LatLng(45.791789, 24.150390),
zoom: 16,
);
@override
Widget build(BuildContext context) {
return Scaffold(
body: GoogleMap(
mapType: MapType.hybrid,
initialCameraPosition: _initialPosition,
onMapCreated: (GoogleMapController controller) {
_controller.complete(controller);
},
myLocationEnabled: true,
markers:documents.map((document) => new Marker(
markerId: MarkerId(document.get('name')),
position: LatLng(
document.get('location').latitude,
document.get('location').longitude,
),
onTap: () => _changeMap(LatLng(
document.get('location').latitude,
document.get('location').longitude,
)),
infoWindow: InfoWindow(
title: document.get('name'),
snippet: document.get('numberOfLots')),
icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueViolet)),
)
.toSet()
),
floatingActionButton: FloatingActionButton(
onPressed: _currentLocation,
child: Icon(Icons.location_searching),
backgroundColor: Colors.deepPurple[400],
),
);
}
document.collection (лоты) .get (‘location’). latitude не работает, потому что вы не указали никаких документов после сбора (лотов) — person Andreea Purta schedule 03.09.2020
Запись document.collection (лоты) .document (h6nU1Gyx4Tlb5rpGYi5e) .get (‘location’). Latitude тоже не работает — person Andreea Purta schedule 03.09.2020
Причина, по которой
document.collection("lots").document("DocumentId").get('location').latitude
не работает, заключается в том, что вы не должны передавать имя поля для получения метода. также в вашем коде документ — это просто снимок документа, поэтому вам нужно получить идентификатор этого документа, а затем получить доступ к его подколлекции и поддокументам.Вы можете сделать что-то вроде этого:
get () вернет
Future<DocumentSnapshot>
, и поэтому мы используем .then () после get (), чтобы функция запускалась только при получении данныхОбновление. Чтобы увидеть маркеры на карте, мы помещаем приведенный выше код в функцию, которая возвращает
Future<List<Marker>>
. когда возвращается результат, вы можете вызвать setState и использовать обновленный список в дереве виджетов.Лучше использовать async / await вместо
then
, поскольку это заставляет программу получать результат из будущее в первую очередь.Мы вызываем эту функцию в
initState()
. Вам необходимо преобразоватьStoreMap
вStatefullWidget
, чтобы иметь возможность вызыватьsetState
и использоватьinitState
:И ваш полный код должен выглядеть примерно так:
Карта Google показывает один маркер для маркеров с одинаковым идентификатором, поэтому мы используем
markerId
, чтобы присвоить каждому маркеру уникальный идентификатор и увидеть все маркеры.Я получаю эту ошибку: метод «коллекция» не определен для типа «DocumentSnapshot». \ NПопробуйте исправить имя на имя существующего метода или определить метод с именем «коллекция». — person Andreea Purta; 03.09.2020
взгляните на мое обновленное решение и проверьте, работает ли оно — person Andreea Purta; 04.09.2020
Я добавил это в функцию. И я могу видеть широту на моей консоли, но я не знаю, как подключить ее к LatLong (…) в маркерах, чтобы отобразить их в пользовательском интерфейсе. — person Andreea Purta; 04.09.2020
вы можете получить координаты с помощью этого кода. Вы также можете создать функцию с тем же кодом, но она должна возвращать список маркеров, поэтому вам нужно создать маркеры в функции. затем используйте этот список и создайте маркеры в дереве виджетов. вы можете вызвать функцию в initState и вызвать setState, когда у вас есть список маркеров — person Andreea Purta; 04.09.2020
Я пробовал это (см. Последнюю добавленную мной треску), но маркеры не появляются. — person Andreea Purta; 04.09.2020
взгляните на мой обновленный ответ и посмотрите, поможет ли он — person Andreea Purta; 04.09.2020
Большое спасибо за ваше терпение и помощь. Они все еще не появляются. Пожалуйста, посмотрите мое последнее обновление. Нет ошибки в консоли отладки. — person Andreea Purta; 05.09.2020
Я думаю, что не назвал маркеры прямо в дереве виджетов — person Andreea Purta; 05.09.2020
Взгляните на stackoverflow.com/questions/55000043/ — person Andreea Purta; 05.09.2020
Я пробовал с маркерами: Установите ‹Marker› .of (маркеры). Еще ничего — person Andreea Purta; 05.09.2020
Позвольте нам продолжить это обсуждение в чате. — person Andreea Purta; 05.09.2020