Browse Source

[new]Android端app退出跳转至桌面

zk 8 months ago
parent
commit
708618eb86

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

@@ -286,4 +286,5 @@
     <string name="alipay_qr_code_tips">请使用支付宝扫码支付</string>
     <string name="wechat_pay_qr_code_tips">请使用微信扫码支付</string>
     <string name="member_payment_failed">开通失败,请稍后重试</string>
+    <string name="exit_app_tip">再按一次退出应用</string>
 </resources>

+ 24 - 1
lib/module/main/main_controller.dart

@@ -1,5 +1,8 @@
 import 'dart:async';
+import 'dart:io';
 
+import 'package:flutter/services.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';
@@ -21,7 +24,6 @@ import 'package:location/resource/string.gen.dart';
 import 'package:location/sdk/map/map_helper.dart';
 import 'package:location/utils/base_expand.dart';
 import 'package:location/utils/toast_util.dart';
-import '../../data/bean/request_friend_info.dart';
 import '../../data/repositories/config_repository.dart';
 import '../../data/repositories/urgent_contact_repository.dart';
 import '../../dialog/common_alert_dialog_impl.dart';
@@ -65,6 +67,8 @@ class MainController extends BaseController {
 
   int get waitingNewsCount => messageRepository.waitingCount.value;
 
+  DateTime? _lastPressedAt;
+
   MainController(
       this.friendsRepository,
       this.accountRepository,
@@ -308,4 +312,23 @@ class MainController extends BaseController {
       UrgentContactPage.start();
     }
   }
+
+  void onAppBack() {
+    if ((_lastPressedAt == null ||
+        DateTime.now().difference(_lastPressedAt!) >
+            const Duration(seconds: 2))) {
+      _lastPressedAt = DateTime.now();
+      ToastUtil.show(StringName.exitAppTip);
+    } else {
+      back();
+    }
+  }
+
+  void back() {
+    if (Platform.isAndroid) {
+      FlutterToolAndroid.backHome();
+    } else {
+      SystemNavigator.pop();
+    }
+  }
 }

+ 109 - 101
lib/module/main/main_page.dart

@@ -33,113 +33,120 @@ class MainPage extends BasePage<MainController> {
 
   @override
   Widget buildBody(BuildContext context) {
-    return Stack(
-      children: [
-        Padding(
-          padding: EdgeInsets.only(bottom: 50.h),
-          child: SizedBox(
-              width: double.infinity,
-              child: MapWidget(
-                controller: controller.mapController,
-                onMarkerTap: controller.onMarkerTap,
-              )),
-        ),
-        Align(
-          alignment: Alignment.bottomCenter,
-          child: IntrinsicHeight(
-            child: Column(
-              children: [
-                Row(
-                  crossAxisAlignment: CrossAxisAlignment.end,
-                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                  children: [
-                    Visibility(
-                      visible: false,
-                      child: Container(
-                          margin: EdgeInsets.only(bottom: 24.w, left: 12.w),
-                          child: Assets.images.iconMainMapClock
-                              .image(width: 50.w)),
-                    ),
-                    Align(
-                      alignment: Alignment.bottomRight,
-                      child: Column(
-                        children: [
-                          GestureDetector(
-                            onTap: controller.onRefreshFriendLocationClick,
-                            child: Container(
-                                margin: EdgeInsets.only(right: 12.w),
-                                child: Assets
-                                    .images.iconMainRefreshFriendLocation
-                                    .image(width: 42.w, height: 42.w)),
-                          ),
-                          SizedBox(height: 14.w),
-                          GestureDetector(
-                            onTap: controller.onCurrentLocationClick,
-                            child: Container(
-                                margin: EdgeInsets.only(right: 12.w),
-                                child: Assets.images.iconMainRefreshMineLocation
-                                    .image(width: 42.w, height: 42.w)),
-                          ),
-                          SizedBox(height: 20.w)
-                        ],
-                      ),
-                    )
-                  ],
-                ),
-                Container(
-                  decoration: BoxDecoration(
-                    color: '#F9F9F9'.color,
-                    borderRadius: BorderRadius.only(
-                      topLeft: Radius.circular(20.w),
-                      topRight: Radius.circular(20.w),
-                    ),
-                  ),
-                  child: Column(
+    return PopScope(
+      canPop: false,
+      onPopInvokedWithResult: (bool didPop, dynamic result) {
+        controller.onAppBack();
+      },
+      child: Stack(
+        children: [
+          Padding(
+            padding: EdgeInsets.only(bottom: 50.h),
+            child: SizedBox(
+                width: double.infinity,
+                child: MapWidget(
+                  controller: controller.mapController,
+                  onMarkerTap: controller.onMarkerTap,
+                )),
+          ),
+          Align(
+            alignment: Alignment.bottomCenter,
+            child: IntrinsicHeight(
+              child: Column(
+                children: [
+                  Row(
+                    crossAxisAlignment: CrossAxisAlignment.end,
+                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                     children: [
-                      SizedBox(height: 5.w),
-                      Container(
-                        width: 32.w,
-                        height: 3.w,
-                        decoration: BoxDecoration(
-                            color: '#D9D9D9'.color,
-                            borderRadius:
-                                BorderRadius.all(Radius.circular(49.w))),
+                      Visibility(
+                        visible: false,
+                        child: Container(
+                            margin: EdgeInsets.only(bottom: 24.w, left: 12.w),
+                            child: Assets.images.iconMainMapClock
+                                .image(width: 50.w)),
                       ),
-                      SizedBox(height: 12.w),
-                      buildSelectFriendInfoView(),
-                      Obx(() {
-                        return Visibility(
-                            visible: controller.selectedFriend != null,
-                            child: SizedBox(height: 13.w));
-                      }),
-                      buildTabContainer()
+                      Align(
+                        alignment: Alignment.bottomRight,
+                        child: Column(
+                          children: [
+                            GestureDetector(
+                              onTap: controller.onRefreshFriendLocationClick,
+                              child: Container(
+                                  margin: EdgeInsets.only(right: 12.w),
+                                  child: Assets
+                                      .images.iconMainRefreshFriendLocation
+                                      .image(width: 42.w, height: 42.w)),
+                            ),
+                            SizedBox(height: 14.w),
+                            GestureDetector(
+                              onTap: controller.onCurrentLocationClick,
+                              child: Container(
+                                  margin: EdgeInsets.only(right: 12.w),
+                                  child: Assets
+                                      .images.iconMainRefreshMineLocation
+                                      .image(width: 42.w, height: 42.w)),
+                            ),
+                            SizedBox(height: 20.w)
+                          ],
+                        ),
+                      )
                     ],
                   ),
-                )
-              ],
+                  Container(
+                    decoration: BoxDecoration(
+                      color: '#F9F9F9'.color,
+                      borderRadius: BorderRadius.only(
+                        topLeft: Radius.circular(20.w),
+                        topRight: Radius.circular(20.w),
+                      ),
+                    ),
+                    child: Column(
+                      children: [
+                        SizedBox(height: 5.w),
+                        Container(
+                          width: 32.w,
+                          height: 3.w,
+                          decoration: BoxDecoration(
+                              color: '#D9D9D9'.color,
+                              borderRadius:
+                                  BorderRadius.all(Radius.circular(49.w))),
+                        ),
+                        SizedBox(height: 12.w),
+                        buildSelectFriendInfoView(),
+                        Obx(() {
+                          return Visibility(
+                              visible: controller.selectedFriend != null,
+                              child: SizedBox(height: 13.w));
+                        }),
+                        buildTabContainer()
+                      ],
+                    ),
+                  )
+                ],
+              ),
             ),
           ),
-        ),
-        SafeArea(
-          child: Container(
-            margin: EdgeInsets.only(top: 26.w),
-            child: Row(
-              children: [
-                Expanded(child: buildMainFriendList()),
-                GestureDetector(
-                  onTap: () {
-                    controller.onAddFriendClick();
-                  },
-                  child: Container(
-                      margin: EdgeInsets.only(right: 16.w, left: 8.w),
-                      child: Assets.images.iconMainAddFriend
-                          .image(width: 60.w, height: 60.w)),
-                )
-              ],
+          SafeArea(
+            child: Container(
+              margin: EdgeInsets.only(top: 26.w),
+              child: Row(
+                children: [
+                  Expanded(child: buildMainFriendList()),
+                  GestureDetector(
+                    onTap: () {
+                      controller.onAddFriendClick();
+                    },
+                    child: Container(
+                        margin: EdgeInsets.only(right: 16.w, left: 8.w),
+                        child: Assets.images.iconMainAddFriend
+                            .image(width: 60.w, height: 60.w)),
+                  )
+                ],
+              ),
             ),
-          ),
-        )
-      ],
+          )
+        ],
+      ),
     );
   }
 
@@ -170,7 +177,8 @@ class MainPage extends BasePage<MainController> {
               isShowDot: controller.waitingNewsCount > 0);
         })),
         Expanded(
-            child: buildFunItem(Assets.images.iconMainHelp.provider(),
+            child: buildFunItem(
+                Assets.images.iconMainHelp.provider(),
                 StringName.mainHelpTab,
                 () => controller.onUrgentContactClick())),
         Expanded(

+ 2 - 0
lib/resource/string.gen.dart

@@ -241,6 +241,7 @@ class StringName {
       'wechat_pay_qr_code_tips'.tr; // 请使用微信扫码支付
   static final String memberPaymentFailed =
       'member_payment_failed'.tr; // 开通失败,请稍后重试
+  static final String exitAppTip = 'exit_app_tip'.tr; // 再按一次退出应用
 }
 class StringMultiSource {
   StringMultiSource._();
@@ -479,6 +480,7 @@ class StringMultiSource {
       'alipay_qr_code_tips': '请使用支付宝扫码支付',
       'wechat_pay_qr_code_tips': '请使用微信扫码支付',
       'member_payment_failed': '开通失败,请稍后重试',
+      'exit_app_tip': '再按一次退出应用',
     },
   };
 }

+ 14 - 2
plugins/flutter_tool_android/android/src/main/java/com/atmob/flutter_tool_android/FlutterToolAndroidPlugin.java

@@ -1,6 +1,7 @@
 package com.atmob.flutter_tool_android;
 
 import android.content.Context;
+import android.content.Intent;
 
 import androidx.annotation.NonNull;
 
@@ -42,10 +43,21 @@ public class FlutterToolAndroidPlugin implements FlutterPlugin, MethodCallHandle
         } else if (Objects.equals(method, "openBatteryOptimizationSettings")) {
             BatteryUtil.openBatteryOptimizationSettings(context);
             result.success(null);
-        } else if(Objects.equals(method,"openAppBackgroundSetting")){
+        } else if (Objects.equals(method, "openAppBackgroundSetting")) {
             BackgroundPermissionUtil.requestBackgroundPermission(context);
             result.success(null);
-        }else {
+        } else if (Objects.equals(method, "backHome")) {
+            try {
+                Intent intent = new Intent();
+                intent.setAction(Intent.ACTION_MAIN);
+                intent.addCategory(Intent.CATEGORY_HOME);
+                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                context.startActivity(intent);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            result.success(null);
+        } else {
             result.notImplemented();
         }
     }

+ 4 - 0
plugins/flutter_tool_android/lib/flutter_tool_android.dart

@@ -15,4 +15,8 @@ class FlutterToolAndroid {
   static Future<void> openAppBackgroundSetting() {
     return FlutterToolAndroidPlatform.instance.openAppBackgroundSetting();
   }
+
+  static Future<void> backHome() {
+    return FlutterToolAndroidPlatform.instance.backHome();
+  }
 }

+ 5 - 0
plugins/flutter_tool_android/lib/src/flutter_tool_android_method_channel.dart

@@ -26,4 +26,9 @@ class MethodChannelFlutterToolAndroid extends FlutterToolAndroidPlatform {
   Future<void> openAppBackgroundSetting() async {
     return await methodChannel.invokeMethod<void>('openAppBackgroundSetting');
   }
+
+  @override
+  Future<void> backHome() async {
+    return await methodChannel.invokeMethod<void>('backHome');
+  }
 }

+ 4 - 0
plugins/flutter_tool_android/lib/src/flutter_tool_android_platform_interface.dart

@@ -38,4 +38,8 @@ abstract class FlutterToolAndroidPlatform extends PlatformInterface {
     throw UnimplementedError(
         'openAppBackgroundSetting() has not been implemented.');
   }
+
+  Future<void> backHome() {
+    throw UnimplementedError('backHome() has not been implemented.');
+  }
 }