map_widget.dart 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. import 'dart:convert';
  2. import 'package:flutter/cupertino.dart';
  3. import 'package:flutter/foundation.dart';
  4. import 'package:flutter/gestures.dart';
  5. import 'package:flutter/rendering.dart';
  6. import 'package:flutter/services.dart';
  7. import 'package:flutter_map/src/consts/map_constants.dart';
  8. import 'package:flutter_map/src/consts/marker_type.dart';
  9. import 'package:flutter_map/src/core/map_controller.dart';
  10. import 'package:flutter_map/src/entity/marker.dart';
  11. import '../../flutter_map.dart';
  12. import '../entity/polyline.dart';
  13. class MapWidget extends StatefulWidget {
  14. final MapBaseController? controller;
  15. final MarkerTapCallback? onMarkerTap;
  16. final List<Marker>? markers;
  17. final List<Polyline>? polyline;
  18. final MapPadding? mapPadding;
  19. final bool isAnimateCamera;
  20. final bool? isShowLogo;
  21. final bool? interactionIsEnabled;
  22. const MapWidget({
  23. super.key,
  24. this.controller,
  25. this.onMarkerTap,
  26. this.mapPadding,
  27. this.markers,
  28. this.isAnimateCamera = true,
  29. this.isShowLogo,
  30. this.interactionIsEnabled,
  31. this.polyline,
  32. });
  33. @override
  34. State<MapWidget> createState() => _MapWidgetState();
  35. }
  36. class _MapWidgetState extends State<MapWidget> {
  37. final String mapViewType = MapConstants.mapWidgetViewType;
  38. final List<LatLng> cameraPoints = [];
  39. @override
  40. void didUpdateWidget(covariant MapWidget oldWidget) {
  41. super.didUpdateWidget(oldWidget);
  42. cameraPoints.clear();
  43. if (oldWidget.markers != widget.markers) {
  44. if (widget.markers == null || widget.markers!.isEmpty) {
  45. widget.controller?.clearAllMarkers();
  46. } else {
  47. showMarker();
  48. }
  49. }
  50. if (oldWidget.polyline != widget.polyline) {
  51. widget.controller?.clearAllPolylines();
  52. showPolyline();
  53. }
  54. animateCamera();
  55. }
  56. void showMarker() {
  57. if (widget.markers == null || widget.markers!.isEmpty) {
  58. return;
  59. }
  60. final markerPoints = widget.markers
  61. ?.map((marker) =>
  62. LatLng(latitude: marker.latitude, longitude: marker.longitude))
  63. .toList();
  64. cameraPoints.addAll(markerPoints ?? []);
  65. widget.controller?.replaceAllMarkers(widget.markers ?? []);
  66. }
  67. void showPolyline() {
  68. if (widget.polyline == null || widget.polyline!.isEmpty) {
  69. return;
  70. }
  71. for (var line in widget.polyline!) {
  72. if (line.points.isNotEmpty) {
  73. cameraPoints.add(line.points.first);
  74. widget.controller?.addPolyline(line, isAnimateCamera: false);
  75. }
  76. }
  77. }
  78. void animateCamera() {
  79. if (cameraPoints.isNotEmpty) {
  80. widget.controller
  81. ?.moveToSuitableLocation(cameraPoints, mapPadding: widget.mapPadding);
  82. }
  83. }
  84. @override
  85. void initState() {
  86. super.initState();
  87. if (widget.isShowLogo != null) {
  88. widget.controller?.setMapLogoVisible(widget.isShowLogo!);
  89. }
  90. if (widget.interactionIsEnabled != null) {
  91. widget.controller?.setMapInteractionEnabled(widget.interactionIsEnabled!);
  92. }
  93. showMarker();
  94. showPolyline();
  95. animateCamera();
  96. }
  97. @override
  98. Widget build(BuildContext context) {
  99. debugPrint(
  100. 'MapWidget...build...mapViewType==>$mapViewType,defaultTargetPlatform==>$defaultTargetPlatform');
  101. if (defaultTargetPlatform == TargetPlatform.android) {
  102. return PlatformViewLink(
  103. surfaceFactory: (context, controller) {
  104. return AndroidViewSurface(
  105. controller: controller as AndroidViewController,
  106. gestureRecognizers: const <Factory<
  107. OneSequenceGestureRecognizer>>{},
  108. hitTestBehavior: PlatformViewHitTestBehavior.opaque,
  109. );
  110. },
  111. onCreatePlatformView: onCreatePlatformView,
  112. viewType: mapViewType);
  113. } else if (defaultTargetPlatform == TargetPlatform.iOS) {
  114. return UiKitView(
  115. viewType: mapViewType,
  116. onPlatformViewCreated: onPlatformViewCreated,
  117. creationParamsCodec: const StandardMessageCodec(),
  118. );
  119. }
  120. return Text('当前平台:$defaultTargetPlatform, 不支持使用地图插件');
  121. }
  122. PlatformViewController onCreatePlatformView(
  123. PlatformViewCreationParams params) {
  124. return PlatformViewsService.initSurfaceAndroidView(
  125. id: params.id,
  126. viewType: mapViewType,
  127. layoutDirection: TextDirection.ltr,
  128. creationParams: <String, dynamic>{},
  129. creationParamsCodec: const StandardMessageCodec(),
  130. )
  131. ..addOnPlatformViewCreatedListener(params.onPlatformViewCreated)
  132. ..addOnPlatformViewCreatedListener(onPlatformViewCreated)
  133. ..create();
  134. }
  135. Future<void> onPlatformViewCreated(int viewId) async {
  136. MethodChannel mapChannel =
  137. MethodChannel('${MapConstants.mapViewChannelName}$viewId');
  138. widget.controller?.setChannel(mapChannel);
  139. mapChannel.setMethodCallHandler(_mapMethodCallHandler);
  140. }
  141. Future<dynamic> _mapMethodCallHandler(MethodCall call) async {
  142. debugPrint(
  143. '_mapMethodCallHandler...call.method==>${call.method},call.arguments==>${call.arguments}');
  144. switch (call.method) {
  145. case MapConstants.methodMarkerOnTap:
  146. Map<String, dynamic> jsonMap = jsonDecode(call.arguments);
  147. Marker marker = Marker.fromJson(jsonMap);
  148. widget.onMarkerTap?.call(marker);
  149. break;
  150. }
  151. }
  152. }