فهرست منبع

[new]增加微信落地页分享

zk 8 ماه پیش
والد
کامیت
f9d9e06943

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

@@ -143,6 +143,7 @@
     </string>
     <string name="dialog_not_login">登录之后才可以发送好友申请</string>
     <string name="dialog_go_login">去登录</string>
+    <string name="invite_friends">邀请好友</string>
     <string name="invite_content">
         该好友未注册,将应用分享给好友需要好友下载安装并同意授权后可查看定位
     </string>
@@ -152,4 +153,8 @@
     <string name="add_friend_added">该好友已在好友列表</string>
     <string name="send_add_friend_success">好友申请已发出,请等待对方通过</string>
     <string name="add_friend_own">不能添加自己为好友</string>
+    <string name="share_friend_title">邀请好友</string>
+    <string name="share_friend_desc">将应用分享给好友,需要好友下载安装并同意授权后可查看定位。
+    </string>
+    <string name="wechat_no_install">微信未安装</string>
 </resources>

+ 2 - 0
lib/data/consts/build_config.dart

@@ -4,4 +4,6 @@ final class BuildConfig {
   BuildConfig._();
 
   static bool get isDebug => kDebugMode;
+
+  static final String wechatAppId = 'wx64695e2b8346a227';
 }

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

@@ -10,9 +10,13 @@ class WebUrl {
   static const String _userAgreement =
       "https://doc.v8dashen.com/doc/417838a4f155ec74";
 
+  static const String _shareUrl = "https://www.v8dashen.com";
+
   static String get privacyPolicy => _privacyPolicy;
 
   static String get privacyPolicyIos => _privacyPolicyIos;
 
   static String get userAgreement => _userAgreement;
+
+  static String get shareUrl => _shareUrl;
 }

+ 15 - 0
lib/dialog/common_confirm_dialog_impl.dart

@@ -55,3 +55,18 @@ void showNotRegisteredDialog({required VoidCallback onConfirm}) {
       confirmText: StringName.inviteBtn,
       confirmOnTap: onConfirm);
 }
+
+void showAppShareDialog({required VoidCallback onConfirm}) {
+  CommonConfirmDialog.show(
+      titleWidget: Text(StringName.shareFriendTitle,
+          style: TextStyle(
+              fontSize: 17.sp,
+              color: '#333333'.color,
+              fontWeight: FontWeight.bold)),
+      descWidget: Text(
+        StringName.shareFriendDesc,
+        style: TextStyle(fontSize: 14.sp, color: '#404040'.color),
+      ),
+      confirmText: StringName.inviteBtn,
+      confirmOnTap: onConfirm);
+}

+ 3 - 0
lib/main.dart

@@ -11,6 +11,7 @@ import 'package:location/resource/string.gen.dart';
 import 'package:location/resource/string_source.dart';
 import 'package:location/router/app_pages.dart';
 import 'package:location/sdk/map/map_helper.dart';
+import 'package:location/sdk/wechat/wechat_helper.dart';
 import 'package:location/utils/app_info_util.dart';
 import 'package:location/utils/mmkv_util.dart';
 import 'package:location/utils/privacy_compliance.dart';
@@ -53,6 +54,8 @@ void initCommon() {
   smartConfig();
   //渠道(仅Android)
   ChannelUtil.initChannel();
+  //微信注册
+  WechatHelper.registerApp();
 }
 
 /// 隐私相关初始化

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

@@ -2,18 +2,23 @@ import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
 import 'package:injectable/injectable.dart';
 import 'package:location/data/consts/error_code.dart';
+import 'package:location/data/consts/web_url.dart';
 import 'package:location/data/repositories/friends_repository.dart';
 import 'package:location/module/login/login_page.dart';
+import 'package:location/resource/assets.gen.dart';
 import 'package:location/resource/string.gen.dart';
+import 'package:location/sdk/wechat/wechat_helper.dart';
 import 'package:location/utils/common_expand.dart';
 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 'package:wechat_kit/wechat_kit.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_helper.dart';
 import '../../utils/de_bounce.dart';
 
 @injectable
@@ -77,7 +82,28 @@ class AddFriendDialogController extends BaseController {
     });
   }
 
-  void _shareToWechat() {}
+  void shareWxClick() {
+    showAppShareDialog(onConfirm: () {
+      _shareToWechat();
+    });
+  }
+
+  void _shareToWechat() async {
+    if (!await WechatHelper.isInstalled()) {
+      ToastUtil.show(StringName.wechatNoInstall);
+      return;
+    }
+    WechatHelper.shareUrlToWechat(
+            scene: WechatScene.kSession,
+            webpageUrl: WebUrl.shareUrl,
+            title: StringName.shareFriendTitle,
+            description: StringName.shareFriendDesc,
+            thumbData: await WechatShareHelper.assetImageToBytes(
+                Assets.images.iconMainMapClock.path))
+        .catchError((error) {
+      ToastUtil.show(error.toString());
+    });
+  }
 
   void _showNoLoginDialog() {
     showLoginDialog(onConfirm: () {
@@ -85,11 +111,6 @@ class AddFriendDialogController extends BaseController {
     });
   }
 
-  @override
-  void onClose() {
-    super.onClose();
-    etController.dispose();
-  }
 
   void onSelectContactClick() async {
     bool isGranted = await PermissionUtil.checkPermission(Permission.contacts);
@@ -116,4 +137,10 @@ class AddFriendDialogController extends BaseController {
       }
     }
   }
+
+  @override
+  void onClose() {
+    super.onClose();
+    etController.dispose();
+  }
 }

+ 28 - 25
lib/module/add_friend/add_friend_page.dart

@@ -75,32 +75,35 @@ class AddFriendPage extends BaseView<AddFriendDialogController> {
     );
   }
 
-  Container _buildShareWx() {
-    return Container(
-      height: 54.w,
-      decoration: BoxDecoration(boxShadow: [
-        BoxShadow(
-          color: ColorName.black5.withOpacity(0.05), // 阴影颜色
-          blurRadius: 23, // 阴影模糊半径
-          spreadRadius: 2, // 阴影扩展半径
-          offset: const Offset(0, 0), // 阴影位置,向上偏移
+  Widget _buildShareWx() {
+    return GestureDetector(
+      onTap: controller.shareWxClick,
+      child: Container(
+        height: 54.w,
+        decoration: BoxDecoration(boxShadow: [
+          BoxShadow(
+            color: ColorName.black5.withOpacity(0.05), // 阴影颜色
+            blurRadius: 23, // 阴影模糊半径
+            spreadRadius: 2, // 阴影扩展半径
+            offset: const Offset(0, 0), // 阴影位置,向上偏移
+          ),
+        ], color: ColorName.white, borderRadius: BorderRadius.circular(12.w)),
+        margin: EdgeInsets.symmetric(horizontal: 12.w),
+        child: Row(
+          children: [
+            SizedBox(width: 15.w),
+            Assets.images.iconLoginWx.image(width: 25.w),
+            SizedBox(width: 15.w),
+            Text(StringName.friendAddFromWx,
+                style: TextStyle(
+                    fontWeight: FontWeight.bold,
+                    color: ColorName.primaryTextColor,
+                    fontSize: 14.sp)),
+            Spacer(),
+            Assets.images.iconLoginGoWxArrow.image(width: 18.w, height: 18.w),
+            SizedBox(width: 12.w),
+          ],
         ),
-      ], color: ColorName.white, borderRadius: BorderRadius.circular(12.w)),
-      margin: EdgeInsets.symmetric(horizontal: 12.w),
-      child: Row(
-        children: [
-          SizedBox(width: 15.w),
-          Assets.images.iconLoginWx.image(width: 25.w),
-          SizedBox(width: 15.w),
-          Text(StringName.friendAddFromWx,
-              style: TextStyle(
-                  fontWeight: FontWeight.bold,
-                  color: ColorName.primaryTextColor,
-                  fontSize: 14.sp)),
-          Spacer(),
-          Assets.images.iconLoginGoWxArrow.image(width: 18.w, height: 18.w),
-          SizedBox(width: 12.w),
-        ],
       ),
     );
   }

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

@@ -117,6 +117,7 @@ class StringName {
   static final String friendAddExplain = 'friend_add_explain'.tr; // 1.在您的对方同意添加您为好友之后,才能查看对方的位置。\n 2.如果您的好友还没有下载该应用,建议您邀请他们下载安装。\n 3.通过同意添加该用户为您的好友,即表示您同意本软件合法地收集、存储和使用您的信息,并将位置等信息与该好友分享。
   static final String dialogNotLogin = 'dialog_not_login'.tr; // 登录之后才可以发送好友申请
   static final String dialogGoLogin = 'dialog_go_login'.tr; // 去登录
+  static final String inviteFriends = 'invite_friends'.tr; // 邀请好友
   static final String inviteContent = 'invite_content'.tr; // 该好友未注册,将应用分享给好友需要好友下载安装并同意授权后可查看定位
   static final String inviteBtn = 'invite_btn'.tr; // 去微信分享
   static final String requestSuccess = 'request_success'.tr; // 发送成功
@@ -124,6 +125,9 @@ class StringName {
   static final String addFriendAdded = 'add_friend_added'.tr; // 该好友已在好友列表
   static final String sendAddFriendSuccess = 'send_add_friend_success'.tr; // 好友申请已发出,请等待对方通过
   static final String addFriendOwn = 'add_friend_own'.tr; // 不能添加自己为好友
+  static final String shareFriendTitle = 'share_friend_title'.tr; // 邀请好友
+  static final String shareFriendDesc = 'share_friend_desc'.tr; // 将应用分享给好友,需要好友下载安装并同意授权后可查看定位。
+  static final String wechatNoInstall = 'wechat_no_install'.tr; // 微信未安装
 }
 class StringMultiSource {
   StringMultiSource._();
@@ -244,6 +248,7 @@ class StringMultiSource {
       'friend_add_explain': '1.在您的对方同意添加您为好友之后,才能查看对方的位置。\n 2.如果您的好友还没有下载该应用,建议您邀请他们下载安装。\n 3.通过同意添加该用户为您的好友,即表示您同意本软件合法地收集、存储和使用您的信息,并将位置等信息与该好友分享。',
       'dialog_not_login': '登录之后才可以发送好友申请',
       'dialog_go_login': '去登录',
+      'invite_friends': '邀请好友',
       'invite_content': '该好友未注册,将应用分享给好友需要好友下载安装并同意授权后可查看定位',
       'invite_btn': '去微信分享',
       'request_success': '发送成功',
@@ -251,6 +256,9 @@ class StringMultiSource {
       'add_friend_added': '该好友已在好友列表',
       'send_add_friend_success': '好友申请已发出,请等待对方通过',
       'add_friend_own': '不能添加自己为好友',
+      'share_friend_title': '邀请好友',
+      'share_friend_desc': '将应用分享给好友,需要好友下载安装并同意授权后可查看定位。',
+      'wechat_no_install': '微信未安装',
     },
   };
 }

+ 40 - 0
lib/sdk/wechat/wechat_helper.dart

@@ -0,0 +1,40 @@
+import 'package:flutter/services.dart';
+import 'package:flutter/widgets.dart';
+import 'package:location/data/consts/web_url.dart';
+import 'package:wechat_kit/wechat_kit.dart';
+import '../../data/consts/build_config.dart';
+
+class WechatHelper {
+  WechatHelper._();
+
+  static final appId = BuildConfig.wechatAppId;
+  static final String universalLink = WebUrl.shareUrl;
+
+  static Future<void> registerApp() {
+    return WechatKitPlatform.instance
+        .registerApp(appId: appId, universalLink: universalLink)
+        .then((_) {
+      debugPrint('微信注册成功');
+    }).catchError((error) {
+      debugPrint('微信注册失败: $error');
+    });
+  }
+
+  static Future<void> shareUrlToWechat({
+    required int scene,
+    required String webpageUrl,
+    String? title,
+    String? description,
+    Uint8List? thumbData,
+  }) async {
+    return WechatKitPlatform.instance.shareWebpage(
+        scene: scene,
+        webpageUrl: webpageUrl,
+        title: title,
+        description: description);
+  }
+
+  static Future<bool> isInstalled() {
+    return WechatKitPlatform.instance.isInstalled();
+  }
+}

+ 11 - 0
lib/sdk/wechat/wechat_share_helper.dart

@@ -0,0 +1,11 @@
+import 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+
+class WechatShareHelper {
+  WechatShareHelper._();
+
+  static Future<Uint8List> assetImageToBytes(String assetPath) async {
+    final ByteData byteData = await rootBundle.load(assetPath);
+    return byteData.buffer.asUint8List();
+  }
+}

+ 8 - 0
pubspec.lock

@@ -1118,6 +1118,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "3.18.4"
+  wechat_kit:
+    dependency: "direct main"
+    description:
+      name: wechat_kit
+      sha256: ec5844289d01902a73204ffe7ad111503bfb67301341db8ec718a216fed66b89
+      url: "https://pub.dev"
+    source: hosted
+    version: "6.0.2"
   win32:
     dependency: transitive
     description:

+ 8 - 0
pubspec.yaml

@@ -90,6 +90,8 @@ dependencies:
   #通讯录选择
   flutter_contacts: ^1.1.9+2
 
+  #微信支付、分享
+  wechat_kit: ^6.0.1
   ######################地图########################
   flutter_map:
     path: plugins/map
@@ -180,3 +182,9 @@ flutter:
 
   assets:
     - assets/images/
+
+
+wechat_kit:
+  ios: no_pay # 默认 pay
+  app_id: wx64695e2b8346a227
+  universal_link: https://flutter.dev