Jelajahi Sumber

[new]增加网络连接异常弹窗并根据网络情况弹窗以及关闭

zk 5 bulan lalu
induk
melakukan
fc5c623674

+ 1 - 0
android/app/src/main/AndroidManifest.xml

@@ -3,6 +3,7 @@
 
 
     <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.READ_CONTACTS" />
 
     <queries>

TEMPAT SAMPAH
assets/images/icon_dialog_close2.webp


TEMPAT SAMPAH
assets/images/icon_dialog_net_error.webp


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

@@ -302,4 +302,8 @@
     <string name="dialog_location_always_permission_title">允许定位权限</string>
     <string name="dialog_location_always_permission_confirm_txt">去设置</string>
     <string name="apple_recover_subscribe_txt">恢复订阅</string>
+
+    <string name="dialog_net_error_title">网络已断开</string>
+    <string name="dialog_net_error_desc">请检查您的网络连接并重试</string>
+    <string name="dialog_net_error_again">重试</string>
 </resources>

+ 116 - 0
lib/dialog/net_error_dialog.dart

@@ -0,0 +1,116 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
+import 'package:location/helper/internet_connection_helper.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 'package:location/utils/toast_util.dart';
+
+class NetErrorDialog {
+  static const String _tag = 'NetErrorDialog';
+
+  static void show() {
+    if (SmartDialog.checkExist(tag: _tag)) {
+      return;
+    }
+    SmartDialog.show(builder: (_) => _NetErrorView(), tag: _tag);
+  }
+
+  static void dismiss() {
+    SmartDialog.dismiss(tag: _tag);
+  }
+}
+
+class _NetErrorView extends StatelessWidget {
+  const _NetErrorView({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      width: 274.w,
+      decoration: BoxDecoration(
+          borderRadius: BorderRadius.circular(16.r),
+          border: Border.all(
+            color: Colors.white,
+            width: 2.w,
+          ),
+          gradient: LinearGradient(
+              begin: Alignment.topCenter,
+              end: Alignment.bottomCenter,
+              colors: [
+                '#E4E4FF'.color,
+                '#FFFFFF'.color,
+              ])),
+      child: Stack(
+        alignment: Alignment.center,
+        children: [
+          Positioned(
+              top: 16.w,
+              right: 16.w,
+              child: GestureDetector(
+                onTap: onNetErrorCloseClick,
+                child: Assets.images.iconDialogClose2
+                    .image(width: 20.w, height: 20.w),
+              )),
+          buildNetErrorContent(),
+        ],
+      ),
+    );
+  }
+
+  Widget buildNetErrorContent() {
+    return IntrinsicHeight(
+      child: Column(
+        children: [
+          SizedBox(height: 30.w),
+          Assets.images.iconDialogNetError.image(height: 98.w),
+          SizedBox(height: 10.w),
+          Text(
+            StringName.dialogNetErrorTitle,
+            style: TextStyle(
+                fontSize: 17.sp,
+                color: '#333333'.color,
+                fontWeight: FontWeight.bold),
+          ),
+          SizedBox(height: 8.w),
+          Text(StringName.dialogNetErrorDesc,
+              style: TextStyle(fontSize: 15.sp, color: '#999999'.color)),
+          SizedBox(height: 22.w),
+          GestureDetector(
+            onTap: onNetErrorAgainClick,
+            child: Container(
+              width: 229.w,
+              height: 43.w,
+              decoration: BoxDecoration(
+                color: ColorName.colorPrimary,
+                borderRadius: BorderRadius.circular(100.r),
+              ),
+              child: Center(
+                child: Text(StringName.dialogNetErrorAgain,
+                    style: TextStyle(
+                        fontSize: 14.sp,
+                        color: Colors.white,
+                        fontWeight: FontWeight.w500)),
+              ),
+            ),
+          ),
+          SizedBox(height: 20.w),
+        ],
+      ),
+    );
+  }
+
+  void onNetErrorAgainClick() async {
+    if (await InternetConnectionHelper.isConnected()) {
+      NetErrorDialog.dismiss();
+    } else {
+      ToastUtil.show(StringName.networkError);
+    }
+  }
+
+  void onNetErrorCloseClick() {
+    NetErrorDialog.dismiss();
+  }
+}

+ 36 - 0
lib/helper/internet_connection_helper.dart

@@ -0,0 +1,36 @@
+import 'dart:async';
+
+import 'package:internet_connection_checker/internet_connection_checker.dart';
+
+import '../dialog/net_error_dialog.dart';
+
+class InternetConnectionHelper {
+  InternetConnectionHelper._();
+
+  static StreamSubscription<InternetConnectionStatus>? _subscription;
+
+  ///当前网络是否可用
+  static Future<bool> isConnected() {
+    return InternetConnectionChecker.instance.hasConnection;
+  }
+
+  static void startInternetConnection() {
+    _subscription?.cancel();
+    _subscription = InternetConnectionChecker.instance.onStatusChange.listen(
+      (InternetConnectionStatus status) {
+        if (status == InternetConnectionStatus.connected) {
+          //有网
+          NetErrorDialog.dismiss();
+        } else {
+          //无网络|网络差
+          NetErrorDialog.show();
+        }
+      },
+    );
+  }
+
+  //一般不需要调用
+  static void stopInternetConnection() {
+    _subscription?.cancel();
+  }
+}

+ 3 - 0
lib/module/main/main_controller.dart

@@ -32,6 +32,7 @@ import '../../dialog/common_alert_dialog_impl.dart';
 import '../../dialog/common_confirm_dialog_impl.dart';
 import '../../dialog/friend_dialog.dart';
 import '../../dialog/location_permission_dialog.dart';
+import '../../helper/internet_connection_helper.dart';
 import '../../sdk/wechat/wechat_share_util.dart';
 import '../../socket/atmob_location_client.dart';
 import '../../utils/location_convert_marker_util.dart';
@@ -89,6 +90,8 @@ class MainController extends BaseController {
   @override
   void onReady() {
     super.onReady();
+    InternetConnectionHelper.startInternetConnection();
+
     integrateList.add(mineUserInfo);
     initLastCheckFriendId();
 

+ 10 - 0
lib/resource/assets.gen.dart

@@ -116,6 +116,14 @@ class $AssetsImagesGen {
   AssetGenImage get iconDialogClose =>
       const AssetGenImage('assets/images/icon_dialog_close.webp');
 
+  /// File path: assets/images/icon_dialog_close2.webp
+  AssetGenImage get iconDialogClose2 =>
+      const AssetGenImage('assets/images/icon_dialog_close2.webp');
+
+  /// File path: assets/images/icon_dialog_net_error.webp
+  AssetGenImage get iconDialogNetError =>
+      const AssetGenImage('assets/images/icon_dialog_net_error.webp');
+
   /// File path: assets/images/icon_evaluate_1.webp
   AssetGenImage get iconEvaluate1 =>
       const AssetGenImage('assets/images/icon_evaluate_1.webp');
@@ -420,6 +428,8 @@ class $AssetsImagesGen {
         iconDefaultMineAvatar,
         iconDialogAddFriend,
         iconDialogClose,
+        iconDialogClose2,
+        iconDialogNetError,
         iconEvaluate1,
         iconEvaluate2,
         iconEvaluate3,

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

@@ -2,7 +2,6 @@ import 'package:get/get.dart';
 
 class StringName {
   StringName._();
-
   static String get appName => 'app_name'.tr; // 手机实时定位
   static String get mainTabHome => 'main_tab_home'.tr; // 首页
   static String get mainTabCamera => 'main_tab_camera'.tr; // 扫一扫
@@ -357,10 +356,13 @@ class StringName {
       'dialog_location_always_permission_confirm_txt'.tr; // 去设置
   static String get appleRecoverSubscribeTxt =>
       'apple_recover_subscribe_txt'.tr; // 恢复订阅
+  static String get dialogNetErrorTitle => 'dialog_net_error_title'.tr; // 网络已断开
+  static String get dialogNetErrorDesc =>
+      'dialog_net_error_desc'.tr; // 请检查您的网络连接并重试
+  static String get dialogNetErrorAgain => 'dialog_net_error_again'.tr; // 重试
 }
 class StringMultiSource {
   StringMultiSource._();
-
   static const Map<String, Map<String, String>> translations = {
     'zh_CN': {
       'app_name': '手机实时定位',
@@ -610,6 +612,9 @@ class StringMultiSource {
       'dialog_location_always_permission_title': '允许定位权限',
       'dialog_location_always_permission_confirm_txt': '去设置',
       'apple_recover_subscribe_txt': '恢复订阅',
+      'dialog_net_error_title': '网络已断开',
+      'dialog_net_error_desc': '请检查您的网络连接并重试',
+      'dialog_net_error_again': '重试',
     },
   };
 }

+ 3 - 0
pubspec.yaml

@@ -124,6 +124,9 @@ dependencies:
   #QR
   qr_flutter: ^4.1.0
 
+  #网络连接情况
+  internet_connection_checker: ^3.0.1
+
   ######################地图########################
   flutter_map:
     path: plugins/map