Флаттер: Как добавить маркер в Google Maps с помощью нового API-маркера?
mapController.addMarker(
MarkerOptions(
position: LatLng(37.4219999, -122.0862462),
),
);
Я видел этот фрагмент кода в записи блога и пытаюсь добавить маркеры в Карты Google.
Метод addMarker не определен для класса "GoogleMapController".
Я думаю, что библиотека изменилась, и я хочу знать, каков новый способ сделать это, я посмотрел в файле controller.dart и справочнике API, но не смог понять это.
Я был бы рад увидеть некоторые учебники и посты в блоге об этом, не стесняйтесь поделиться.
3 ответа
Да, API карт Google изменился, и API Маркеров основан на виджетах, а не на контроллере.
По CHANGELOG.md
"Срочные изменения. Изменил API-интерфейс маркера на виджет, он был основан на контроллере. Также изменил пример приложения для учета того же".
Я копирую некоторые фрагменты кода из примера приложения github, которые я считаю важными для вас
Map<MarkerId, Marker> markers = <MarkerId, Marker>{}; // CLASS MEMBER, MAP OF MARKS
void _add() {
var markerIdVal = MyWayToGenerateId();
final MarkerId markerId = MarkerId(markerIdVal);
// creating a new MARKER
final Marker marker = Marker(
markerId: markerId,
position: LatLng(
center.latitude + sin(_markerIdCounter * pi / 6.0) / 20.0,
center.longitude + cos(_markerIdCounter * pi / 6.0) / 20.0,
),
infoWindow: InfoWindow(title: markerIdVal, snippet: '*'),
onTap: () {
_onMarkerTapped(markerId);
},
);
setState(() {
// adding a new marker to map
markers[markerId] = marker;
});
}
GoogleMap(
onMapCreated: _onMapCreated,
initialCameraPosition: const CameraPosition(
target: LatLng(-33.852, 151.211),
zoom: 11.0,
),
// TODO(iskakaushik): Remove this when collection literals makes it to stable.
// https://github.com/flutter/flutter/issues/28312
// ignore: prefer_collection_literals
markers: Set<Marker>.of(markers.values), // YOUR MARKS IN MAP
)
Я советую вам посмотреть пример приложения здесь. Там обновляется до нового API.
Я сделал ниже пример из google codelabs.
Map<MarkerId, Marker> markers = <MarkerId, Marker>{};
LatLng _center = LatLng(9.669111, 80.014007);
onMap создал добавить один статический маркер
void _onMapCreated(GoogleMapController controller) {
mapController = controller;
final marker = Marker(
markerId: MarkerId('place_name'),
position: LatLng(9.669111, 80.014007),
// icon: BitmapDescriptor.,
infoWindow: InfoWindow(
title: 'title',
snippet: 'address',
),
);
setState(() {
markers[MarkerId('place_name')] = marker;
});
}
виджет карты гугл:
GoogleMap(
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(
target: _center,
zoom: 14.0,
),
markers: markers.values.toSet(),
),
Вот ваше решение.
Итак, это вывод приведенного ниже исходного кода: Посмотреть
Исходный код:
class MapScreen extends StatefulWidget {
const MapScreen({super.key});
@override
State<MapScreen> createState() => _MapScreenState();
}
class _MapScreenState extends State<MapScreen> {
bool visibility = false;
Map<MarkerId, Marker> markers = <MarkerId, Marker>{};
static const CameraPosition _kGooglePlex = CameraPosition(
target: LatLng(37.42796133580664, -122.085749655962),
zoom: 14.4746,
);
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
child: Icon(visibility ? Icons.visibility_off : Icons.visibility),
onPressed: () {
visibility = !visibility;
_add();
setState(() {});
},
),
body: SafeArea(
child: GoogleMap(
initialCameraPosition: _kGooglePlex,
markers: markers.values.toSet(),
),
),
);
}
void _add() {
const marker1 = Marker(
markerId: MarkerId('place_name1'),
position: LatLng(37.42796133580664, -122.085749655962),
);
const marker2 = Marker(
markerId: MarkerId('place_name2'),
position: LatLng(37.422131, -122.084801),
);
if (visibility) {
markers[const MarkerId('place_name1')] = marker1;
markers[const MarkerId('place_name2')] = marker2;
} else {
var blankMarker = const Marker(markerId: MarkerId(""));
markers[const MarkerId('place_name1')] = blankMarker;
markers[const MarkerId('place_name2')] = blankMarker;
}
return;
}
}