zhipeng 7 місяців тому
батько
коміт
79c04d93a9
32 змінених файлів з 484 додано та 521 видалено
  1. 2 1
      assets/string/base/string.xml
  2. 8 0
      lib/data/consts/web_url.dart
  3. 5 7
      lib/data/repositories/account_repository.dart
  4. 43 1
      lib/data/repositories/message_repository.dart
  5. 2 0
      lib/dialog/agreement_dialog.dart
  6. 1 1
      lib/dialog/common_alert_dialog_impl.dart
  7. 5 3
      lib/main.dart
  8. 6 1
      lib/module/add_friend/add_friend_dialog_controller.dart
  9. 1 1
      lib/module/add_friend/add_friend_page.dart
  10. 13 1
      lib/module/browser/browser_controller.dart
  11. 15 3
      lib/module/feedback/feed_back_controller.dart
  12. 20 3
      lib/module/friend/friend_page.dart
  13. 6 6
      lib/module/main/main_controller.dart
  14. 3 4
      lib/module/main/main_page.dart
  15. 13 9
      lib/module/member/member_controller.dart
  16. 16 2
      lib/module/mine/mine_controller.dart
  17. 58 60
      lib/module/mine/mine_page.dart
  18. 5 2
      lib/module/news/news_controller.dart
  19. 1 3
      lib/module/permission/permission_setting_page.dart
  20. 4 3
      lib/module/splash/splash_controller.dart
  21. 1 0
      lib/module/track/track_page.dart
  22. 11 16
      lib/resource/string.gen.dart
  23. 0 87
      lib/sdk/qiyu/qi_yu_helper.dart
  24. 0 27
      lib/sdk/qiyu/qiyu_info_bean.dart
  25. 0 22
      lib/sdk/qiyu/qiyu_info_bean.g.dart
  26. 3 3
      lib/socket/atmob_location_client.dart
  27. 3 1
      plugins/map/lib/src/widget/map_widget.dart
  28. 1 0
      plugins/map_amap_android/android/src/main/AndroidManifest.xml
  29. 28 30
      plugins/map_amap_android/android/src/main/java/com/atmob/map_amap_android/amap/AmapView.java
  30. 1 4
      plugins/map_amap_android/android/src/main/java/com/atmob/map_amap_android/util/AMapHelper.java
  31. 209 216
      pubspec.lock
  32. 0 4
      pubspec.yaml

+ 2 - 1
assets/string/base/string.xml

@@ -20,6 +20,7 @@
 
     <string name="friend_add_title">添加好友</string>
     <string name="friend_add_desc">查看实时定位,开启轨迹守护</string>
+    <string name="friend_add_from_phone">通过手机号添加</string>
     <string name="friend_add_phone_et_hint">请输入手机号</string>
     <string name="friend_add_address_book">通讯录</string>
     <string name="friend_add_from_wx">通过微信添加</string>
@@ -223,7 +224,7 @@
     <string name="contact_no_default">未设置默认紧急联系人</string>
     <string name="urgent_contact_help_send_success">已成功发送求助信息</string>
     <string name="urgent_contact_add_max_tip">最多添加5人,请移除后再添加</string>
-    <string name="urgent_contact_ems_send_fail">短信发送失败,请核实手机号码</string>
+    <string name="urgent_contact_ems_send_fail">短信发送失败,请稍后重试</string>
     <string name="urgent_contact_ems_send_part_fail">部分号码发送失败</string>
     <string name="feed_back">用户反馈</string>
     <string name="feed_back_title">意见或建议:</string>

+ 8 - 0
lib/data/consts/web_url.dart

@@ -1,3 +1,5 @@
+import 'package:location/data/repositories/account_repository.dart';
+
 class WebUrl {
   WebUrl._();
 
@@ -15,9 +17,15 @@ class WebUrl {
 
   static const String _shareUrl = "https://www.v8dashen.com";
 
+  static const String _customUrl = "https://qiyu-kefu.atmob.com";
+
   static String get privacyPolicy => _privacyPolicy;
 
   static String get userAgreement => _userAgreement;
 
   static String get shareUrl => _shareUrl;
+
+  static String get customUrl {
+    return "$_customUrl?ssid=${AccountRepository.getInstance()}&device_id={device_id}&app_platform=5&app_version={app_version}&package_name={package_name}&app_name={app_name}";
+  }
 }

+ 5 - 7
lib/data/repositories/account_repository.dart

@@ -11,18 +11,18 @@ import 'package:location/data/bean/member_status_info.dart';
 import 'package:location/data/bean/user_info.dart';
 import 'package:location/data/consts/constants.dart';
 import 'package:location/data/consts/error_code.dart';
+import 'package:location/data/repositories/friends_repository.dart';
 import 'package:location/data/repositories/message_repository.dart';
 import 'package:location/data/repositories/urgent_contact_repository.dart';
-import 'package:location/socket/atmob_location_client.dart';
-import 'package:location/data/repositories/friends_repository.dart';
 import 'package:location/di/get_it.dart';
 import 'package:location/resource/string.gen.dart';
+import 'package:location/socket/atmob_location_client.dart';
 import 'package:location/utils/async_util.dart';
 import 'package:location/utils/atmob_log.dart';
 import 'package:location/utils/http_handler.dart';
 import 'package:location/utils/mmkv_util.dart';
+
 import '../../sdk/map/map_helper.dart';
-import '../../sdk/qiyu/qi_yu_helper.dart';
 import '../api/response/login_response.dart';
 import '../api/response/member_status_response.dart';
 
@@ -94,7 +94,7 @@ class AccountRepository {
   Future<LoginResponse> loginUserLogin(
       String phoneNum, String verificationCode) {
     if (_errorCodeTimes >= 5) {
-      throw LoginTooOftenException();
+      return Future.error(LoginTooOftenException());
     }
     return atmobApi
         .loginUserLogin(LoginRequest(phoneNum, verificationCode))
@@ -124,6 +124,7 @@ class AccountRepository {
     refreshMemberStatus();
     friendsRepository.refreshFriends();
     messageRepository.refreshFriendWaitingCount();
+    messageRepository.refreshUnreadMessage();
     urgentContactRepository.requestUrgentContactList();
   }
 
@@ -144,8 +145,6 @@ class AccountRepository {
     friendsRepository.clearFriends();
     messageRepository.clearMessage();
     urgentContactRepository.clearContactList();
-
-    QiYuHelper.logout();
   }
 
   void refreshMemberStatus() {
@@ -170,7 +169,6 @@ class AccountRepository {
         .then(HttpHandler.handle(false))
         .then((response) {
       refreshMemberHandler?.cancel();
-      QiYuHelper.setUserInfo(loginPhoneNum.value, response.deviceId);
       KVUtil.putString(keyAccountLoginUserId, response.deviceId);
       if (!response.permanent && !response.expired) {
         refreshMemberHandler = Timer(

+ 43 - 1
lib/data/repositories/message_repository.dart

@@ -3,6 +3,7 @@ import 'package:injectable/injectable.dart';
 import 'package:location/data/api/atmob_api.dart';
 import 'package:location/di/get_it.dart';
 import 'package:location/utils/http_handler.dart';
+import 'package:location/utils/mmkv_util.dart';
 
 import '../api/request/message_request.dart';
 import '../api/request/operation_friend_request.dart';
@@ -13,14 +14,21 @@ import '../bean/request_friend_info.dart';
 
 @lazySingleton
 class MessageRepository {
+  static final String _lastReadMessageId = 'last_read_message_id';
+
   final AtmobApi atmobApi;
 
   bool isRefreshing = false;
   Rxn<RequestFriendInfo> latestFriendRequest = Rxn<RequestFriendInfo>();
   RxInt waitingCount = RxInt(0);
+  RxBool hasUnreadMessage = RxBool(false);
+  int lastReadMessageId = 0;
+  int lastMessageId = 0;
 
   MessageRepository(this.atmobApi) {
+    lastReadMessageId = KVUtil.getInt(_lastReadMessageId, 0);
     refreshFriendWaitingCount();
+    refreshUnreadMessage();
   }
 
   static MessageRepository getInstance() {
@@ -48,6 +56,7 @@ class MessageRepository {
         latestFriendRequest.value = data.list!.first;
       }
       waitingCount.value = data.count;
+      _updateHasUnreadMessage();
       return data;
     });
   }
@@ -61,12 +70,20 @@ class MessageRepository {
   void clearMessage() {
     latestFriendRequest.value = null;
     waitingCount.value = 0;
+    hasUnreadMessage.value = false;
   }
 
   Future<MessageResponse> getMessageList() {
     return atmobApi
         .getMessageList(MessageRequest())
-        .then(HttpHandler.handle(true));
+        .then(HttpHandler.handle(true))
+        .then((response) {
+      if (response.list != null && response.list!.isNotEmpty) {
+        lastMessageId = response.list!.first.id;
+      }
+      _updateHasUnreadMessage();
+      return response;
+    });
   }
 
   Future<void> acceptFriendAccept(int friendId) {
@@ -82,4 +99,29 @@ class MessageRepository {
         .then(HttpHandler.handle(true))
         .then((_) => refreshFriendWaitingCount());
   }
+
+  void updateLastReadMessageId(int messageId) {
+    if (messageId == lastReadMessageId || messageId == 0) {
+      return;
+    }
+    lastReadMessageId = messageId;
+    KVUtil.putInt(_lastReadMessageId, messageId);
+
+    _updateHasUnreadMessage();
+  }
+
+  void refreshUnreadMessage() {
+    getMessageList();
+  }
+
+  void _updateHasUnreadMessage() {
+    if (waitingCount.value > 0 ||
+        (lastMessageId != 0 &&
+            lastReadMessageId != 0 &&
+            lastReadMessageId != lastMessageId)) {
+      hasUnreadMessage.value = true;
+    } else {
+      hasUnreadMessage.value = false;
+    }
+  }
 }

+ 2 - 0
lib/dialog/agreement_dialog.dart

@@ -8,6 +8,7 @@ import 'package:location/resource/assets.gen.dart';
 import 'package:location/resource/colors.gen.dart';
 import 'package:location/resource/string.gen.dart';
 import 'package:location/utils/common_expand.dart';
+
 import '../data/consts/web_url.dart';
 
 class AgreementDialog {
@@ -79,6 +80,7 @@ class _AgreementDialog extends Dialog {
                   }),
                   SizedBox(width: 16.w),
                   sureText(StringName.privacyAgree, () {
+                    AgreementDialog.dismiss();
                     sureClick();
                   })
                 ],

+ 1 - 1
lib/dialog/common_alert_dialog_impl.dart

@@ -142,7 +142,7 @@ void sendAllUrgentContactDialog({required VoidCallback confirmOnTap}) {
   CommonAlertDialog.show(
       tag: tag,
       titleWidget: Text(
-        StringName.kindlyReminder,
+        StringName.urgentContactEmergencyHelp,
         style: TextStyle(
             fontSize: 17.sp,
             color: '#333333'.color,

+ 5 - 3
lib/main.dart

@@ -1,5 +1,6 @@
 import 'dart:io';
 
+import 'package:atmob_logging/atmob_logging.dart' as ALog;
 import 'package:flutter/material.dart';
 import 'package:flutter_bugly/flutter_bugly.dart';
 import 'package:flutter_localizations/flutter_localizations.dart';
@@ -14,10 +15,10 @@ import 'package:location/router/app_pages.dart';
 import 'package:location/sdk/bugly/bugly_helper.dart';
 import 'package:location/sdk/gravity/gravity_helper.dart';
 import 'package:location/sdk/map/map_helper.dart';
-import 'package:location/sdk/qiyu/qi_yu_helper.dart';
 import 'package:location/sdk/umeng/umeng_helper.dart';
 import 'package:location/sdk/wechat/wechat_helper.dart';
 import 'package:location/utils/app_info_util.dart';
+import 'package:location/utils/atmob_log.dart';
 import 'package:location/utils/mmkv_util.dart';
 import 'package:location/utils/privacy_compliance.dart';
 import 'package:location/utils/toast_util.dart';
@@ -49,6 +50,9 @@ void main() {
 }
 
 Future<void> initRequired() async {
+  //Log
+  AtmobLog.setLogLevel(BuildConfig.isDebug ? ALog.LogLevel.verbose : ALog.LogLevel.none);
+
   //存储
   await KVUtil.init();
 
@@ -78,8 +82,6 @@ class AppInitTask implements EnsurePolicyGrant {
     MapHelper.init();
     //引力引擎
     GravityHelper.init();
-    //七鱼客服
-    QiYuHelper.init();
     //友盟
     UmengHelper.initCommon();
   }

+ 6 - 1
lib/module/add_friend/add_friend_dialog_controller.dart

@@ -1,4 +1,5 @@
 import 'package:flutter/cupertino.dart';
+import 'package:flutter_contacts/flutter_contacts.dart';
 import 'package:get/get.dart';
 import 'package:injectable/injectable.dart';
 import 'package:location/data/consts/error_code.dart';
@@ -10,9 +11,9 @@ import 'package:location/utils/http_handler.dart';
 import 'package:location/utils/permission_util.dart';
 import 'package:location/utils/toast_util.dart';
 import 'package:permission_handler/permission_handler.dart';
+
 import '../../../base/base_controller.dart';
 import '../../dialog/common_confirm_dialog_impl.dart';
-import 'package:flutter_contacts/flutter_contacts.dart';
 import '../../sdk/wechat/wechat_share_util.dart';
 import '../../utils/de_bounce.dart';
 
@@ -39,6 +40,10 @@ class AddFriendDialogController extends BaseController {
   }
 
   void onAddFriendClick() {
+    if (!RegExp(r'^1\d{10}$').hasMatch(phone)) {
+      ToastUtil.show(StringName.loginPrintPhoneVerification);
+      return;
+    }
     showAddFriendConfirmDialog(onConfirm: () {
       _saveDebounce.onClick(() {
         _requestAddFriend();

+ 1 - 1
lib/module/add_friend/add_friend_page.dart

@@ -129,7 +129,7 @@ class AddFriendPage extends BaseView<AddFriendDialogController> {
               Assets.images.iconLoginPhone.image(width: 18.w, height: 18.w),
               SizedBox(width: 7.w),
               Text(
-                StringName.friendAddPhoneEtHint,
+                StringName.friendAddFromPhone,
                 style: TextStyle(
                   fontWeight: FontWeight.bold,
                   fontSize: 14.sp,

+ 13 - 1
lib/module/browser/browser_controller.dart

@@ -1,5 +1,6 @@
 import 'package:get/get.dart';
 import 'package:injectable/injectable.dart';
+import 'package:location/utils/atmob_log.dart';
 import 'package:webview_flutter/webview_flutter.dart';
 
 import '../../base/base_controller.dart';
@@ -7,6 +8,8 @@ import '../../resource/colors.gen.dart';
 
 @injectable
 class BrowserController extends BaseController {
+  final String tag = 'BrowserController';
+
   String url = (Get.arguments is String) ? (Get.arguments as String) : '';
 
   final WebViewController webViewController = WebViewController();
@@ -30,6 +33,16 @@ class BrowserController extends BaseController {
     webViewController.setBackgroundColor(ColorName.white);
     webViewController.setNavigationDelegate(
       NavigationDelegate(
+        onNavigationRequest: (NavigationRequest request) {
+          AtmobLog.d(tag, "onNavigationRequest: ${request.url}");
+          if (request.url.startsWith('http') || request.url.startsWith('https')) {
+            return NavigationDecision.navigate;
+          }
+          return NavigationDecision.prevent;
+        },
+        onUrlChange: (UrlChange urlChange) {
+          _getTitle();
+        },
         onPageFinished: (String url) {
           _getTitle();
         },
@@ -53,7 +66,6 @@ class BrowserController extends BaseController {
   }
 
   void _getTitle() async {
-    await Future.delayed(const Duration(milliseconds: 500));
     webViewController.getTitle().then((title) {
       if (title != null) {
         this.title.value = title;

+ 15 - 3
lib/module/feedback/feed_back_controller.dart

@@ -1,13 +1,16 @@
+import 'dart:io';
+
 import 'package:get/get.dart';
-import 'package:get/get_core/src/get_main.dart';
 import 'package:injectable/injectable.dart';
 import 'package:location/base/base_controller.dart';
+import 'package:location/data/repositories/account_repository.dart';
 import 'package:location/handler/event_handler.dart';
+import 'package:location/module/browser/browser_view.dart';
 import 'package:location/resource/string.gen.dart';
 import 'package:location/utils/toast_util.dart';
 
 import '../../data/consts/event_id.dart';
-import '../../sdk/qiyu/qi_yu_helper.dart';
+import '../../utils/app_info_util.dart';
 
 @injectable
 class FeedBackController extends BaseController {
@@ -35,6 +38,15 @@ class FeedBackController extends BaseController {
   }
 
   void onCustomerServiceClick() {
-    QiYuHelper.openCustomService();
+    String phone = AccountRepository.getInstance().loginPhoneNum.value ?? '';
+    String url = "https://qiyu-kefu.atmob.com?"
+        "ssid=$phone"
+        "&device_id=$phone"
+        "&app_platform=${Platform.isAndroid ? 1 : 2}"
+        "&app_version=${appInfoUtil.appVersionName}"
+        "&package_name=${appInfoUtil.packageName}"
+        "&app_name=${StringName.appName}"
+        "&phone=$phone";
+    BrowserPage.start(url);
   }
 }

+ 20 - 3
lib/module/friend/friend_page.dart

@@ -1,15 +1,15 @@
-import 'package:flutter/cupertino.dart';
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
-import 'package:get/get_core/src/get_main.dart';
 import 'package:location/base/base_page.dart';
 import 'package:location/resource/assets.gen.dart';
 import 'package:location/resource/colors.gen.dart';
 import 'package:location/resource/string.gen.dart';
 import 'package:location/utils/common_expand.dart';
+
 import '../../router/app_pages.dart';
 import '../../widget/common_view.dart';
+import '../add_friend/add_friend_page.dart';
 import 'friend_controller.dart';
 import 'friend_list_item.dart';
 
@@ -86,6 +86,23 @@ class FriendPage extends BasePage<FriendController> {
                     ],
                   );
                 }),
+              ),
+              Container(
+                width: double.infinity,
+                color: "#FFFFFF".color,
+                padding: EdgeInsets.symmetric(vertical: 12.w, horizontal: 15.w),
+                child: TextButton(
+                    style: ButtonStyle(
+                        backgroundColor:
+                            WidgetStatePropertyAll("#7B7DFF".color),
+                        shape: WidgetStatePropertyAll(RoundedRectangleBorder(
+                          borderRadius: BorderRadius.all(Radius.circular(10.w)),
+                        ))),
+                    onPressed: () => AddFriendPage.show(),
+                    child: Text(
+                      "添加好友",
+                      style: TextStyle(fontSize: 14.sp, color: ColorName.white),
+                    )),
               )
             ],
           ),

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

@@ -2,9 +2,9 @@ import 'dart:async';
 import 'dart:io';
 
 import 'package:flutter/services.dart';
+import 'package:flutter_map/flutter_map.dart';
 import 'package:flutter_tool_android/flutter_tool_android.dart';
 import 'package:get/get.dart';
-import 'package:get/get_rx/src/rx_types/rx_types.dart';
 import 'package:injectable/injectable.dart';
 import 'package:location/base/base_controller.dart';
 import 'package:location/data/bean/location_info.dart';
@@ -12,7 +12,6 @@ import 'package:location/data/bean/user_info.dart';
 import 'package:location/data/consts/constants.dart';
 import 'package:location/data/repositories/account_repository.dart';
 import 'package:location/data/repositories/friends_repository.dart';
-import 'package:flutter_map/flutter_map.dart';
 import 'package:location/data/repositories/message_repository.dart';
 import 'package:location/handler/error_handler.dart';
 import 'package:location/module/friend/friend_page.dart';
@@ -25,15 +24,16 @@ import 'package:location/sdk/map/map_helper.dart';
 import 'package:location/utils/base_expand.dart';
 import 'package:location/utils/mmkv_util.dart';
 import 'package:location/utils/toast_util.dart';
+
 import '../../data/repositories/config_repository.dart';
 import '../../data/repositories/urgent_contact_repository.dart';
+import '../../dialog/check_loation_permission_dialog.dart';
 import '../../dialog/common_alert_dialog_impl.dart';
 import '../../dialog/common_confirm_dialog_impl.dart';
-import '../../sdk/wechat/wechat_share_util.dart';
-import '../../socket/atmob_location_client.dart';
 import '../../dialog/friend_dialog.dart';
-import '../../dialog/check_loation_permission_dialog.dart';
 import '../../dialog/location_permission_dialog.dart';
+import '../../sdk/wechat/wechat_share_util.dart';
+import '../../socket/atmob_location_client.dart';
 import '../../utils/location_convert_marker_util.dart';
 import '../../utils/permission_util.dart';
 import '../add_friend/add_friend_page.dart';
@@ -66,7 +66,7 @@ class MainController extends BaseController {
   final MessageRepository messageRepository;
   final UrgentContactRepository urgentContactRepository;
 
-  int get waitingNewsCount => messageRepository.waitingCount.value;
+  bool get hasUnreadMessage => messageRepository.hasUnreadMessage.value;
 
   DateTime? _lastPressedAt;
 

+ 3 - 4
lib/module/main/main_page.dart

@@ -1,9 +1,8 @@
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter_map/flutter_map.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
-import 'package:get/get_core/src/get_main.dart';
 import 'package:location/base/base_page.dart';
 import 'package:location/data/bean/user_info.dart';
 import 'package:location/module/main/main_controller.dart';
@@ -11,7 +10,7 @@ import 'package:location/resource/assets.gen.dart';
 import 'package:location/resource/colors.gen.dart';
 import 'package:location/resource/string.gen.dart';
 import 'package:location/utils/common_expand.dart';
-import 'package:flutter_map/flutter_map.dart';
+
 import '../../router/app_pages.dart';
 import 'main_friend_item.dart';
 
@@ -174,7 +173,7 @@ class MainPage extends BasePage<MainController> {
         Expanded(child: Obx(() {
           return buildFunItem(Assets.images.iconMainNews.provider(),
               StringName.mainNewsTab, () => controller.onNewsClick(),
-              isShowDot: controller.waitingNewsCount > 0);
+              isShowDot: controller.hasUnreadMessage);
         })),
         Expanded(
             child: buildFunItem(

+ 13 - 9
lib/module/member/member_controller.dart

@@ -2,7 +2,6 @@ import 'dart:async';
 import 'dart:math';
 
 import 'package:agile_pay/flutter_pay.dart';
-import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
@@ -19,7 +18,7 @@ import 'package:location/resource/assets.gen.dart';
 import 'package:location/utils/async_util.dart';
 import 'package:location/utils/common_expand.dart';
 import 'package:location/utils/toast_util.dart';
-import '../../data/api/response/request_pay_response.dart';
+
 import '../../data/bean/member_status_info.dart';
 import '../../data/bean/wechat_payment_sign_bean.dart';
 import '../../data/consts/error_code.dart';
@@ -29,7 +28,6 @@ import '../../dialog/common_confirm_dialog_impl.dart';
 import '../../dialog/loading_dialog.dart';
 import '../../dialog/member_retain_dialog.dart';
 import '../../dialog/wechat_qr_code_dialog.dart';
-import '../../handler/event_handler.dart';
 import '../../resource/string.gen.dart';
 import '../../utils/http_handler.dart';
 import '../../utils/payment_status_manager.dart';
@@ -83,10 +81,10 @@ class MemberController extends BaseController implements PaymentStatusCallback {
         StringName.memberFunName1, StringName.memberFunName1Desc),
     MemberFunBean(2, Assets.images.iconMemberFun2.path,
         StringName.memberFunName2, StringName.memberFunName2Desc),
-    MemberFunBean(3, Assets.images.iconMemberFun3.path,
-        StringName.memberFunName3, StringName.memberFunName3Desc),
-    MemberFunBean(4, Assets.images.iconMemberFun4.path,
-        StringName.memberFunName4, StringName.memberFunName4Desc), //该功能还未开发
+    // MemberFunBean(3, Assets.images.iconMemberFun3.path,
+    //     StringName.memberFunName3, StringName.memberFunName3Desc),
+    // MemberFunBean(4, Assets.images.iconMemberFun4.path,
+    //     StringName.memberFunName4, StringName.memberFunName4Desc), //该功能还未开发
     MemberFunBean(5, Assets.images.iconMemberFun5.path,
         StringName.memberFunName5, StringName.memberFunName5Desc),
     MemberFunBean(6, Assets.images.iconMemberFun6.path,
@@ -410,8 +408,14 @@ class MemberController extends BaseController implements PaymentStatusCallback {
   @override
   void onPaymentSuccess(
       String orderNo, PayItemBean paymentWay, GoodsBean storeItemBean) {
-    LoadingDialog.hide();
-
+    try {
+      WechatQrCodeDialog.dismiss();
+      AlipayQrCodeDialog.dismiss();
+      CustomLoadingDialog.hide();
+      LoadingDialog.hide();
+    } catch (e) {
+      debugPrint('zk---onPaymentSuccess error: $e');
+    }
     showPaymentSuccessDialog(onConfirm: back, onCancel: back);
   }
 }

+ 16 - 2
lib/module/mine/mine_controller.dart

@@ -1,3 +1,5 @@
+import 'dart:io';
+
 import 'package:get/get.dart';
 import 'package:get/get_core/src/get_main.dart';
 import 'package:injectable/injectable.dart';
@@ -12,13 +14,15 @@ import 'package:location/module/member/member_page.dart';
 import 'package:location/module/urgent_contact/urgent_contact_page.dart';
 import 'package:location/resource/string.gen.dart';
 import 'package:location/utils/http_handler.dart';
+
 import '../../data/repositories/account_repository.dart';
 import '../../data/repositories/member_repository.dart';
 import '../../dialog/common_alert_dialog_impl.dart';
-import '../../sdk/qiyu/qi_yu_helper.dart';
 import '../../sdk/wechat/wechat_share_util.dart';
+import '../../utils/app_info_util.dart';
 import '../../utils/toast_util.dart';
 import '../about/about_page.dart';
+import '../browser/browser_view.dart';
 import '../permission/permission_setting_page.dart';
 
 @injectable
@@ -57,7 +61,16 @@ class MineController extends BaseController {
   }
 
   onCustomerServiceClick() {
-    QiYuHelper.openCustomService();
+    String phone = AccountRepository.getInstance().loginPhoneNum.value ?? '';
+    String url = "https://qiyu-kefu.atmob.com?"
+        "ssid=$phone"
+        "&device_id=$phone"
+        "&app_platform=${Platform.isAndroid ? 1 : 2}"
+        "&app_version=${appInfoUtil.appVersionName}"
+        "&package_name=${appInfoUtil.packageName}"
+        "&app_name=${StringName.appName}"
+        "&phone=$phone";
+    BrowserPage.start(url);
   }
 
   onPermissionSettingClick() {
@@ -113,6 +126,7 @@ class MineController extends BaseController {
           ToastUtil.show(StringName.memberFreeCodeIsmember);
         } else if (error.code == ErrorCode.noLoginError) {
           ToastUtil.show(StringName.accountNoLogin);
+          LoginPage.start();
         } else {
           ToastUtil.show(error.message);
         }

+ 58 - 60
lib/module/mine/mine_page.dart

@@ -1,14 +1,13 @@
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter/src/widgets/framework.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
-import 'package:get/get_core/src/get_main.dart';
 import 'package:location/base/base_page.dart';
 import 'package:location/resource/assets.gen.dart';
 import 'package:location/resource/colors.gen.dart';
 import 'package:location/resource/string.gen.dart';
 import 'package:location/utils/common_expand.dart';
+
 import '../../router/app_pages.dart';
 import '../../utils/date_util.dart';
 import '../../widget/common_view.dart';
@@ -40,27 +39,31 @@ class MinePage extends BasePage<MineController> {
           child: SingleChildScrollView(
             child: Column(children: [
               SizedBox(height: 70.w),
-              Row(
-                children: [
-                  SizedBox(width: 12.w),
-                  Obx(() {
-                    return controller.isLogin
-                        ? Assets.images.iconMineLogged
-                            .image(width: 54.w, height: 54.w)
-                        : Assets.images.iconMineNoLogin
-                            .image(width: 54.w, height: 54.w);
-                  }),
-                  SizedBox(width: 10.w),
-                  buildLoginInfo(),
-                  Spacer(),
-                  Obx(() {
-                    return Visibility(
-                        visible: controller.isOpenFreeMember == true,
-                        child: GestureDetector(
-                            onTap: controller.onMemberTryOutClick,
-                            child: buildMemberTryOutView()));
-                  })
-                ],
+              GestureDetector(
+                behavior: HitTestBehavior.opaque,
+                onTap: () => controller.onLoginClick(),
+                child: Row(
+                  children: [
+                    SizedBox(width: 12.w),
+                    Obx(() {
+                      return controller.isLogin
+                          ? Assets.images.iconMineLogged
+                              .image(width: 54.w, height: 54.w)
+                          : Assets.images.iconMineNoLogin
+                              .image(width: 54.w, height: 54.w);
+                    }),
+                    SizedBox(width: 10.w),
+                    buildLoginInfo(),
+                    Spacer(),
+                    Obx(() {
+                      return Visibility(
+                          visible: controller.isOpenFreeMember == true,
+                          child: GestureDetector(
+                              onTap: controller.onMemberTryOutClick,
+                              child: buildMemberTryOutView()));
+                    })
+                  ],
+                ),
               ),
               SizedBox(height: 20.w),
               buildExperienceContent(),
@@ -163,43 +166,38 @@ class MinePage extends BasePage<MineController> {
   }
 
   Widget buildLoginInfo() {
-    return GestureDetector(
-      behavior: HitTestBehavior.opaque,
-      onTap: () => controller.onLoginClick(),
-      child: Column(
-        mainAxisAlignment: MainAxisAlignment.center,
-        crossAxisAlignment: CrossAxisAlignment.start,
-        children: [
-          Row(
-            children: [
-              Obx(() {
-                String desc = "";
-                if (controller.isLogin &&
-                    controller.phone?.isNotEmpty == true) {
-                  desc = controller.getUserName(controller.phone!);
-                } else {
-                  desc = StringName.mineAccountGoLogin;
-                }
-                return Text(desc,
-                    style: TextStyle(
-                        fontSize: 16.sp,
-                        color: '#333333'.color,
-                        fontWeight: FontWeight.bold));
-              }),
-              SizedBox(width: 6.w),
-              Obx(() {
-                return Visibility(
-                    visible: controller.isLogin &&
-                        controller.memberStatusInfo != null &&
-                        controller.memberStatusInfo?.expired == false,
-                    child: Assets.images.iconVip.image(width: 28.w));
-              })
-            ],
-          ),
-          SizedBox(height: 6.w),
-          buildLoginDesc(),
-        ],
-      ),
+    return Column(
+      mainAxisAlignment: MainAxisAlignment.center,
+      crossAxisAlignment: CrossAxisAlignment.start,
+      children: [
+        Row(
+          children: [
+            Obx(() {
+              String desc = "";
+              if (controller.isLogin && controller.phone?.isNotEmpty == true) {
+                desc = controller.getUserName(controller.phone!);
+              } else {
+                desc = StringName.mineAccountGoLogin;
+              }
+              return Text(desc,
+                  style: TextStyle(
+                      fontSize: 16.sp,
+                      color: '#333333'.color,
+                      fontWeight: FontWeight.bold));
+            }),
+            SizedBox(width: 6.w),
+            Obx(() {
+              return Visibility(
+                  visible: controller.isLogin &&
+                      controller.memberStatusInfo != null &&
+                      controller.memberStatusInfo?.expired == false,
+                  child: Assets.images.iconVip.image(width: 28.w));
+            })
+          ],
+        ),
+        SizedBox(height: 6.w),
+        buildLoginDesc(),
+      ],
     );
   }
 

+ 5 - 2
lib/module/news/news_controller.dart

@@ -1,13 +1,12 @@
 import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
-import 'package:get/get_core/src/get_main.dart';
-import 'package:get/get_rx/src/rx_types/rx_types.dart';
 import 'package:injectable/injectable.dart';
 import 'package:location/base/base_controller.dart';
 import 'package:location/data/repositories/message_repository.dart';
 import 'package:location/handler/error_handler.dart';
 import 'package:location/module/news/pending_list/news_pending_list_page.dart';
 import 'package:url_launcher/url_launcher.dart';
+
 import '../../data/bean/message_info.dart';
 import '../../data/bean/request_friend_info.dart';
 
@@ -63,6 +62,10 @@ class NewsController extends BaseController {
       if (response.list != null) {
         messageList.addAll(response.list!);
       }
+      WidgetsBinding.instance.addPostFrameCallback((_) {
+        messageRepository.updateLastReadMessageId(
+            messageList.isNotEmpty ? messageList.first.id : 0);
+      });
     }).catchError((error) {
       ErrorHandler.toastError(error);
     });

+ 1 - 3
lib/module/permission/permission_setting_page.dart

@@ -1,8 +1,6 @@
 import 'package:flutter/cupertino.dart';
-import 'package:flutter/src/widgets/framework.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
-import 'package:get/get_core/src/get_main.dart';
 import 'package:location/base/base_page.dart';
 import 'package:location/module/permission/permission_setting_controller.dart';
 import 'package:location/resource/colors.gen.dart';
@@ -24,7 +22,7 @@ class PermissionSettingPage extends BasePage<PermissionSettingController> {
     return Column(
       children: [
         CommonView.buildAppBar(StringName.mineFunPermissionSetting,
-            titleCenter: false),
+            backOnTap: () => Get.back(), titleCenter: false),
         SizedBox(height: 12.w),
         Expanded(
             child: ListView(

+ 4 - 3
lib/module/splash/splash_controller.dart

@@ -8,6 +8,7 @@ import 'package:location/base/base_controller.dart';
 import 'package:location/dialog/agreement_dialog.dart';
 import 'package:location/module/main/main_page.dart';
 import 'package:location/sdk/umeng/umeng_helper.dart';
+
 import '../../utils/privacy_compliance.dart';
 
 @injectable
@@ -18,18 +19,18 @@ class SplashController extends BaseController {
   void onReady() {
     final isAgreePrivacy = PrivacyCompliance.isAgreePrivacyPolicy();
     if (isAgreePrivacy) {
-      isAgreePrivacyNextStep();
+      isAgreePrivacyNextStep(splashDelayedTime);
     } else {
       AgreementDialog.show(cancelClick: () {
         exitApp();
       }, sureClick: () {
         _agreePrivacy();
-        isAgreePrivacyNextStep();
+        isAgreePrivacyNextStep(0);
       });
     }
   }
 
-  void isAgreePrivacyNextStep() {
+  void isAgreePrivacyNextStep(int splashDelayedTime) {
     _goMain(Duration(seconds: splashDelayedTime));
   }
 

+ 1 - 0
lib/module/track/track_page.dart

@@ -51,6 +51,7 @@ class TrackPage extends BasePage<TrackController> {
           ),
         ),
         SlidingSheet(
+          color: ColorName.white,
           controller: controller.sheetController,
           elevation: 10,
           shadowColor: Colors.black.withOpacity(0.1),

+ 11 - 16
lib/resource/string.gen.dart

@@ -16,6 +16,7 @@ class StringName {
   static final String termOfService = 'term_of_service'.tr; // 《服务条款》
   static final String friendAddTitle = 'friend_add_title'.tr; // 添加好友
   static final String friendAddDesc = 'friend_add_desc'.tr; // 查看实时定位,开启轨迹守护
+  static final String friendAddFromPhone = 'friend_add_from_phone'.tr; // 通过手机号添加
   static final String friendAddPhoneEtHint = 'friend_add_phone_et_hint'.tr; // 请输入手机号
   static final String friendAddAddressBook = 'friend_add_address_book'.tr; // 通讯录
   static final String friendAddFromWx = 'friend_add_from_wx'.tr; // 通过微信添加
@@ -183,7 +184,7 @@ class StringName {
   static final String contactNoDefault = 'contact_no_default'.tr; // 未设置默认紧急联系人
   static final String urgentContactHelpSendSuccess = 'urgent_contact_help_send_success'.tr; // 已成功发送求助信息
   static final String urgentContactAddMaxTip = 'urgent_contact_add_max_tip'.tr; // 最多添加5人,请移除后再添加
-  static final String urgentContactEmsSendFail = 'urgent_contact_ems_send_fail'.tr; // 短信发送失败,请核实手机号码
+  static final String urgentContactEmsSendFail = 'urgent_contact_ems_send_fail'.tr; // 短信发送失败,请稍后重试
   static final String urgentContactEmsSendPartFail = 'urgent_contact_ems_send_part_fail'.tr; // 部分号码发送失败
   static final String feedBack = 'feed_back'.tr; // 用户反馈
   static final String feedBackTitle = 'feed_back_title'.tr; // 意见或建议:
@@ -194,8 +195,7 @@ class StringName {
   static final String logoutAccountContent = 'logout_account_content'.tr; // 1.删除账号所有账号信息数据和定位记录;\n2.删除并放弃账号下的会员权益;\n3.点击“确认注销”即开始注销流程不可撤回,请慎重考虑。
   static final String logoutAccount = 'logout_account'.tr; // 注销账号
   static final String accountLogoutSuccess = 'account_logout_success'.tr; // 注销成功
-  static final String recordNumber =
-      'record_number'.tr; // 备案号:皖ICP备2024057362号-19A
+  static final String recordNumber = 'record_number'.tr; // 备案号:皖ICP备2024057362号-19A
   static final String permissionSetting = 'permission_setting'.tr; // 快速设置
   static final String permissionLocationSetting = 'permission_location_setting'.tr; // 定位权限开启
   static final String permissionLocationSettingSubtitle = 'permission_location_setting_subtitle'.tr; // 定位权限需要设置为本应用选择“始终允许”,才可以正常查看轨迹。
@@ -222,30 +222,24 @@ class StringName {
   static final String memberUserEvaluate = 'member_user_evaluate'.tr; // 用户评价
   static final String memberTips = 'member_tips'.tr; // 本应用功能仅限于家庭成员和亲人朋友之间使用,根据相关法规和隐私协议规定,共享位置功能需要对方下载得到好友授权同意才能正常使用。
   static final String memberContinuePay = 'member_continue_pay'.tr; // 继续支付
-  static final String memberPleaseChoiceGoods =
-      'member_please_choice_goods'.tr; // 请选择支付商品
-  static final String memberPleaseChoicePayment =
-      'member_please_choice_payment'.tr; // 请选择支付方式
+  static final String memberPleaseChoiceGoods = 'member_please_choice_goods'.tr; // 请选择支付商品
+  static final String memberPleaseChoicePayment = 'member_please_choice_payment'.tr; // 请选择支付方式
   static final String payLoading = 'pay_loading'.tr; // 请求中...
   static final String payUserCancel = 'pay_user_cancel'.tr; // 用户取消支付
   static final String payNotSupport = 'pay_not_support'.tr; // 不支持该支付类型
   static final String payWxEvnError = 'pay_wx_evn_error'.tr; // 微信未安装或微信版本不支持
   static final String payError = 'pay_error'.tr; // 支付失败,请稍后重试
   static final String payQuerypayState = 'pay_query_pay_state'.tr; // 正在查询订单状态..
-  static final String payNotConnectStore =
-      'pay_not_connect_store'.tr; // 无法连接到商店
+  static final String payNotConnectStore = 'pay_not_connect_store'.tr; // 无法连接到商店
   static final String paySuccessTitle = 'pay_success_title'.tr; // 支付成功
   static final String paySuccessDesc = 'pay_success_desc'.tr; // 您的订单已成功支付
   static final String alipayQrCodeTips = 'alipay_qr_code_tips'.tr; // 请使用支付宝扫码支付
   static final String wechatQrCodeTips = 'wechat_qr_code_tips'.tr; // 请使用微信扫码支付
-  static final String wechatPayQrCodeTips =
-      'wechat_pay_qr_code_tips'.tr; // 请使用微信扫码支付
-  static final String memberPaymentFailed =
-      'member_payment_failed'.tr; // 开通失败,请稍后重试
+  static final String wechatPayQrCodeTips = 'wechat_pay_qr_code_tips'.tr; // 请使用微信扫码支付
+  static final String memberPaymentFailed = 'member_payment_failed'.tr; // 开通失败,请稍后重试
   static final String exitAppTip = 'exit_app_tip'.tr; // 再按一次退出应用
   static final String traceDetail = 'trace_detail'.tr; // 轨迹详情
-  static final String traceDetailSearchHint =
-      'trace_detail_search_hint'.tr; // 查找地址
+  static final String traceDetailSearchHint = 'trace_detail_search_hint'.tr; // 查找地址
   static final String traceDetailTitle = 'trace_detail_title'.tr; // Ta的线路轨迹
 }
 class StringMultiSource {
@@ -266,6 +260,7 @@ class StringMultiSource {
       'term_of_service': '《服务条款》',
       'friend_add_title': '添加好友',
       'friend_add_desc': '查看实时定位,开启轨迹守护',
+      'friend_add_from_phone': '通过手机号添加',
       'friend_add_phone_et_hint': '请输入手机号',
       'friend_add_address_book': '通讯录',
       'friend_add_from_wx': '通过微信添加',
@@ -433,7 +428,7 @@ class StringMultiSource {
       'contact_no_default': '未设置默认紧急联系人',
       'urgent_contact_help_send_success': '已成功发送求助信息',
       'urgent_contact_add_max_tip': '最多添加5人,请移除后再添加',
-      'urgent_contact_ems_send_fail': '短信发送失败,请核实手机号码',
+      'urgent_contact_ems_send_fail': '短信发送失败,请稍后重试',
       'urgent_contact_ems_send_part_fail': '部分号码发送失败',
       'feed_back': '用户反馈',
       'feed_back_title': '意见或建议:',

+ 0 - 87
lib/sdk/qiyu/qi_yu_helper.dart

@@ -1,87 +0,0 @@
-import 'dart:convert';
-
-import 'package:flutter/cupertino.dart';
-import 'package:flutter_qiyu/qiyu.dart';
-import 'package:flutter_qiyu/qy_service_window_params.dart';
-import 'package:flutter_qiyu/qy_user_info_params.dart';
-import 'package:location/data/consts/build_config.dart';
-import 'package:location/sdk/qiyu/qiyu_info_bean.dart';
-
-import '../../resource/string.gen.dart';
-import '../../utils/app_info_util.dart';
-import '../../utils/atmob_log.dart';
-
-class QiYuHelper {
-  static String tag = 'QiYuHelper';
-
-  QiYuHelper._();
-
-  static void init() async {
-    WidgetsBinding.instance.addPostFrameCallback((_) {
-      QiYu.registerApp(
-        appKey: BuildConfig.qiyuKEY,
-        appName: StringName.appName,
-      );
-    });
-  }
-
-  static void openCustomService() {
-    QYServiceWindowParams serviceWindowParams = QYServiceWindowParams.fromJson({
-      'source': {'sourceTitle': '', 'sourceUrl': '', 'sourceCustomInfo': ''},
-      'sessionTitle': '客服',
-      'groupId': 0,
-      'staffId': 0,
-      'robotId': 0,
-      'robotFirst': false,
-      'faqTemplateId': 0,
-      'vipLevel': 0,
-      'showQuitQueue': true,
-      'showCloseSessionEntry': true
-    });
-    QiYu.openServiceWindow(serviceWindowParams);
-  }
-
-  static void setUserInfo(String? phone, String serverUserId) async {
-    List<QiYuInfoBean> data = [
-      QiYuInfoBean(
-        index: '1',
-        key: 'serverUserId',
-        label: '用户Id',
-        value: serverUserId,
-      ),
-      QiYuInfoBean(
-        index: '2',
-        key: 'version',
-        label: '应用版本',
-        value: appInfoUtil.appVersionName,
-      ),
-      QiYuInfoBean(
-        index: '3',
-        key: 'app_name',
-        label: '应用名称',
-        value: appInfoUtil.appName,
-      ),
-      QiYuInfoBean(
-        index: '4',
-        key: 'packageName',
-        label: '包名',
-        value: appInfoUtil.packageName,
-      ),
-    ];
-    String dataJson = jsonEncode(data.map((e) => e.toJson()).toList());
-    AtmobLog.d(tag, 'setUserInfo dataJson: $dataJson');
-    QYUserInfoParams userInfoParams =
-        QYUserInfoParams.fromJson({'userId': phone, 'data': dataJson});
-    try {
-      await QiYu.setUserInfo(userInfoParams);
-      AtmobLog.d(tag, 'setUserInfo success');
-    } catch (error) {
-      AtmobLog.e(tag, 'setUserInfo error: $error');
-    }
-  }
-
-  static void logout() async {
-    await QiYu.logout();
-    AtmobLog.d(tag, 'logout');
-  }
-}

+ 0 - 27
lib/sdk/qiyu/qiyu_info_bean.dart

@@ -1,27 +0,0 @@
-import 'package:json_annotation/json_annotation.dart';
-
-part 'qiyu_info_bean.g.dart';
-
-@JsonSerializable()
-class QiYuInfoBean {
-  @JsonKey(name: 'index')
-  String? index;
-  @JsonKey(name: 'key')
-  String? key;
-  @JsonKey(name: 'label')
-  String? label;
-  @JsonKey(name: 'value')
-  String? value;
-
-  QiYuInfoBean({
-    this.index,
-    this.key,
-    this.label,
-    this.value,
-  });
-
-  factory QiYuInfoBean.fromJson(Map<String, dynamic> json) =>
-      _$QiYuInfoBeanFromJson(json);
-
-  Map<String, dynamic> toJson() => _$QiYuInfoBeanToJson(this);
-}

+ 0 - 22
lib/sdk/qiyu/qiyu_info_bean.g.dart

@@ -1,22 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'qiyu_info_bean.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-QiYuInfoBean _$QiYuInfoBeanFromJson(Map<String, dynamic> json) => QiYuInfoBean(
-      index: json['index'] as String?,
-      key: json['key'] as String?,
-      label: json['label'] as String?,
-      value: json['value'] as String?,
-    );
-
-Map<String, dynamic> _$QiYuInfoBeanToJson(QiYuInfoBean instance) =>
-    <String, dynamic>{
-      'index': instance.index,
-      'key': instance.key,
-      'label': instance.label,
-      'value': instance.value,
-    };

+ 3 - 3
lib/socket/atmob_location_client.dart

@@ -124,9 +124,9 @@ class AtmobLocationClient {
             case SocketConstants.refreshFriendRequest:
               MessageRepository.getInstance().refreshFriendWaitingCount();
               break;
-            // case SocketConstants.refreshFriendMessage:
-            //   MessageRepository.getInstance().requestMessageList();
-            //   break;
+            case SocketConstants.refreshFriendMessage:
+              MessageRepository.getInstance().refreshUnreadMessage();
+              break;
             case SocketConstants.refreshContact:
               ContactRepository.getInstance().refreshContactList();
               break;

+ 3 - 1
plugins/map/lib/src/widget/map_widget.dart

@@ -5,8 +5,8 @@ import 'package:flutter/foundation.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/entity/marker.dart';
 import 'package:flutter_map/src/core/map_controller.dart';
+import 'package:flutter_map/src/entity/marker.dart';
 
 class MapWidget extends StatefulWidget {
   final MapController? controller;
@@ -27,6 +27,8 @@ class _MapWidgetState extends State<MapWidget> {
 
   @override
   Widget build(BuildContext context) {
+    debugPrint(
+        'MapWidget...build...mapViewType==>$mapViewType,defaultTargetPlatform==>$defaultTargetPlatform');
     if (defaultTargetPlatform == TargetPlatform.android) {
       return AndroidView(
         viewType: mapViewType,

+ 1 - 0
plugins/map_amap_android/android/src/main/AndroidManifest.xml

@@ -25,6 +25,7 @@
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
     <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /><!-- 电池优化白名单 -->
+    <uses-permission android:name="android.permission.WAKE_LOCK" />
 
     <application>
 

+ 28 - 30
plugins/map_amap_android/android/src/main/java/com/atmob/map_amap_android/amap/AmapView.java

@@ -4,8 +4,6 @@ import android.app.Activity;
 import android.content.Context;
 import android.os.Bundle;
 import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -15,15 +13,14 @@ import androidx.lifecycle.LifecycleOwner;
 import com.amap.api.maps.AMap;
 import com.amap.api.maps.CameraUpdateFactory;
 import com.amap.api.maps.MapView;
-import com.amap.api.maps.TextureMapView;
 import com.atmob.map_amap_android.contants.Constants;
 import com.atmob.map_amap_android.overlays.MyMethodCallHandler;
 import com.atmob.map_amap_android.overlays.marker.MarkersController;
 import com.atmob.map_amap_android.overlays.polyline.PolylineController;
 import com.atmob.map_amap_android.util.LogUtil;
 
-import java.util.Map;
 import java.util.HashMap;
+import java.util.Map;
 import java.util.Objects;
 
 import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
@@ -38,7 +35,6 @@ public class AmapView implements PlatformView, DefaultLifecycleObserver, MethodC
 
     private static final int DEFAULT_MAP_ZOOM_SCALE = 18;
 
-
     private final MethodChannel channel;
 
     private MapView mapView = null;
@@ -55,6 +51,7 @@ public class AmapView implements PlatformView, DefaultLifecycleObserver, MethodC
 
     private final int viewId;
 
+    private Bundle bundle;
 
     public AmapView(Context context, Activity activity, BinaryMessenger messenger, int viewId, Map<String, Object> args, LifecycleOwner lifecycleProvider) {
         this.viewId = viewId;
@@ -62,8 +59,22 @@ public class AmapView implements PlatformView, DefaultLifecycleObserver, MethodC
         channel.setMethodCallHandler(this);
         myMethodCallHandlerMap = new HashMap<>(8);
 
+        LogUtil.i(TAG, "AmapView() ==> viewId: " + viewId + ", hash: " + this.hashCode());
+
         try {
             mapView = new MapView(context);
+            mapView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
+                @Override
+                public void onViewAttachedToWindow(@NonNull View v) {
+                    LogUtil.i(TAG, "onViewAttachedToWindow() ==> viewId: " + viewId + ", disposed: " + disposed);
+                    v.invalidate();
+                }
+
+                @Override
+                public void onViewDetachedFromWindow(@NonNull View v) {
+                    LogUtil.i(TAG, "onViewDetachedFromWindow() ==> viewId: " + viewId + ", disposed: " + disposed);
+                }
+            });
             AMap amap = mapView.getMap();
             initMapDefaultSetting(amap);
             mapController = new MapController(context, channel, amap);
@@ -78,7 +89,6 @@ public class AmapView implements PlatformView, DefaultLifecycleObserver, MethodC
         }
     }
 
-
     private void initMyMethodCallHandlerMap() {
         String[] methodIdArray = markersController.getRegisterMethodIdArray();
         if (null != methodIdArray) {
@@ -102,7 +112,6 @@ public class AmapView implements PlatformView, DefaultLifecycleObserver, MethodC
         }
     }
 
-
     private void initMapDefaultSetting(AMap map) {
         if (map == null) {
             return;
@@ -112,17 +121,16 @@ public class AmapView implements PlatformView, DefaultLifecycleObserver, MethodC
         map.moveCamera(CameraUpdateFactory.zoomTo(DEFAULT_MAP_ZOOM_SCALE));
     }
 
-
     @Nullable
     @Override
     public View getView() {
+        LogUtil.i(TAG, "getView() ==> viewId: " + viewId + ", disposed: " + disposed);
         return mapView;
     }
 
-
     @Override
     public void dispose() {
-        LogUtil.i(TAG, "dispose==>" + viewId);
+        LogUtil.i(TAG, "dispose() ==> viewId: " + viewId + ", disposed: " + disposed);
         try {
             if (disposed) {
                 return;
@@ -135,7 +143,6 @@ public class AmapView implements PlatformView, DefaultLifecycleObserver, MethodC
         }
     }
 
-
     @Override
     public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
         LogUtil.i(TAG, "onMethodCall==>" + call.method + ", arguments==> " + call.arguments);
@@ -154,16 +161,15 @@ public class AmapView implements PlatformView, DefaultLifecycleObserver, MethodC
 
     }
 
-
     @Override
     public void onCreate(@NonNull LifecycleOwner owner) {
-        LogUtil.i(TAG, "onCreate==>" + viewId);
+        LogUtil.i(TAG, "onCreate() ==> viewId: " + viewId + ", disposed: " + disposed);
         try {
             if (disposed) {
                 return;
             }
             if (null != mapView) {
-                mapView.onCreate(null);
+                mapView.onCreate(bundle);
             }
         } catch (Throwable e) {
             LogUtil.e(TAG, "onCreate", e);
@@ -172,13 +178,12 @@ public class AmapView implements PlatformView, DefaultLifecycleObserver, MethodC
 
     @Override
     public void onStart(@NonNull LifecycleOwner owner) {
-        LogUtil.i(TAG, "onStart==>" + viewId);
+        LogUtil.i(TAG, "onStart() ==> viewId: " + viewId + ", disposed: " + disposed);
     }
 
-
     @Override
     public void onResume(@NonNull LifecycleOwner owner) {
-        LogUtil.i(TAG, "onResume==>" + viewId);
+        LogUtil.i(TAG, "onResume() ==> viewId: " + viewId + ", disposed: " + disposed);
         try {
             if (disposed) {
                 return;
@@ -193,7 +198,7 @@ public class AmapView implements PlatformView, DefaultLifecycleObserver, MethodC
 
     @Override
     public void onPause(@NonNull LifecycleOwner owner) {
-        LogUtil.i(TAG, "onPause==>" + viewId);
+        LogUtil.i(TAG, "onPause() ==> viewId: " + viewId + ", disposed: " + disposed);
         try {
             if (disposed) {
                 return;
@@ -206,12 +211,12 @@ public class AmapView implements PlatformView, DefaultLifecycleObserver, MethodC
 
     @Override
     public void onStop(@NonNull LifecycleOwner owner) {
-        LogUtil.i(TAG, "onStop==>" + viewId);
+        LogUtil.i(TAG, "onStop() ==> viewId: " + viewId + ", disposed: " + disposed);
     }
 
     @Override
     public void onDestroy(@NonNull LifecycleOwner owner) {
-        LogUtil.i(TAG, "onDestroy==>" + viewId);
+        LogUtil.i(TAG, "onDestroy() ==> viewId: " + viewId + ", disposed: " + disposed);
         try {
             if (disposed) {
                 return;
@@ -224,7 +229,7 @@ public class AmapView implements PlatformView, DefaultLifecycleObserver, MethodC
 
     @Override
     public void onSaveInstanceState(@NonNull Bundle bundle) {
-        LogUtil.i(TAG, "onSaveInstanceState==>" + viewId);
+        LogUtil.i(TAG, "onSaveInstanceState() ==> viewId: " + viewId + ", disposed: " + disposed);
         try {
             if (disposed) {
                 return;
@@ -237,15 +242,8 @@ public class AmapView implements PlatformView, DefaultLifecycleObserver, MethodC
 
     @Override
     public void onRestoreInstanceState(@Nullable Bundle bundle) {
-        LogUtil.i(TAG, "onRestoreInstanceState==>" + viewId);
-        try {
-            if (disposed) {
-                return;
-            }
-            mapView.onCreate(bundle);
-        } catch (Throwable e) {
-            LogUtil.e(TAG, "onRestoreInstanceState", e);
-        }
+        this.bundle = bundle;
+        LogUtil.i(TAG, "onRestoreInstanceState() ==> viewId: " + viewId + ", disposed: " + disposed);
     }
 
     private void destroyMapViewIfNecessary() {

+ 1 - 4
plugins/map_amap_android/android/src/main/java/com/atmob/map_amap_android/util/AMapHelper.java

@@ -93,10 +93,7 @@ public class AMapHelper {
             notificationManager.createNotificationChannel(notificationChannel);
         }
 
-        Intent splashIntent = new Intent();
-        splashIntent.setAction(Intent.ACTION_MAIN);
-        splashIntent.addCategory(Intent.CATEGORY_LAUNCHER);
-        splashIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        Intent splashIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
 
         PendingIntent contentIntent = PendingIntent.getActivity(
                 context,

Різницю між файлами не показано, бо вона завелика
+ 209 - 216
pubspec.lock


+ 0 - 4
pubspec.yaml

@@ -103,10 +103,6 @@ dependencies:
   #拨号
   url_launcher: 6.3.1
 
-  #七鱼
-  flutter_qiyu:
-    path: plugins/flutter_qiyu
-
   #并发
   synchronized: ^3.3.0+2