拓展插件支持

This commit is contained in:
Kuloud 2023-12-30 16:42:18 +08:00
parent 5abe4d7f6d
commit 8c2b86724b
15 changed files with 278 additions and 102 deletions

View File

@ -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/interactive/map_ui_options.dart';
import 'package:amap_map_example/pages/map/limit_map_bounds.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_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/map/show_map_page.dart';
import 'package:amap_map_example/pages/overlays/marker_config.dart'; import 'package:amap_map_example/pages/overlays/marker_config.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -16,7 +17,8 @@ class DemoConfiguration {
final WidgetBuilder buildRoute; final WidgetBuilder buildRoute;
} }
List<Demo> allDemos() => mapDemos() + interactiveDemos() + overlayDemos(); List<Demo> allDemos() =>
mapDemos() + interactiveDemos() + overlayDemos() + extensionDemos();
List<Demo> mapDemos() { List<Demo> mapDemos() {
return [ return [
@ -73,6 +75,19 @@ List<Demo> overlayDemos() {
]; ];
} }
List<Demo> extensionDemos() {
return [
Demo(
title: '辅助信息获取',
category: DemoCategory.extension,
subtitle: '获取审图号',
slug: 'extension-info',
configurations: [
DemoConfiguration(buildRoute: (context) => MapWithExtensionPage())
])
];
}
Map<String?, Demo> slugToDemo(BuildContext context) { Map<String?, Demo> slugToDemo(BuildContext context) {
return LinkedHashMap<String?, Demo>.fromIterable( return LinkedHashMap<String?, Demo>.fromIterable(
allDemos(), allDemos(),

View File

@ -109,6 +109,13 @@ class _AMapDemoState extends State<AMapDemo>
category: DemoCategory.overlay, category: DemoCategory.overlay,
demos: overlayDemos(), demos: overlayDemos(),
)), )),
AnimatedCategoryItem(
startDelayFraction: 0.15,
controller: _animationController,
child: CategoryListItem(
category: DemoCategory.extension,
demos: extensionDemos(),
)),
], ],
), ),
); );
@ -134,7 +141,8 @@ void main() {
enum DemoCategory { enum DemoCategory {
basic, basic,
interactive, interactive,
overlay; overlay,
extension;
String toDisplayTitle() { String toDisplayTitle() {
switch (this) { switch (this) {
@ -144,6 +152,8 @@ enum DemoCategory {
return '与地图交互'; return '与地图交互';
case overlay: case overlay:
return '在地图上绘制'; return '在地图上绘制';
case extension:
return '拓展插件';
} }
} }
} }

View File

@ -355,12 +355,12 @@ class _MapUiBodyState extends State<AllMapConfigDemoPage> {
} }
void printApprovalNumber() async { void printApprovalNumber() async {
String mapContentApprovalNumber = // String mapContentApprovalNumber =
(await _controller.getMapContentApprovalNumber())!; // (await _controller.getMapContentApprovalNumber())!;
String satelliteImageApprovalNumber = // String satelliteImageApprovalNumber =
(await _controller.getSatelliteImageApprovalNumber())!; // (await _controller.getSatelliteImageApprovalNumber())!;
print('地图审图号(普通地图): $mapContentApprovalNumber'); // print('地图审图号(普通地图): $mapContentApprovalNumber');
print('地图审图号(卫星地图): $satelliteImageApprovalNumber'); // print('地图审图号(卫星地图): $satelliteImageApprovalNumber');
} }
Widget createGridView(List<Widget> widgets) { Widget createGridView(List<Widget> widgets) {

View File

@ -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<StatefulWidget> createState() => _MapWithExtensionPageState();
}
class _MapWithExtensionPageState extends State<MapWithExtensionPage> {
List<Widget> _approvalNumberWidget = <Widget>[];
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');
}
}

View File

@ -43,23 +43,23 @@ class _ShowMapPageState extends State<ShowMapPage> {
void onMapCreated(AMapController controller) { void onMapCreated(AMapController controller) {
setState(() { setState(() {
_mapController = controller; _mapController = controller;
getApprovalNumber(); // getApprovalNumber();
}); });
} }
/// ///
void getApprovalNumber() async { void getApprovalNumber() async {
// // //
String mapContentApprovalNumber = // String mapContentApprovalNumber =
(await _mapController.getMapContentApprovalNumber())!; // (await _mapController.getMapContentApprovalNumber())!;
// // //
String satelliteImageApprovalNumber = // String satelliteImageApprovalNumber =
(await _mapController.getSatelliteImageApprovalNumber())!; // (await _mapController.getSatelliteImageApprovalNumber())!;
setState(() { // setState(() {
_approvalNumberWidget.add(Text(mapContentApprovalNumber)); // _approvalNumberWidget.add(Text(mapContentApprovalNumber));
_approvalNumberWidget.add(Text(satelliteImageApprovalNumber)); // _approvalNumberWidget.add(Text(satelliteImageApprovalNumber));
}); // });
print('地图审图号(普通地图): $mapContentApprovalNumber'); // print('地图审图号(普通地图): $mapContentApprovalNumber');
print('地图审图号(卫星地图): $satelliteImageApprovalNumber'); // print('地图审图号(卫星地图): $satelliteImageApprovalNumber');
} }
} }

View File

@ -23,8 +23,8 @@ dependencies:
# the parent directory to use the current plugin's version. # the parent directory to use the current plugin's version.
path: ../ path: ../
# amap_map: amap_map_extensions:
# path: ../../amap_map path: ../../amap_map_extensions
dev_dependencies: dev_dependencies:

View File

@ -18,3 +18,4 @@ export 'package:amap_map/src/types/types.dart';
part 'src/amap_initializer.dart'; part 'src/amap_initializer.dart';
part 'src/amap_controller.dart'; part 'src/amap_controller.dart';
part 'src/amap_widget.dart'; part 'src/amap_widget.dart';
part 'src/amap_loader.dart';

View File

@ -115,34 +115,11 @@ class AMapController {
mapId: mapId, animated: animated, duration: duration); mapId: mapId, animated: animated, duration: duration);
} }
///
Future<void> setRenderFps(int fps) {
return _methodChannel.setRenderFps(fps, mapId: mapId);
}
/// ///
Future<Uint8List?> takeSnapshot() { Future<Uint8List?> takeSnapshot() {
return _methodChannel.takeSnapshot(mapId: mapId); return _methodChannel.takeSnapshot(mapId: mapId);
} }
///
///
/// 使API调用地图服务的应用必须在其应用中对外透出审图号
///
/// "关于"
Future<String?> getMapContentApprovalNumber() {
return _methodChannel.getMapContentApprovalNumber(mapId: mapId);
}
/// )
///
/// 使API调用地图服务的应用必须在其应用中对外透出审图号
///
/// "关于"
Future<String?> getSatelliteImageApprovalNumber() {
return _methodChannel.getSatelliteImageApprovalNumber(mapId: mapId);
}
/// ///
Future<void> clearDisk() { Future<void> clearDisk() {
return _methodChannel.clearDisk(mapId: mapId); return _methodChannel.clearDisk(mapId: mapId);

58
lib/src/amap_loader.dart Normal file
View File

@ -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<AMapExtension> extensions;
@override
State<AMapLoader> 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<AMapLoader> {
@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);
}
}

View File

@ -97,6 +97,8 @@ class AMapWidget extends StatefulWidget {
/// ///
final Set<Factory<OneSequenceGestureRecognizer>> gestureRecognizers; final Set<Factory<OneSequenceGestureRecognizer>> gestureRecognizers;
final List<AMapExtension> extensions;
/// widget /// widget
/// ///
/// app首次启动时必须传入高德合规声明配置[privacyStatement], /// app首次启动时必须传入高德合规声明配置[privacyStatement],
@ -108,8 +110,8 @@ class AMapWidget extends StatefulWidget {
/// SDK合规使用方案请参考https://lbs.amap.com/news/sdkhgsy /// SDK合规使用方案请参考https://lbs.amap.com/news/sdkhgsy
/// ///
/// [AssertionError] will be thrown if [initialCameraPosition] is null; /// [AssertionError] will be thrown if [initialCameraPosition] is null;
const AMapWidget({ const AMapWidget(
Key? key, {Key? key,
this.initialCameraPosition = this.initialCameraPosition =
const CameraPosition(target: LatLng(39.909187, 116.397451), zoom: 10), const CameraPosition(target: LatLng(39.909187, 116.397451), zoom: 10),
this.mapType = MapType.normal, this.mapType = MapType.normal,
@ -138,7 +140,8 @@ class AMapWidget extends StatefulWidget {
this.markers = const <Marker>{}, this.markers = const <Marker>{},
this.polylines = const <Polyline>{}, this.polylines = const <Polyline>{},
this.polygons = const <Polygon>{}, this.polygons = const <Polygon>{},
}) : super(key: key); this.extensions = const []})
: super(key: key);
/// ///
@override @override
@ -149,6 +152,7 @@ class _MapState extends State<AMapWidget> {
Map<String, Marker> _markers = <String, Marker>{}; Map<String, Marker> _markers = <String, Marker>{};
Map<String, Polyline> _polylines = <String, Polyline>{}; Map<String, Polyline> _polylines = <String, Polyline>{};
Map<String, Polygon> _polygons = <String, Polygon>{}; Map<String, Polygon> _polygons = <String, Polygon>{};
Map<String, AMapExtension> _extensions = <String, AMapExtension>{};
final Completer<AMapController> _controller = Completer<AMapController>(); final Completer<AMapController> _controller = Completer<AMapController>();
late _AMapOptions _mapOptions; late _AMapOptions _mapOptions;
@ -169,16 +173,23 @@ class _MapState extends State<AMapWidget> {
widget.gestureRecognizers, widget.gestureRecognizers,
onPlatformViewCreated, onPlatformViewCreated,
); );
return mapView;
return AMapLoader(
mapView: mapView,
extensions: widget.extensions,
);
} }
@override @override
void initState() { void initState() {
AMapLoader.prepare();
super.initState(); super.initState();
_mapOptions = _AMapOptions.fromWidget(widget); _mapOptions = _AMapOptions.fromWidget(widget);
_markers = keyByMarkerId(widget.markers); _markers = keyByMarkerId(widget.markers);
_polygons = keyByPolygonId(widget.polygons); _polygons = keyByPolygonId(widget.polygons);
_polylines = keyByPolylineId(widget.polylines); _polylines = keyByPolylineId(widget.polylines);
_extensions = keyByExtensionId(widget.extensions);
print('initState AMapWidget'); print('initState AMapWidget');
} }
@ -218,6 +229,12 @@ class _MapState extends State<AMapWidget> {
this, this,
); );
_controller.complete(controller); _controller.complete(controller);
if (_extensions.isNotEmpty) {
await Future.forEach(
_extensions.values, (e) => e.bindMethodChannel(controller.channel));
}
final MapCreatedCallback? _onMapCreated = widget.onMapCreated; final MapCreatedCallback? _onMapCreated = widget.onMapCreated;
if (_onMapCreated != null) { if (_onMapCreated != null) {
_onMapCreated(controller); _onMapCreated(controller);

View File

@ -235,14 +235,6 @@ class MethodChannelAMapFlutterMap implements AMapFlutterPlatform {
}); });
} }
///
Future<void> setRenderFps(int fps, {required int mapId}) {
return channel(mapId)
.invokeMethod<void>('map#setRenderFps', <String, dynamic>{
'fps': fps,
});
}
/// ///
Future<Uint8List?> takeSnapshot({ Future<Uint8List?> takeSnapshot({
required int mapId, required int mapId,
@ -250,21 +242,6 @@ class MethodChannelAMapFlutterMap implements AMapFlutterPlatform {
return channel(mapId).invokeMethod<Uint8List>('map#takeSnapshot'); return channel(mapId).invokeMethod<Uint8List>('map#takeSnapshot');
} }
//
Future<String?> getMapContentApprovalNumber({
required int mapId,
}) {
return channel(mapId).invokeMethod<String>('map#contentApprovalNumber');
}
//
Future<String?> getSatelliteImageApprovalNumber({
required int mapId,
}) {
return channel(mapId)
.invokeMethod<String>('map#satelliteImageApprovalNumber');
}
Future<void> clearDisk({ Future<void> clearDisk({
required int mapId, required int mapId,
}) { }) {

View File

@ -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<String, AMapExtension> keyByExtensionId(
Iterable<AMapExtension> extensions) {
// ignore: unnecessary_null_comparison
if (extensions == null) {
return <String, AMapExtension>{};
}
return Map<String, AMapExtension>.fromEntries(extensions.map(
(AMapExtension extension) =>
MapEntry<String, AMapExtension>(extension.id, extension)));
}

View File

@ -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,
}

View File

@ -8,3 +8,5 @@ export 'polyline_updates.dart';
export 'polygon.dart'; export 'polygon.dart';
export 'polygon_updates.dart'; export 'polygon_updates.dart';
export 'bitmap.dart'; export 'bitmap.dart';
export 'extension_context.dart';
export 'amap_extension.dart';

View File

@ -1,6 +1,6 @@
name: amap_map name: amap_map
description: Amap SDK Flutter plugin for integrating AMapSDK in iOS and Android applications. 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 homepage: https://github.com/kuloud/amap_map
issue_tracker: https://github.com/kuloud/amap_map/issues issue_tracker: https://github.com/kuloud/amap_map/issues
platforms: platforms: