From 8c2b86724b8ac46c625692314a98a7ae41b7e0f1 Mon Sep 17 00:00:00 2001 From: Kuloud Date: Sat, 30 Dec 2023 16:42:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=93=E5=B1=95=E6=8F=92=E4=BB=B6=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/lib/data/demos.dart | 17 +++- example/lib/main.dart | 12 ++- example/lib/pages/map/map_all_config.dart | 12 +-- .../pages/map/map_with_extension_page.dart | 71 ++++++++++++++++ example/lib/pages/map/show_map_page.dart | 26 +++--- example/pubspec.yaml | 4 +- lib/amap_map.dart | 1 + lib/src/amap_controller.dart | 23 ------ lib/src/amap_loader.dart | 58 +++++++++++++ lib/src/amap_widget.dart | 81 +++++++++++-------- lib/src/core/method_channel_amap_map.dart | 23 ------ lib/src/types/amap_extension.dart | 30 +++++++ lib/src/types/extension_context.dart | 18 +++++ lib/src/types/types.dart | 2 + pubspec.yaml | 2 +- 15 files changed, 278 insertions(+), 102 deletions(-) create mode 100644 example/lib/pages/map/map_with_extension_page.dart create mode 100644 lib/src/amap_loader.dart create mode 100644 lib/src/types/amap_extension.dart create mode 100644 lib/src/types/extension_context.dart diff --git a/example/lib/data/demos.dart b/example/lib/data/demos.dart index 41d1c4c..364dc14 100644 --- a/example/lib/data/demos.dart +++ b/example/lib/data/demos.dart @@ -4,6 +4,7 @@ import 'package:amap_map_example/main.dart'; import 'package:amap_map_example/pages/interactive/map_ui_options.dart'; import 'package:amap_map_example/pages/map/limit_map_bounds.dart'; import 'package:amap_map_example/pages/map/map_my_location.dart'; +import 'package:amap_map_example/pages/map/map_with_extension_page.dart'; import 'package:amap_map_example/pages/map/show_map_page.dart'; import 'package:amap_map_example/pages/overlays/marker_config.dart'; import 'package:flutter/material.dart'; @@ -16,7 +17,8 @@ class DemoConfiguration { final WidgetBuilder buildRoute; } -List allDemos() => mapDemos() + interactiveDemos() + overlayDemos(); +List allDemos() => + mapDemos() + interactiveDemos() + overlayDemos() + extensionDemos(); List mapDemos() { return [ @@ -73,6 +75,19 @@ List overlayDemos() { ]; } +List extensionDemos() { + return [ + Demo( + title: '辅助信息获取', + category: DemoCategory.extension, + subtitle: '获取审图号', + slug: 'extension-info', + configurations: [ + DemoConfiguration(buildRoute: (context) => MapWithExtensionPage()) + ]) + ]; +} + Map slugToDemo(BuildContext context) { return LinkedHashMap.fromIterable( allDemos(), diff --git a/example/lib/main.dart b/example/lib/main.dart index 004653e..799b3ab 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -109,6 +109,13 @@ class _AMapDemoState extends State category: DemoCategory.overlay, demos: overlayDemos(), )), + AnimatedCategoryItem( + startDelayFraction: 0.15, + controller: _animationController, + child: CategoryListItem( + category: DemoCategory.extension, + demos: extensionDemos(), + )), ], ), ); @@ -134,7 +141,8 @@ void main() { enum DemoCategory { basic, interactive, - overlay; + overlay, + extension; String toDisplayTitle() { switch (this) { @@ -144,6 +152,8 @@ enum DemoCategory { return '与地图交互'; case overlay: return '在地图上绘制'; + case extension: + return '拓展插件'; } } } diff --git a/example/lib/pages/map/map_all_config.dart b/example/lib/pages/map/map_all_config.dart index e1c3f83..e9143d2 100644 --- a/example/lib/pages/map/map_all_config.dart +++ b/example/lib/pages/map/map_all_config.dart @@ -355,12 +355,12 @@ class _MapUiBodyState extends State { } void printApprovalNumber() async { - String mapContentApprovalNumber = - (await _controller.getMapContentApprovalNumber())!; - String satelliteImageApprovalNumber = - (await _controller.getSatelliteImageApprovalNumber())!; - print('地图审图号(普通地图): $mapContentApprovalNumber'); - print('地图审图号(卫星地图): $satelliteImageApprovalNumber'); + // String mapContentApprovalNumber = + // (await _controller.getMapContentApprovalNumber())!; + // String satelliteImageApprovalNumber = + // (await _controller.getSatelliteImageApprovalNumber())!; + // print('地图审图号(普通地图): $mapContentApprovalNumber'); + // print('地图审图号(卫星地图): $satelliteImageApprovalNumber'); } Widget createGridView(List widgets) { diff --git a/example/lib/pages/map/map_with_extension_page.dart b/example/lib/pages/map/map_with_extension_page.dart new file mode 100644 index 0000000..c3c825e --- /dev/null +++ b/example/lib/pages/map/map_with_extension_page.dart @@ -0,0 +1,71 @@ +import 'package:amap_map_extensions/amap_map_extensions.dart'; +import 'package:flutter/material.dart'; + +import 'dart:typed_data'; + +import 'package:amap_map/amap_map.dart'; + +class MapWithExtensionPage extends StatefulWidget { + @override + State createState() => _MapWithExtensionPageState(); +} + +class _MapWithExtensionPageState extends State { + List _approvalNumberWidget = []; + final _extension = AmapMapExtensions(); + + @override + Widget build(BuildContext context) { + final AMapWidget map = AMapWidget( + onMapCreated: onMapCreated, + extensions: [_extension], + ); + + return ConstrainedBox( + constraints: BoxConstraints.expand(), + child: Stack( + alignment: Alignment.center, + children: [ + Container( + height: MediaQuery.of(context).size.height, + width: MediaQuery.of(context).size.width, + child: map, + ), + Positioned( + right: 10, + bottom: 15, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: _approvalNumberWidget), + )) + ], + ), + ); + } + + late AMapController _mapController; + void onMapCreated(AMapController controller) { + setState(() { + _mapController = controller; + getApprovalNumber(); + }); + } + + /// 获取审图号 + void getApprovalNumber() async { + //普通地图审图号 + String mapContentApprovalNumber = + (await _extension.getMapContentApprovalNumber())!; + //卫星地图审图号 + String satelliteImageApprovalNumber = + (await _extension.getSatelliteImageApprovalNumber())!; + setState(() { + _approvalNumberWidget.add(Text(mapContentApprovalNumber)); + _approvalNumberWidget.add(Text(satelliteImageApprovalNumber)); + }); + print('地图审图号(普通地图): $mapContentApprovalNumber'); + print('地图审图号(卫星地图): $satelliteImageApprovalNumber'); + } +} diff --git a/example/lib/pages/map/show_map_page.dart b/example/lib/pages/map/show_map_page.dart index ba5a240..9800a34 100644 --- a/example/lib/pages/map/show_map_page.dart +++ b/example/lib/pages/map/show_map_page.dart @@ -43,23 +43,23 @@ class _ShowMapPageState extends State { void onMapCreated(AMapController controller) { setState(() { _mapController = controller; - getApprovalNumber(); + // getApprovalNumber(); }); } /// 获取审图号 void getApprovalNumber() async { - //普通地图审图号 - String mapContentApprovalNumber = - (await _mapController.getMapContentApprovalNumber())!; - //卫星地图审图号 - String satelliteImageApprovalNumber = - (await _mapController.getSatelliteImageApprovalNumber())!; - setState(() { - _approvalNumberWidget.add(Text(mapContentApprovalNumber)); - _approvalNumberWidget.add(Text(satelliteImageApprovalNumber)); - }); - print('地图审图号(普通地图): $mapContentApprovalNumber'); - print('地图审图号(卫星地图): $satelliteImageApprovalNumber'); + // //普通地图审图号 + // String mapContentApprovalNumber = + // (await _mapController.getMapContentApprovalNumber())!; + // //卫星地图审图号 + // String satelliteImageApprovalNumber = + // (await _mapController.getSatelliteImageApprovalNumber())!; + // setState(() { + // _approvalNumberWidget.add(Text(mapContentApprovalNumber)); + // _approvalNumberWidget.add(Text(satelliteImageApprovalNumber)); + // }); + // print('地图审图号(普通地图): $mapContentApprovalNumber'); + // print('地图审图号(卫星地图): $satelliteImageApprovalNumber'); } } diff --git a/example/pubspec.yaml b/example/pubspec.yaml index c7382c1..4362cee 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -23,8 +23,8 @@ dependencies: # the parent directory to use the current plugin's version. path: ../ -# amap_map: -# path: ../../amap_map + amap_map_extensions: + path: ../../amap_map_extensions dev_dependencies: diff --git a/lib/amap_map.dart b/lib/amap_map.dart index 079e17c..05b7e53 100644 --- a/lib/amap_map.dart +++ b/lib/amap_map.dart @@ -18,3 +18,4 @@ export 'package:amap_map/src/types/types.dart'; part 'src/amap_initializer.dart'; part 'src/amap_controller.dart'; part 'src/amap_widget.dart'; +part 'src/amap_loader.dart'; diff --git a/lib/src/amap_controller.dart b/lib/src/amap_controller.dart index 603412a..8fc8cff 100644 --- a/lib/src/amap_controller.dart +++ b/lib/src/amap_controller.dart @@ -115,34 +115,11 @@ class AMapController { mapId: mapId, animated: animated, duration: duration); } - ///设置地图每秒渲染的帧数 - Future setRenderFps(int fps) { - return _methodChannel.setRenderFps(fps, mapId: mapId); - } - ///地图截屏 Future takeSnapshot() { return _methodChannel.takeSnapshot(mapId: mapId); } - /// 获取地图审图号(普通地图) - /// - /// 任何使用高德地图API调用地图服务的应用必须在其应用中对外透出审图号 - /// - /// 如高德地图在"关于"中体现 - Future getMapContentApprovalNumber() { - return _methodChannel.getMapContentApprovalNumber(mapId: mapId); - } - - /// 获取地图审图号(卫星地图) - /// - /// 任何使用高德地图API调用地图服务的应用必须在其应用中对外透出审图号 - /// - /// 如高德地图在"关于"中体现 - Future getSatelliteImageApprovalNumber() { - return _methodChannel.getSatelliteImageApprovalNumber(mapId: mapId); - } - /// 清空缓存 Future clearDisk() { return _methodChannel.clearDisk(mapId: mapId); diff --git a/lib/src/amap_loader.dart b/lib/src/amap_loader.dart new file mode 100644 index 0000000..cff19b3 --- /dev/null +++ b/lib/src/amap_loader.dart @@ -0,0 +1,58 @@ +part of amap_map; + +class AMapLoader extends StatefulWidget { + const AMapLoader( + {super.key, required this.mapView, required this.extensions}); + + final Widget mapView; + final List extensions; + + @override + State createState() => _AMapLoaderState(); + + static void prepare() { + // TODO loop handle with extensions + } + + Widget buildFromExtension(AMapContext aMapContext) { + // TODO loop handle with extensions + return mapView; + } + + void prepareFromExtension(AMapContext aMapContext) { + for (var e in extensions) { + e.prepare(aMapContext); + } + } +} + +class _AMapLoaderState extends State { + @override + void didChangeDependencies() { + final aMapContext = AMapContext( + buildContext: context, + currentStep: CurrentStep.preparing, + loader: widget); + widget.prepareFromExtension(aMapContext); + super.didChangeDependencies(); + } + + @override + void dispose() { + for (var e in widget.extensions) { + e.onDispose(); + } + super.dispose(); + } + + @override + Widget build(BuildContext context) { + // Set the extension context for this node. + final aMapContext = AMapContext( + buildContext: context, + currentStep: CurrentStep.building, + loader: widget); + + return widget.buildFromExtension(aMapContext); + } +} diff --git a/lib/src/amap_widget.dart b/lib/src/amap_widget.dart index ccafafb..9580e4a 100644 --- a/lib/src/amap_widget.dart +++ b/lib/src/amap_widget.dart @@ -97,6 +97,8 @@ class AMapWidget extends StatefulWidget { ///需要应用到地图上的手势集合 final Set> gestureRecognizers; + final List extensions; + /// 创建一个展示高德地图的widget /// /// 在app首次启动时必须传入高德合规声明配置[privacyStatement],后续如果没有变化不需要重复设置 @@ -108,37 +110,38 @@ class AMapWidget extends StatefulWidget { /// 高德SDK合规使用方案请参考:https://lbs.amap.com/news/sdkhgsy /// /// [AssertionError] will be thrown if [initialCameraPosition] is null; - const AMapWidget({ - Key? key, - this.initialCameraPosition = - const CameraPosition(target: LatLng(39.909187, 116.397451), zoom: 10), - this.mapType = MapType.normal, - this.buildingsEnabled = true, - this.compassEnabled = false, - this.labelsEnabled = true, - this.limitBounds, - this.minMaxZoomPreference, - this.rotateGesturesEnabled = true, - this.scaleEnabled = true, - this.scrollGesturesEnabled = true, - this.tiltGesturesEnabled = true, - this.touchPoiEnabled = true, - this.trafficEnabled = false, - this.zoomGesturesEnabled = true, - this.onMapCreated, - this.gestureRecognizers = const >{}, - this.customStyleOptions, - this.myLocationStyleOptions, - this.onCameraMove, - this.onCameraMoveEnd, - this.onLocationChanged, - this.onTap, - this.onLongPress, - this.onPoiTouched, - this.markers = const {}, - this.polylines = const {}, - this.polygons = const {}, - }) : super(key: key); + const AMapWidget( + {Key? key, + this.initialCameraPosition = + const CameraPosition(target: LatLng(39.909187, 116.397451), zoom: 10), + this.mapType = MapType.normal, + this.buildingsEnabled = true, + this.compassEnabled = false, + this.labelsEnabled = true, + this.limitBounds, + this.minMaxZoomPreference, + this.rotateGesturesEnabled = true, + this.scaleEnabled = true, + this.scrollGesturesEnabled = true, + this.tiltGesturesEnabled = true, + this.touchPoiEnabled = true, + this.trafficEnabled = false, + this.zoomGesturesEnabled = true, + this.onMapCreated, + this.gestureRecognizers = const >{}, + this.customStyleOptions, + this.myLocationStyleOptions, + this.onCameraMove, + this.onCameraMoveEnd, + this.onLocationChanged, + this.onTap, + this.onLongPress, + this.onPoiTouched, + this.markers = const {}, + this.polylines = const {}, + this.polygons = const {}, + this.extensions = const []}) + : super(key: key); /// @override @@ -149,6 +152,7 @@ class _MapState extends State { Map _markers = {}; Map _polylines = {}; Map _polygons = {}; + Map _extensions = {}; final Completer _controller = Completer(); late _AMapOptions _mapOptions; @@ -169,16 +173,23 @@ class _MapState extends State { widget.gestureRecognizers, onPlatformViewCreated, ); - return mapView; + + return AMapLoader( + mapView: mapView, + extensions: widget.extensions, + ); } @override void initState() { + AMapLoader.prepare(); super.initState(); _mapOptions = _AMapOptions.fromWidget(widget); _markers = keyByMarkerId(widget.markers); _polygons = keyByPolygonId(widget.polygons); _polylines = keyByPolylineId(widget.polylines); + + _extensions = keyByExtensionId(widget.extensions); print('initState AMapWidget'); } @@ -218,6 +229,12 @@ class _MapState extends State { this, ); _controller.complete(controller); + + if (_extensions.isNotEmpty) { + await Future.forEach( + _extensions.values, (e) => e.bindMethodChannel(controller.channel)); + } + final MapCreatedCallback? _onMapCreated = widget.onMapCreated; if (_onMapCreated != null) { _onMapCreated(controller); diff --git a/lib/src/core/method_channel_amap_map.dart b/lib/src/core/method_channel_amap_map.dart index f68f449..d5ec217 100644 --- a/lib/src/core/method_channel_amap_map.dart +++ b/lib/src/core/method_channel_amap_map.dart @@ -235,14 +235,6 @@ class MethodChannelAMapFlutterMap implements AMapFlutterPlatform { }); } - ///设置地图每秒渲染的帧数 - Future setRenderFps(int fps, {required int mapId}) { - return channel(mapId) - .invokeMethod('map#setRenderFps', { - 'fps': fps, - }); - } - ///截屏 Future takeSnapshot({ required int mapId, @@ -250,21 +242,6 @@ class MethodChannelAMapFlutterMap implements AMapFlutterPlatform { return channel(mapId).invokeMethod('map#takeSnapshot'); } - //获取地图审图号(普通地图) - Future getMapContentApprovalNumber({ - required int mapId, - }) { - return channel(mapId).invokeMethod('map#contentApprovalNumber'); - } - - //获取地图审图号(卫星地图) - Future getSatelliteImageApprovalNumber({ - required int mapId, - }) { - return channel(mapId) - .invokeMethod('map#satelliteImageApprovalNumber'); - } - Future clearDisk({ required int mapId, }) { diff --git a/lib/src/types/amap_extension.dart b/lib/src/types/amap_extension.dart new file mode 100644 index 0000000..b52f40b --- /dev/null +++ b/lib/src/types/amap_extension.dart @@ -0,0 +1,30 @@ +import 'package:flutter/services.dart'; + +import 'types.dart'; + +abstract class AMapExtension { + late String _id; + + String get id => _id; + + AMapExtension() { + this._id = this.hashCode.toString(); + } + + void prepare(AMapContext aMapContext) {} + + void onDispose() {} + + bindMethodChannel(MethodChannel channel) {} +} + +Map keyByExtensionId( + Iterable extensions) { + // ignore: unnecessary_null_comparison + if (extensions == null) { + return {}; + } + return Map.fromEntries(extensions.map( + (AMapExtension extension) => + MapEntry(extension.id, extension))); +} diff --git a/lib/src/types/extension_context.dart b/lib/src/types/extension_context.dart new file mode 100644 index 0000000..a76f8d2 --- /dev/null +++ b/lib/src/types/extension_context.dart @@ -0,0 +1,18 @@ +import 'package:amap_map/amap_map.dart'; +import 'package:flutter/material.dart'; + +class AMapContext { + final BuildContext buildContext; + final CurrentStep currentStep; + final AMapLoader loader; + + AMapContext( + {required this.buildContext, + required this.currentStep, + required this.loader}); +} + +enum CurrentStep { + preparing, + building, +} diff --git a/lib/src/types/types.dart b/lib/src/types/types.dart index 154414b..c0c9c50 100644 --- a/lib/src/types/types.dart +++ b/lib/src/types/types.dart @@ -8,3 +8,5 @@ export 'polyline_updates.dart'; export 'polygon.dart'; export 'polygon_updates.dart'; export 'bitmap.dart'; +export 'extension_context.dart'; +export 'amap_extension.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index db2e87f..b32d659 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: amap_map description: Amap SDK Flutter plugin for integrating AMapSDK in iOS and Android applications. -version: 1.0.1 +version: 1.0.1+1 homepage: https://github.com/kuloud/amap_map issue_tracker: https://github.com/kuloud/amap_map/issues platforms: