Browse Source

[new]调整地图控制器创建方式

zk 3 months ago
parent
commit
767e58c86d

+ 58 - 0
lib/module/commonpoint/select_address/common_point_select_address_page.dart

@@ -1,3 +1,5 @@
+import 'dart:io';
+
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/src/widgets/framework.dart';
@@ -43,6 +45,8 @@ class CommonPointSelectAddressPage
         children: [
           MapWidget(),
           buildHeadBgView(),
+          buildMapLogoView(),
+          buildLocationFunView(),
           buildSlidingSheetView(),
           buildToolbarView(),
         ],
@@ -50,6 +54,60 @@ class CommonPointSelectAddressPage
     );
   }
 
+  Widget buildLocationFunView() {
+    return Obx(() {
+      return Positioned(
+        right: 12.w,
+        bottom: 0.48.sh + controller.sheetProgress * 0.48.sh,
+        child: Opacity(
+          opacity: 1 - controller.sheetProgress,
+          child: Container(
+              width: 38.w,
+              height: 38.w,
+              decoration: BoxDecoration(
+                color: ColorName.white,
+                borderRadius: BorderRadius.circular(10.r),
+                boxShadow: [
+                  BoxShadow(
+                    color: ColorName.black10,
+                    blurRadius: 16,
+                    spreadRadius: 2,
+                    offset: Offset(0, 4.w),
+                  ),
+                ],
+              ),
+              child: Center(
+                child: Assets.images.iconCurrentLocation
+                    .image(width: 20.w, height: 20.w),
+              )),
+        ),
+      );
+    });
+  }
+
+  Widget buildMapLogoView() {
+    return Visibility(
+      visible: Platform.isAndroid,
+      child: Obx(() {
+        return Positioned(
+            left: 12.w,
+            bottom: 0.465.sh + controller.sheetProgress * 0.48.sh,
+            child: Opacity(
+              opacity: 1 - controller.sheetProgress,
+              child: Column(
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: [
+                  Assets.images.iconAmapLogo.image(height: 20.w),
+                  Text(StringName.locationAmapCo,
+                      style: TextStyle(
+                          fontSize: 9.sp, color: '#666666'.color, height: 1))
+                ],
+              ),
+            ));
+      }),
+    );
+  }
+
   Widget buildSlidingSheetView() {
     return SlidingSheet(
         listener: (SheetState state) {

+ 2 - 2
lib/module/main/main_controller.dart

@@ -64,8 +64,8 @@ class MainController extends BaseController {
 
   UserInfo? get selectedFriend => _selectedFriend.value;
 
-  final MapController mapController = MapController();
-  final MapController todayTrackSmallMapController = MapController();
+  final mapController = MapControllerFactory.createDefault();
+  final todayTrackSmallMapController = MapControllerFactory.createDefault();
 
   StreamSubscription? mineUserInfoSubscription;
   StreamSubscription? mineLocationSubscription;

+ 1 - 1
lib/module/track/track_controller.dart

@@ -32,7 +32,7 @@ class TrackController extends BaseController
 
   UserInfo? get userInfo => _userInfo.value;
 
-  final MapController mapController = MapController();
+  final mapController = MapControllerFactory.createDefault();
 
   SheetController sheetController = SheetController();
 

+ 2 - 2
plugins/map/lib/flutter_map.dart

@@ -2,7 +2,7 @@ library flutter_map;
 
 //地图组件
 export 'package:flutter_map/src/widget/map_widget.dart';
-export 'package:flutter_map/src/core/map_controller.dart';
+export 'package:flutter_map/src/core/map_base_controller.dart';
 
 //初始化
 export 'package:flutter_map/src/core/flutter_map.dart';
@@ -24,7 +24,7 @@ export 'package:flutter_map/src/entity/polyline.dart';
 
 //接口
 export 'package:flutter_map/src/interface/map_sdk_interface.dart';
-export 'package:flutter_map/src/interface/map_marker_interface.dart';
+export 'package:flutter_map/src/interface/overlays/map_marker_interface.dart';
 
 //工具类
 export 'package:flutter_map/src/utils/map_util.dart';

+ 26 - 15
plugins/map/lib/src/core/flutter_map.dart

@@ -1,3 +1,5 @@
+import 'dart:async';
+
 import 'package:flutter/services.dart';
 import '../../flutter_map.dart';
 import 'map_platform.dart';
@@ -6,38 +8,47 @@ class FlutterMap {
   FlutterMap._();
 
   static MapPlatform? _mapPlatform;
+  static Completer<void>? _initCompleter;
+
+  static Future<void> init() {
+    if (_mapPlatform != null) return Future.value();
+
+    if (_initCompleter != null) return _initCompleter!.future;
+
+    _initCompleter = Completer<void>();
+
+    const MethodChannel channel = MethodChannel(MapConstants.mapMethodChannel);
+    final MapPlatform mapPlatform = MapPlatformImpl(channel);
+
+    mapPlatform.init().then((ok) {
+      if (!ok) throw Exception("地图初始化失败,未找到适配的地图,请检查是否添加地图库");
+      _mapPlatform = mapPlatform;
+      _initCompleter?.complete();
+    }).catchError((e, stack) {
+      _initCompleter?.completeError(e, stack);
+    });
 
-  static Future<void> init() async {
-    if (_mapPlatform != null) {
-      return;
-    }
-    MethodChannel channel = const MethodChannel(MapConstants.mapMethodChannel);
-
-    MapPlatform mapPlatform = MapPlatformImpl(channel);
-    if (!await mapPlatform.init()) {
-      throw Exception("地图初始化失败,未找到适配的地图,请检查是否添加地图库");
-    }
-    _mapPlatform = mapPlatform;
+    return _initCompleter!.future;
   }
 
   static Future<String?> getPlatformName() {
-    assert(_mapPlatform != null, "请先初始化地图");
+    assert(_mapPlatform != null, "请先调用 FlutterMap.init()");
     return _mapPlatform!.getPlatformName();
   }
 
   static void receiveLocationStream({required MapLocationListener listener}) {
-    assert(_mapPlatform != null, "请先初始化地图");
+    assert(_mapPlatform != null, "请先调用 FlutterMap.init()");
     _mapPlatform!.receiveLocationStream(listener: listener);
   }
 
   static Future<void> startLocation() {
-    assert(_mapPlatform != null, "请先初始化地图");
+    assert(_mapPlatform != null, "请先调用 FlutterMap.init()");
     return _mapPlatform!.startLocation();
   }
 
   static Future<List<LatLng>?> queryProcessedTrace(
       {required int lineID, required List<TraceLocation> locations}) {
-    assert(_mapPlatform != null, "请先初始化地图");
+    assert(_mapPlatform != null, "请先调用 FlutterMap.init()");
     return _mapPlatform!
         .queryProcessedTrace(lineID: lineID, locations: locations);
   }

+ 26 - 0
plugins/map/lib/src/core/map_base_controller.dart

@@ -0,0 +1,26 @@
+import 'package:flutter/services.dart';
+import 'package:flutter_map/flutter_map.dart';
+import 'package:flutter_map/src/interface/overlays/map_marker_interface.dart';
+import 'package:flutter_map/src/interface/overlays/map_polyline_interface.dart';
+import '../interface/handle/map_handle_interface.dart';
+import '../interface/overlays/map_face_interface.dart';
+import 'map_controller_impl.dart';
+
+abstract class MapController
+    implements
+        MapMarkerInterface,
+        MapHandleInterface,
+        MapPolylineInterface,
+        MapFaceInterface {
+  void setChannel(MethodChannel channel);
+
+  void dispose();
+}
+
+class MapControllerFactory {
+  MapControllerFactory._();
+
+  static MapController createDefault() {
+    return MapControllerImpl();
+  }
+}

+ 2 - 14
plugins/map/lib/src/core/map_controller.dart

@@ -1,28 +1,16 @@
 import 'dart:convert';
 import 'dart:io';
-
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/services.dart';
-import 'package:flutter_map/flutter_map.dart';
 import 'package:flutter_map/src/consts/map_constants.dart';
 import 'package:flutter_map/src/entity/camera_position.dart';
 import 'package:flutter_map/src/entity/codable.dart';
 import 'package:flutter_map/src/entity/lat_lng.dart';
 import 'package:flutter_map/src/entity/marker.dart';
 import 'package:flutter_map/src/entity/polyline.dart';
-import 'package:flutter_map/src/interface/map_fun_interface.dart';
-import 'package:flutter_map/src/interface/map_marker_interface.dart';
-import 'package:flutter_map/src/interface/map_polyline_interface.dart';
-import '../entity/map_padding.dart';
-
-abstract class MapBaseController
-    implements MapMarkerInterface, MapFunInterface, MapPolylineInterface {
-  void setChannel(MethodChannel channel);
-
-  void dispose();
-}
+import '../../flutter_map.dart';
 
-class MapController implements MapBaseController {
+class MapControllerImpl implements MapController {
   final _pendingOperations = <Map<String, dynamic>>[];
   MethodChannel? _channel;
   bool _isDisposed = false;

+ 1 - 1
plugins/map/lib/src/core/map_platform.dart

@@ -1,7 +1,7 @@
 import 'dart:async';
 import 'dart:convert';
 import 'package:flutter/services.dart';
-import 'package:flutter_map/src/interface/map_trace_interface.dart';
+import 'package:flutter_map/src/interface/function/map_trace_interface.dart';
 import '../../flutter_map.dart';
 
 abstract class MapPlatform implements MapSDKInterface, MapTraceInterface {}

plugins/map/lib/src/interface/map_trace_interface.dart → plugins/map/lib/src/interface/function/map_trace_interface.dart


+ 3 - 2
plugins/map/lib/src/interface/map_fun_interface.dart

@@ -1,6 +1,7 @@
-import '../../flutter_map.dart';
+import '../../../flutter_map.dart';
 
-abstract class MapFunInterface {
+/// 地图操作相关接口
+abstract class MapHandleInterface {
   //移动地图
   void moveCamera(CameraPosition cameraPosition);
 

+ 1 - 0
plugins/map/lib/src/interface/map_sdk_interface.dart

@@ -2,6 +2,7 @@ import '../entity/map_location.dart';
 
 typedef MapLocationListener = void Function(MapLocation location);
 
+/// 地图SDK相关接口
 abstract class MapSDKInterface {
   Future<String?> getPlatformName();
 

+ 3 - 0
plugins/map/lib/src/interface/overlays/map_face_interface.dart

@@ -0,0 +1,3 @@
+//绘制面
+
+abstract class MapFaceInterface {}

+ 3 - 1
plugins/map/lib/src/interface/map_marker_interface.dart

@@ -1,5 +1,7 @@
 import 'package:flutter_map/flutter_map.dart';
-import '../entity/marker.dart';
+import '../../entity/marker.dart';
+
+///绘制标记物接口
 
 abstract class MapMarkerInterface {
   //修改标记物,需注意id,如果标记物id已存在则执行修改操作,否则执行添加操作

+ 2 - 2
plugins/map/lib/src/interface/map_polyline_interface.dart

@@ -1,9 +1,9 @@
 import 'package:flutter_map/src/entity/map_padding.dart';
 import 'package:flutter_map/src/entity/polyline.dart';
 
-import '../../flutter_map.dart';
-import '../consts/polyline_type.dart';
+import '../../../flutter_map.dart';
 
+/// 绘制线接口
 abstract class MapPolylineInterface {
   //画线   isAnimateCamera 是否动画移动到线的起点 ,mapPadding 地图边距 单位dp
   void addPolyline(Polyline polyline,

+ 2 - 4
plugins/map/lib/src/widget/map_widget.dart

@@ -1,5 +1,4 @@
 import 'dart:convert';
-
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/foundation.dart';
 import 'package:flutter/gestures.dart';
@@ -7,14 +6,13 @@ import 'package:flutter/rendering.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_map/src/consts/map_constants.dart';
 import 'package:flutter_map/src/consts/marker_type.dart';
-import 'package:flutter_map/src/core/map_controller.dart';
+import 'package:flutter_map/src/core/map_base_controller.dart';
 import 'package:flutter_map/src/entity/marker.dart';
-
 import '../../flutter_map.dart';
 import '../entity/polyline.dart';
 
 class MapWidget extends StatefulWidget {
-  final MapBaseController? controller;
+  final MapController? controller;
   final MarkerTapCallback? onMarkerTap;
   final List<Marker>? markers;
   final List<Polyline>? polyline;