map_controller.dart 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import 'dart:convert';
  2. import 'dart:io';
  3. import 'package:flutter/cupertino.dart';
  4. import 'package:flutter/services.dart';
  5. import 'package:flutter_map/flutter_map.dart';
  6. import 'package:flutter_map/src/consts/map_constants.dart';
  7. import 'package:flutter_map/src/entity/camera_position.dart';
  8. import 'package:flutter_map/src/entity/codable.dart';
  9. import 'package:flutter_map/src/entity/lat_lng.dart';
  10. import 'package:flutter_map/src/entity/marker.dart';
  11. import 'package:flutter_map/src/interface/map_fun_interface.dart';
  12. import 'package:flutter_map/src/interface/map_marker_interface.dart';
  13. import 'package:flutter_map/src/interface/map_polyline_interface.dart';
  14. import '../entity/map_padding.dart';
  15. class MapController
  16. implements MapMarkerInterface, MapFunInterface, MapPolylineInterface {
  17. final _pendingOperations = <Map<String, dynamic>>[];
  18. MethodChannel? _channel;
  19. bool _isDisposed = false;
  20. void setChannel(MethodChannel channel) {
  21. if (_isDisposed) return;
  22. _channel = channel;
  23. for (final op in _pendingOperations) {
  24. _executeMethod(op);
  25. }
  26. _pendingOperations.clear();
  27. }
  28. void _executeMethod(Map<String, dynamic> op) {
  29. _channel?.invokeMethod(op['method'], op['args']).catchError((e) {
  30. debugPrint('Method ${op['method']} failed: $e');
  31. });
  32. }
  33. void dispose() {
  34. _isDisposed = true;
  35. _pendingOperations.clear();
  36. _channel?.setMethodCallHandler(null);
  37. _channel = null;
  38. }
  39. @override
  40. void updateOrAddMarkers(List<Marker> markers) {
  41. if (_isDisposed || markers.isEmpty) return;
  42. final serialized = _encodeJson(markers);
  43. final params = {
  44. 'method': MapConstants.methodUpdateOrAddMarkers,
  45. 'args': serialized
  46. };
  47. debugPrint("updateOrAddMarkers...params==>$params");
  48. if (_channel != null) {
  49. _executeMethod(params);
  50. } else {
  51. _pendingOperations.add(params);
  52. }
  53. }
  54. @override
  55. void moveCamera(CameraPosition cameraPosition) {
  56. if (_isDisposed) return;
  57. final serialized = cameraPosition.toJson();
  58. final params = {
  59. 'method': MapConstants.methodMapMoveCamera,
  60. 'args': serialized
  61. };
  62. debugPrint("moveCamera...params==>$params");
  63. if (_channel != null) {
  64. _executeMethod(params);
  65. } else {
  66. _pendingOperations.add(params);
  67. }
  68. }
  69. @override
  70. void animateCamera(CameraPosition cameraPosition) {
  71. if (_isDisposed) return;
  72. final serialized = cameraPosition.toJson();
  73. final params = {
  74. 'method': MapConstants.methodMapAnimateCamera,
  75. 'args': serialized
  76. };
  77. debugPrint("animateCamera...params==>$params");
  78. if (_channel != null) {
  79. _executeMethod(params);
  80. } else {
  81. _pendingOperations.add(params);
  82. }
  83. }
  84. @override
  85. void updateOrAddMarker(Marker marker) {
  86. updateOrAddMarkers([marker]);
  87. }
  88. @override
  89. void replaceAllMarkers(List<Marker> markers) {
  90. if (_isDisposed) return;
  91. final serialized = _encodeJson(markers);
  92. final params = {
  93. 'method': MapConstants.methodReplaceAllMarkers,
  94. 'args': serialized
  95. };
  96. debugPrint("replaceAllMarkers...params==>$params");
  97. if (_channel != null) {
  98. _executeMethod(params);
  99. } else {
  100. _pendingOperations.add(params);
  101. }
  102. }
  103. @override
  104. void clearAllMarkers() {
  105. replaceAllMarkers([]);
  106. }
  107. @override
  108. void addPolyline(List<LatLng> points,
  109. {bool isAnimateCamera = true, MapPadding? mapPadding}) {
  110. if (_isDisposed || points.isEmpty) return;
  111. Map<String, dynamic> map = {};
  112. map['points'] = _encodeJson(points);
  113. map['isAnimateCamera'] = isAnimateCamera;
  114. if (mapPadding != null) {
  115. map['mapPadding'] = _encodeJson(mapPadding);
  116. }
  117. final params = {'method': MapConstants.methodAddPolyline, 'args': map};
  118. debugPrint("addPolyline...params==>$params");
  119. if (_channel != null) {
  120. _executeMethod(params);
  121. } else {
  122. _pendingOperations.add(params);
  123. }
  124. }
  125. @override
  126. void clear() {
  127. if (_isDisposed) return;
  128. clearAllMarkers();
  129. final params = {'method': MapConstants.methodMapClear, 'args': ''};
  130. debugPrint("clear...params==>$params");
  131. if (_channel != null) {
  132. _executeMethod(params);
  133. } else {
  134. _pendingOperations.add(params);
  135. }
  136. }
  137. /// iOS 需要一个Map 而不是json string
  138. dynamic _encodeJson(dynamic object) {
  139. // iOS平台直接返回对象或转换为JSON对象
  140. if (Platform.isIOS) {
  141. if (object is List) {
  142. return object.map((item) => item is Codable ? item.toJson() : item).toList();
  143. }
  144. return object is Codable ? object.toJson() : object;
  145. }
  146. // 其他平台序列化为JSON字符串
  147. return jsonEncode(object);
  148. }
  149. }