ソースを参照

Merge branch 'v1.1.0' into v1.1.0-iOS

“HeShaoZe” 5 ヶ月 前
コミット
c3ae5b2b5e

ファイルの差分が大きいため隠しています
+ 842 - 563
lib/data/api/atmob_api.g.dart


+ 1 - 1
lib/data/consts/constants.dart

@@ -1,7 +1,7 @@
 class Constants {
   Constants._();
 
-  static const String env = envProd;
+  static const String env = envTest;
 
   static const String envDev = 'dev';
 

+ 10 - 11
lib/di/get_it.config.dart

@@ -1,4 +1,3 @@
-// dart format width=80
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 // **************************************************************************
@@ -63,15 +62,15 @@ extension GetItInjectableX on _i174.GetIt {
       environmentFilter,
     );
     final networkModule = _$NetworkModule();
-    gh.factory<_i973.SplashController>(() => _i973.SplashController());
-    gh.factory<_i756.TrackDetailController>(
-        () => _i756.TrackDetailController());
     gh.factory<_i256.AboutController>(() => _i256.AboutController());
-    gh.factory<_i769.FeedBackController>(() => _i769.FeedBackController());
     gh.factory<_i923.BrowserController>(() => _i923.BrowserController());
+    gh.factory<_i769.FeedBackController>(() => _i769.FeedBackController());
     gh.factory<_i779.NewsReportController>(() => _i779.NewsReportController());
     gh.factory<_i108.PermissionSettingController>(
         () => _i108.PermissionSettingController());
+    gh.factory<_i973.SplashController>(() => _i973.SplashController());
+    gh.factory<_i756.TrackDetailController>(
+        () => _i756.TrackDetailController());
     gh.singleton<_i361.Dio>(() => networkModule.createDefaultDio());
     gh.lazySingleton<_i772.InternetConnectionHelper>(
         () => _i772.InternetConnectionHelper());
@@ -85,14 +84,14 @@ extension GetItInjectableX on _i174.GetIt {
         .provideAtmobStreamApi(gh<_i361.Dio>(instanceName: 'stream')));
     gh.lazySingleton<_i20.AccountRepository>(
         () => _i20.AccountRepository(gh<_i243.AtmobApi>()));
-    gh.lazySingleton<_i274.PhoneEventRepository>(
-        () => _i274.PhoneEventRepository(gh<_i243.AtmobApi>()));
-    gh.lazySingleton<_i1053.FriendsRepository>(
-        () => _i1053.FriendsRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i850.ContactRepository>(
         () => _i850.ContactRepository(gh<_i243.AtmobApi>()));
+    gh.lazySingleton<_i1053.FriendsRepository>(
+        () => _i1053.FriendsRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i791.MessageRepository>(
         () => _i791.MessageRepository(gh<_i243.AtmobApi>()));
+    gh.lazySingleton<_i274.PhoneEventRepository>(
+        () => _i274.PhoneEventRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i983.UrgentContactRepository>(
         () => _i983.UrgentContactRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i220.AtmobLocationClient>(
@@ -128,10 +127,10 @@ extension GetItInjectableX on _i174.GetIt {
               gh<_i983.UrgentContactRepository>(),
               gh<_i20.AccountRepository>(),
             ));
-    gh.factory<_i492.FriendSettingController>(
-        () => _i492.FriendSettingController(gh<_i1053.FriendsRepository>()));
     gh.factory<_i897.AddFriendDialogController>(
         () => _i897.AddFriendDialogController(gh<_i1053.FriendsRepository>()));
+    gh.factory<_i492.FriendSettingController>(
+        () => _i492.FriendSettingController(gh<_i1053.FriendsRepository>()));
     gh.lazySingleton<_i814.MemberRepository>(() => _i814.MemberRepository(
           gh<_i243.AtmobApi>(),
           gh<_i20.AccountRepository>(),

+ 15 - 13
lib/module/friend/setting/friend_setting_page.dart

@@ -1,8 +1,6 @@
 import 'dart:io';
 
-import 'package:animated_toggle_switch/animated_toggle_switch.dart';
 import 'package:flutter/cupertino.dart';
-
 import 'package:flutter/material.dart';
 import 'package:flutter/src/widgets/framework.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
@@ -13,11 +11,10 @@ import 'package:location/data/bean/user_info.dart';
 import 'package:location/resource/assets.gen.dart';
 import 'package:location/router/app_pages.dart';
 import 'package:location/utils/common_expand.dart';
-import 'package:location/widget/load_switch.dart';
-
 import '../../../resource/colors.gen.dart';
 import '../../../resource/string.gen.dart';
 import '../../../widget/common_view.dart';
+import '../../../widget/gradient_switch.dart';
 import 'friend_setting_controller.dart';
 
 class FriendSettingPage extends BasePage<FriendSettingController> {
@@ -81,7 +78,10 @@ class FriendSettingPage extends BasePage<FriendSettingController> {
                     height: 54.w,
                     decoration: _getSettingCardDecoration(),
                     child: Center(
-                        child: Text(Platform.isAndroid ? StringName.friendDelete : StringName.blockedFriend,
+                        child: Text(
+                            Platform.isAndroid
+                                ? StringName.friendDelete
+                                : StringName.blockedFriend,
                             style: TextStyle(
                                 fontSize: 15.sp,
                                 color: '#E1261A'.color,
@@ -156,7 +156,7 @@ class FriendSettingPage extends BasePage<FriendSettingController> {
   }
 
   Widget buildInfoSwitchType(String title, bool isSwitchOn,
-      {required LoadFutureCallback future}) {
+      {required Future<bool> Function(bool value) future}) {
     return Container(
       height: 54.w,
       padding: EdgeInsets.symmetric(horizontal: 12.w),
@@ -170,14 +170,16 @@ class FriendSettingPage extends BasePage<FriendSettingController> {
               fontWeight: FontWeight.bold),
         ),
         Spacer(),
-        LoadSwitch(
+        GradientSwitch(
+            unselectedGradient:
+                LinearGradient(colors: ['#EBEBEB'.color, '#EBEBEB'.color]),
+            selectedGradient: LinearGradient(
+                colors: [ColorName.colorPrimary, ColorName.colorPrimary]),
+            indicatorSize: 20.w,
+            width: 46.w,
+            height: 25.w,
             value: isSwitchOn,
-            future: future,
-            height: 24.w,
-            borderWidth: 4.w,
-            loadingColor: ColorName.colorPrimary,
-            selectedColor: ColorName.colorPrimary,
-            unselectedColor: '#EBEBEB'.color)
+            onChanged: future)
       ]),
     );
   }

+ 52 - 31
lib/module/main/main_page.dart

@@ -119,17 +119,23 @@ class MainPage extends BasePage<MainController> {
               if (controller.memberStatusInfo.value == null ||
                   controller.memberStatusInfo.value?.expired == true) {
                 return buildNoMemberView();
-              } else if (todayTrack == null ||
-                  todayTrack.isRequestSuccess.value == false) {
-                return buildTodayTrackLoadingView();
               } else {
-                return buildTodayTrackDetailView(todayTrack);
+                return buildTodayTrackView(todayTrack);
               }
             })),
       ),
     );
   }
 
+  Widget buildTodayTrackView(TodayTrackReportBean? todayTrack) {
+    return Stack(children: [
+      buildTodayTrackDetailView(todayTrack),
+      Visibility(
+          visible: todayTrack?.isRequestSuccess.value == false,
+          child: buildTodayTrackLoadingView()),
+    ]);
+  }
+
   Widget buildNoMemberView() {
     return GestureDetector(
         onTap: controller.onTrackNoMemberClick,
@@ -137,22 +143,28 @@ class MainPage extends BasePage<MainController> {
   }
 
   Widget buildTodayTrackLoadingView() {
-    return Column(
-      mainAxisAlignment: MainAxisAlignment.center,
-      children: [
-        CupertinoActivityIndicator(
-          color: '#A3A3A5'.color,
-          radius: 16.w,
-        ),
-        SizedBox(height: 15.w),
-        Text(StringName.mainTodayTrackLoading,
-            style: TextStyle(
-                fontSize: 14.sp, color: '#666666'.color.withOpacity(0.87)))
-      ],
+    return Container(
+      width: double.infinity,
+      height: double.infinity,
+      decoration: BoxDecoration(
+          color: Colors.white, borderRadius: BorderRadius.circular(20.r)),
+      child: Column(
+        mainAxisAlignment: MainAxisAlignment.center,
+        children: [
+          CupertinoActivityIndicator(
+            color: '#A3A3A5'.color,
+            radius: 16.w,
+          ),
+          SizedBox(height: 15.w),
+          Text(StringName.mainTodayTrackLoading,
+              style: TextStyle(
+                  fontSize: 14.sp, color: '#666666'.color.withOpacity(0.87)))
+        ],
+      ),
     );
   }
 
-  Widget buildTodayTrackDetailView(TodayTrackReportBean todayTrackReportBean) {
+  Widget buildTodayTrackDetailView(TodayTrackReportBean? todayTrackReportBean) {
     return GestureDetector(
       behavior: HitTestBehavior.opaque,
       onTap: controller.onTodayTraceClick,
@@ -182,10 +194,10 @@ class MainPage extends BasePage<MainController> {
   }
 
   Widget buildSelectedFriendTodayTrackDetailView(
-      TodayTrackReportBean todayTrackReportBean) {
-    final startAddr = todayTrackReportBean.startPoint?.addr;
+      TodayTrackReportBean? todayTrackReportBean) {
+    final startAddr = todayTrackReportBean?.startPoint?.addr;
 
-    final errorAddr = todayTrackReportBean.exceptionPoint?.addr;
+    final errorAddr = todayTrackReportBean?.exceptionPoint?.addr;
 
     MainTrackType startPointType = startAddr?.isNotEmpty == true
         ? MainTrackType.startPoint
@@ -275,15 +287,16 @@ class MainPage extends BasePage<MainController> {
     ));
   }
 
-  Widget buildTodayMapView(TodayTrackReportBean todayTrackReportBean) {
+  Widget buildTodayMapView(TodayTrackReportBean? todayTrackReportBean) {
     return ClipRRect(
         borderRadius: BorderRadius.circular(8.r),
         child: MapWidget(
+          controller: controller.todayTrackSmallMapController,
           isShowLogo: false,
           interactionIsEnabled: false,
-          mapPadding: todayTrackReportBean.mapPadding,
-          markers: todayTrackReportBean.markers,
-          polyline: todayTrackReportBean.polylines,
+          mapPadding: todayTrackReportBean?.mapPadding,
+          markers: todayTrackReportBean?.markers,
+          polyline: todayTrackReportBean?.polylines,
         ));
   }
 
@@ -494,12 +507,20 @@ class MainPage extends BasePage<MainController> {
                     Row(
                       children: [
                         Obx(() {
-                          return Text(
-                            controller.selectedFriend?.getUserNickName() ?? '',
-                            style: TextStyle(
-                                fontWeight: FontWeight.bold,
-                                fontSize: 16.sp,
-                                color: '#202020'.color),
+                          return ConstrainedBox(
+                            constraints: BoxConstraints(
+                              maxWidth: 0.26.sw,
+                            ),
+                            child: Text(
+                              maxLines: 1,
+                              controller.selectedFriend?.getUserNickName() ??
+                                  '',
+                              overflow: TextOverflow.ellipsis,
+                              style: TextStyle(
+                                  fontWeight: FontWeight.bold,
+                                  fontSize: 16.sp,
+                                  color: '#202020'.color),
+                            ),
                           );
                         }),
                         SizedBox(width: 7.w),
@@ -518,7 +539,7 @@ class MainPage extends BasePage<MainController> {
                                   onTap: () => controller.onViewTraceClick(
                                       controller.selectedFriend!),
                                   child: Container(
-                                      margin: EdgeInsets.only(right: 16.w),
+                                      margin: EdgeInsets.only(right: 12.w),
                                       decoration: getPrimaryBtnDecoration(32.w),
                                       padding: EdgeInsets.symmetric(
                                           horizontal: 21.w, vertical: 5.w),

+ 1 - 17
lib/resource/assets.gen.dart

@@ -1,5 +1,3 @@
-// dart format width=80
-
 /// GENERATED CODE - DO NOT MODIFY BY HAND
 /// *****************************************************
 ///  FlutterGen
@@ -7,7 +5,7 @@
 
 // coverage:ignore-file
 // ignore_for_file: type=lint
-// ignore_for_file: deprecated_member_use,directives_ordering,implicit_dynamic_list_literal,unnecessary_import
+// ignore_for_file: directives_ordering,unnecessary_import,implicit_dynamic_list_literal,deprecated_member_use
 
 import 'package:flutter/widgets.dart';
 
@@ -869,14 +867,12 @@ class AssetGenImage {
     this._assetName, {
     this.size,
     this.flavors = const {},
-    this.animation,
   });
 
   final String _assetName;
 
   final Size? size;
   final Set<String> flavors;
-  final AssetGenImageAnimation? animation;
 
   Image image({
     Key? key,
@@ -946,15 +942,3 @@ class AssetGenImage {
 
   String get keyName => _assetName;
 }
-
-class AssetGenImageAnimation {
-  const AssetGenImageAnimation({
-    required this.isAnimation,
-    required this.duration,
-    required this.frames,
-  });
-
-  final bool isAnimation;
-  final Duration duration;
-  final int frames;
-}

+ 1 - 2
lib/resource/colors.gen.dart

@@ -1,4 +1,3 @@
-// dart format width=80
 /// GENERATED CODE - DO NOT MODIFY BY HAND
 /// *****************************************************
 ///  FlutterGen
@@ -6,7 +5,7 @@
 
 // coverage:ignore-file
 // ignore_for_file: type=lint
-// ignore_for_file: deprecated_member_use,directives_ordering,implicit_dynamic_list_literal,unnecessary_import
+// ignore_for_file: directives_ordering,unnecessary_import,implicit_dynamic_list_literal,deprecated_member_use
 
 import 'package:flutter/painting.dart';
 import 'package:flutter/material.dart';

+ 1 - 2
lib/resource/fonts.gen.dart

@@ -1,4 +1,3 @@
-// dart format width=80
 /// GENERATED CODE - DO NOT MODIFY BY HAND
 /// *****************************************************
 ///  FlutterGen
@@ -6,7 +5,7 @@
 
 // coverage:ignore-file
 // ignore_for_file: type=lint
-// ignore_for_file: deprecated_member_use,directives_ordering,implicit_dynamic_list_literal,unnecessary_import
+// ignore_for_file: directives_ordering,unnecessary_import,implicit_dynamic_list_literal,deprecated_member_use
 
 class FontFamily {
   FontFamily._();

+ 130 - 0
lib/widget/gradient_switch.dart

@@ -0,0 +1,130 @@
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+
+class GradientSwitch extends StatefulWidget {
+  final bool value;
+  final Future<bool> Function(bool)? onChanged;
+  final double width;
+  final double height;
+  final Duration animationDuration;
+  final double indicatorSize;
+  final LinearGradient selectedGradient;
+  final LinearGradient unselectedGradient;
+  final Color? loadingColor;
+
+  const GradientSwitch({
+    super.key,
+    required this.value,
+    this.onChanged,
+    this.width = 60.0,
+    this.height = 30.0,
+    this.animationDuration = const Duration(milliseconds: 300),
+    this.indicatorSize = 24.0,
+    this.selectedGradient =
+        const LinearGradient(colors: [Colors.blue, Colors.purpleAccent]),
+    this.unselectedGradient =
+        const LinearGradient(colors: [Color(0xFFEEEEEE), Color(0xFFBDBDBD)]),
+    this.loadingColor,
+  });
+
+  @override
+  State<GradientSwitch> createState() => _GradientSwitchState();
+}
+
+class _GradientSwitchState extends State<GradientSwitch>
+    with SingleTickerProviderStateMixin {
+  late bool _currentValue;
+  bool _isLoading = false;
+
+  @override
+  void initState() {
+    super.initState();
+    _currentValue = widget.value;
+  }
+
+  @override
+  void didUpdateWidget(GradientSwitch oldWidget) {
+    super.didUpdateWidget(oldWidget);
+    if (widget.value != _currentValue && !_isLoading) {
+      _currentValue = widget.value;
+    }
+  }
+
+  Future<void> _handleTap() async {
+    if (_isLoading || widget.onChanged == null) return;
+
+    setState(() => _isLoading = true);
+
+    final targetValue = !_currentValue;
+    bool? success;
+
+    try {
+      success = await widget.onChanged!(targetValue);
+    } finally {
+      setState(() => _isLoading = false);
+
+      if (success != null && mounted) {
+        setState(() => _currentValue = success!);
+      }
+    }
+  }
+
+  @override
+  void dispose() {
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return GestureDetector(
+      onTap: _handleTap,
+      child: AnimatedContainer(
+        duration: widget.animationDuration,
+        width: widget.width,
+        height: widget.height,
+        decoration: BoxDecoration(
+          borderRadius: BorderRadius.circular(widget.height / 2),
+          gradient: _currentValue
+              ? widget.selectedGradient
+              : widget.unselectedGradient,
+          boxShadow: [
+            BoxShadow(
+              color: Colors.black.withOpacity(0.1),
+              blurRadius: 4,
+              offset: const Offset(0, 2),
+            )
+          ],
+        ),
+        child: AnimatedAlign(
+          duration: widget.animationDuration,
+          alignment:
+              _currentValue ? Alignment.centerRight : Alignment.centerLeft,
+          child: Container(
+            margin: const EdgeInsets.symmetric(horizontal: 3),
+            width: widget.indicatorSize,
+            height: widget.indicatorSize,
+            decoration: BoxDecoration(
+              shape: BoxShape.circle,
+              color: Colors.white,
+              boxShadow: [
+                BoxShadow(
+                  color: Colors.black.withOpacity(0.2),
+                  blurRadius: 4,
+                  offset: const Offset(0, 2),
+                )
+              ],
+            ),
+            child: _isLoading
+                ? Center(
+                    child: CupertinoActivityIndicator(
+                      color: widget.loadingColor,
+                      radius: widget.indicatorSize * 0.3,
+                    ),
+                  )
+                : null, // 非加载状态不显示内容
+          ),
+        ),
+      ),
+    );
+  }
+}

+ 0 - 90
lib/widget/load_switch.dart

@@ -1,90 +0,0 @@
-import 'package:animated_toggle_switch/animated_toggle_switch.dart';
-import 'package:flutter/material.dart';
-
-typedef LoadFutureCallback = Future<bool> Function(bool value);
-
-class LoadSwitch extends StatefulWidget {
-  final bool value;
-  final double height;
-  final double borderWidth;
-  final Color loadingColor;
-  final Color selectedColor;
-  final Color unselectedColor;
-
-  final LoadFutureCallback future;
-
-  const LoadSwitch(
-      {super.key,
-      required this.value,
-      required this.height,
-      required this.future,
-      this.borderWidth = 5,
-      this.loadingColor = Colors.blue,
-      this.selectedColor = Colors.green,
-      this.unselectedColor = Colors.red});
-
-  @override
-  State<LoadSwitch> createState() => _LoadSwitchState();
-}
-
-class _LoadSwitchState extends State<LoadSwitch> {
-  bool isSelected = false;
-
-  @override
-  void initState() {
-    // TODO: implement initState
-    super.initState();
-    isSelected = widget.value;
-  }
-
-  @override
-  Widget build(BuildContext context) {
-    return CustomAnimatedToggleSwitch(
-      height: widget.height,
-      indicatorSize: Size.square(widget.height),
-      current: isSelected,
-      values: const [false, true],
-      onChanged: (value) async {
-        bool newValue = await widget.future(value);
-        setState(() {
-          isSelected = newValue;
-        });
-      },
-      animationDuration: const Duration(milliseconds: 350),
-      // iconArrangement: IconArrangement.overlap,
-      // spacing: -16.0,
-      wrapperBuilder: (context, global, child) => DecoratedBox(
-          decoration: BoxDecoration(
-              color: Color.lerp(
-                  Color.lerp(widget.unselectedColor, widget.selectedColor,
-                      global.position),
-                  Colors.grey,
-                  global.loadingAnimationValue),
-              borderRadius:
-                  BorderRadius.all(Radius.circular(widget.height / 2))),
-          child: child),
-      foregroundIndicatorBuilder: (context, global) {
-        return Stack(
-          fit: StackFit.expand,
-          children: [
-            Padding(
-              padding: EdgeInsets.all(widget.borderWidth),
-              child: const DecoratedBox(
-                  decoration: BoxDecoration(
-                      shape: BoxShape.circle, color: Colors.white)),
-            ),
-            Padding(
-              padding: EdgeInsets.all(widget.borderWidth / 2),
-              child: CircularProgressIndicator(
-                strokeWidth: widget.borderWidth,
-                color: widget.loadingColor
-                    .withOpacity(global.loadingAnimationValue),
-              ),
-            ),
-          ],
-        );
-      },
-      iconBuilder: (context, local, global) => const SizedBox(),
-    );
-  }
-}

+ 1 - 0
plugins/map/lib/src/consts/map_constants.dart

@@ -41,4 +41,5 @@ class MapConstants {
   //polyline
   static const String methodAddPolyline = "polyline#addPolyline";
   static const String methodRemovePolyline = "polyline#removePolyline";
+  static const String methodClearAllPolylines = "polyline#clearAllPolylines";
 }

+ 12 - 0
plugins/map/lib/src/core/map_controller.dart

@@ -209,6 +209,18 @@ class MapController
   }
 
   @override
+  void clearAllPolylines() {
+    if (_isDisposed) return;
+    final params = {'method': MapConstants.methodClearAllPolylines, 'args': ''};
+    debugPrint("clearAllPolylines...params==>$params");
+    if (_channel != null) {
+      _executeMethod(params);
+    } else {
+      _pendingOperations.add(params);
+    }
+  }
+
+  @override
   void setMapInteractionEnabled(bool enabled) {
     if (_isDisposed) return;
     final params = {

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

@@ -11,4 +11,6 @@ abstract class MapPolylineInterface {
 
   //清除制定的线
   void removePolyline(String lineId);
+
+  void clearAllPolylines();
 }

+ 25 - 21
plugins/map/lib/src/widget/map_widget.dart

@@ -14,7 +14,7 @@ import '../../flutter_map.dart';
 import '../entity/polyline.dart';
 
 class MapWidget extends StatefulWidget {
-  late final MapController mapController;
+  final MapController? controller;
   final MarkerTapCallback? onMarkerTap;
   final List<Marker>? markers;
   final List<Polyline>? polyline;
@@ -23,9 +23,9 @@ class MapWidget extends StatefulWidget {
   final bool? isShowLogo;
   final bool? interactionIsEnabled;
 
-  MapWidget({
+  const MapWidget({
     super.key,
-    MapController? controller,
+    this.controller,
     this.onMarkerTap,
     this.mapPadding,
     this.markers,
@@ -33,9 +33,7 @@ class MapWidget extends StatefulWidget {
     this.isShowLogo,
     this.interactionIsEnabled,
     this.polyline,
-  }) {
-    mapController = controller ?? MapController();
-  }
+  });
 
   @override
   State<MapWidget> createState() => _MapWidgetState();
@@ -51,12 +49,14 @@ class _MapWidgetState extends State<MapWidget> {
     super.didUpdateWidget(oldWidget);
     cameraPoints.clear();
     if (oldWidget.markers != widget.markers) {
-      showMarker();
+      if (widget.markers == null || widget.markers!.isEmpty) {
+        widget.controller?.clearAllMarkers();
+      } else {
+        showMarker();
+      }
     }
     if (oldWidget.polyline != widget.polyline) {
-      oldWidget.polyline?.forEach((line) {
-        widget.mapController.removePolyline(line.lineId);
-      });
+      widget.controller?.clearAllPolylines();
       showPolyline();
     }
     animateCamera();
@@ -71,20 +71,25 @@ class _MapWidgetState extends State<MapWidget> {
             LatLng(latitude: marker.latitude, longitude: marker.longitude))
         .toList();
     cameraPoints.addAll(markerPoints ?? []);
-    widget.mapController.replaceAllMarkers(widget.markers ?? []);
+    widget.controller?.replaceAllMarkers(widget.markers ?? []);
   }
 
   void showPolyline() {
-    widget.polyline?.where((line) => line.points.isNotEmpty).forEach((line) {
-      cameraPoints.addAll(line.points);
-      widget.mapController.addPolyline(line, isAnimateCamera: false);
-    });
+    if (widget.polyline == null || widget.polyline!.isEmpty) {
+      return;
+    }
+    for (var line in widget.polyline!) {
+      if (line.points.isNotEmpty) {
+        cameraPoints.add(line.points.first);
+        widget.controller?.addPolyline(line, isAnimateCamera: false);
+      }
+    }
   }
 
   void animateCamera() {
     if (cameraPoints.isNotEmpty) {
-      widget.mapController
-          .moveToSuitableLocation(cameraPoints, mapPadding: widget.mapPadding);
+      widget.controller
+          ?.moveToSuitableLocation(cameraPoints, mapPadding: widget.mapPadding);
     }
   }
 
@@ -92,11 +97,10 @@ class _MapWidgetState extends State<MapWidget> {
   void initState() {
     super.initState();
     if (widget.isShowLogo != null) {
-      widget.mapController.setMapLogoVisible(widget.isShowLogo!);
+      widget.controller?.setMapLogoVisible(widget.isShowLogo!);
     }
     if (widget.interactionIsEnabled != null) {
-      widget.mapController
-          .setMapInteractionEnabled(widget.interactionIsEnabled!);
+      widget.controller?.setMapInteractionEnabled(widget.interactionIsEnabled!);
     }
 
     showMarker();
@@ -147,7 +151,7 @@ class _MapWidgetState extends State<MapWidget> {
   Future<void> onPlatformViewCreated(int viewId) async {
     MethodChannel mapChannel =
         MethodChannel('${MapConstants.mapViewChannelName}$viewId');
-    widget.mapController.setChannel(mapChannel);
+    widget.controller?.setChannel(mapChannel);
     mapChannel.setMethodCallHandler(_mapMethodCallHandler);
   }
 

+ 2 - 1
plugins/map_amap_android/android/src/main/java/com/atmob/map_amap_android/contants/Constants.java

@@ -57,8 +57,9 @@ public class Constants {
      */
     public static final String METHOD_UPDATE_OR_ADD_POLYLINE = "polyline#addPolyline";
     public static final String METHOD_REMOVE_POLYLINE = "polyline#removePolyline";
+    public static final String METHOD_CLEAR_ALL_POLYLINES = "polyline#clearAllPolylines";
 
-    public static final String[] METHOD_ID_LIST_FOR_POLYLINE = {METHOD_UPDATE_OR_ADD_POLYLINE, METHOD_REMOVE_POLYLINE};
+    public static final String[] METHOD_ID_LIST_FOR_POLYLINE = {METHOD_UPDATE_OR_ADD_POLYLINE, METHOD_REMOVE_POLYLINE,METHOD_CLEAR_ALL_POLYLINES};
 
 
 }

+ 20 - 0
plugins/map_amap_android/android/src/main/java/com/atmob/map_amap_android/overlays/polyline/PolylineController.java

@@ -64,6 +64,26 @@ public class PolylineController implements MyMethodCallHandler {
             case Constants.METHOD_REMOVE_POLYLINE:
                 removePolyLine(call, result);
                 break;
+            case Constants.METHOD_CLEAR_ALL_POLYLINES:
+                removeAllPolylines(call, result);
+                break;
+        }
+    }
+
+    private void removeAllPolylines(MethodCall call, MethodChannel.Result result){
+        try {
+            LogUtil.d(TAG, "removeAllPolylines");
+            for (Map.Entry<String, Polyline> entry : currentPolylineMap.entrySet()) {
+                Polyline polyline = entry.getValue();
+                if (polyline != null) {
+                    polyline.remove();
+                }
+            }
+            currentPolylineMap.clear();
+            result.success(null);
+        } catch (Exception e) {
+            LogUtil.d(TAG, "removeAllPolylines error===>" + e.getMessage());
+            result.error("JsonSyntaxException", e.getMessage(), null);
         }
     }
 

ファイルの差分が大きいため隠しています
+ 288 - 283
pubspec.lock


+ 0 - 3
pubspec.yaml

@@ -84,9 +84,6 @@ dependencies:
   #socket连接
   web_socket_channel: 3.0.2
 
-  #switch
-  animated_toggle_switch: 0.8.4
-
   #通讯录选择
   flutter_contacts: ^1.1.9+2