From ed12b39f5b211fac44f2ff81d85ec93d380e3873 Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Fri, 7 Jun 2024 11:12:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E8=B0=83=E9=80=9A=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/app.dart | 6 +- lib/login/login/app_get_version.dart | 3 + lib/main/lockMian/lockMain/lockMain_page.dart | 6 +- .../lockMain/xhj/lockMain_xhj_page.dart | 142 +++++++----------- lib/mine/mall/lockMall_logic.dart | 24 ++- lib/mine/mall/lockMall_page.dart | 13 +- .../messageList/messageList_xhj_page.dart | 5 +- lib/mine/mineSet/mineSet/mineSet_page.dart | 6 +- lib/tools/pay/wx_pay_tool.dart | 8 +- 9 files changed, 97 insertions(+), 116 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index dc825bcd..0af65278 100755 --- a/lib/app.dart +++ b/lib/app.dart @@ -14,6 +14,7 @@ import 'package:star_lock/tools/appFirstEnterHandle.dart'; import 'package:star_lock/tools/app_manager.dart'; import 'package:star_lock/tools/bindings/app_binding.dart'; import 'package:star_lock/tools/customer_tool.dart'; +import 'package:star_lock/tools/pay/wx_pay_tool.dart'; import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/translations/app_dept.dart'; @@ -117,7 +118,7 @@ class _MyAppState extends State with WidgetsBindingObserver, BaseWidget { getPages: AppRouters.routePages, builder: EasyLoading.init(), initialBinding: AppBindings(), - initialRoute: initialRoute ); + initialRoute: initialRoute); } @override @@ -178,4 +179,5 @@ Future getAgreePrivacyShowUpdate() async { Future getAppInfo() async { final GetAppInfo entity = await ApiRepository.to.getAppInfo(); CustomerTool.init(entity.data?.wechatServiceUrl ?? ''); -} \ No newline at end of file + WxPayTool.associationUrl = entity.data?.appSiteUrl ?? ''; +} diff --git a/lib/login/login/app_get_version.dart b/lib/login/login/app_get_version.dart index f224088b..fb738b60 100644 --- a/lib/login/login/app_get_version.dart +++ b/lib/login/login/app_get_version.dart @@ -28,13 +28,16 @@ class GetAppInfo { class Data { Data.fromJson(Map json) { wechatServiceUrl = json['wechat_service_url']; + appSiteUrl = json['app_site_url']; } String? wechatServiceUrl; + String? appSiteUrl; Map toJson() { final Map data = {}; data['wechat_service_url'] = wechatServiceUrl; + data['app_site_url'] = appSiteUrl; return data; } } diff --git a/lib/main/lockMian/lockMain/lockMain_page.dart b/lib/main/lockMian/lockMain/lockMain_page.dart index b23b80c4..ffa55bf2 100755 --- a/lib/main/lockMian/lockMain/lockMain_page.dart +++ b/lib/main/lockMian/lockMain/lockMain_page.dart @@ -33,7 +33,7 @@ class StarLockMainPage extends StatefulWidget { State createState() => _StarLockMainPageState(); } -class _StarLockMainPageState extends State with BaseWidget { +class _StarLockMainPageState extends State with BaseWidget ,AutomaticKeepAliveClientMixin { final logic = Get.put(LockMainLogic()); final state = Get.find().state; @@ -265,8 +265,10 @@ class _StarLockMainPageState extends State with BaseWidget { @override void dispose() { - // TODO: implement dispose super.dispose(); _teamEvent.cancel(); } + + @override + bool get wantKeepAlive => true; } diff --git a/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart b/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart index c9c5a493..55aefff1 100755 --- a/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart +++ b/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart @@ -26,6 +26,7 @@ class StarLockMainXHJPage extends StatefulWidget { class _StarLockMainXHJPageState extends State with BaseWidget { + PageController _pageController = PageController(); @override void initState() { @@ -44,109 +45,70 @@ class _StarLockMainXHJPageState extends State builder: (LockMainXHJLogic logic) { return Scaffold( backgroundColor: Colors.white, - body: Stack( + body: PageView( + controller: _pageController, + physics: const NeverScrollableScrollPhysics(), // 禁止滑动 children: [ - pageView( - widget: StarLockMainPage( + StarLockMainPage( + showAppBar: false, + showDrawer: false, + ), + SafeArea( + bottom: false, + child: LockMallPage( + allowReturn: false, + ), + ), + SafeArea( + bottom: false, + child: MessageListXHJPage( showAppBar: false, - showDrawer: false, ), - logic: logic, - index: 0, ), - pageView( - widget: SafeArea( - bottom: false, - child: LockMallPage( - allowReturn: false, - ), + SafeArea( + bottom: false, + child: MineSetPage( + showAppBar: false, + showAbout: true, ), - logic: logic, - index: 1, - ), - pageView( - widget: SafeArea( - bottom: false, - child: MessageListXHJPage( - showAppBar: false, - ), - ), - logic: logic, - index: 2, - ), - pageView( - widget: SafeArea( - bottom: false, - child: MineSetPage( - showAppBar: false, - showAbout: true, - ), - ), - logic: logic, - index: 3, ), ], ), - bottomNavigationBar: Container( - padding: EdgeInsets.only( - top: 20.h, bottom: GetPlatform.isAndroid ? 20.h : 0), - decoration: const BoxDecoration( - color: Colors.transparent, - border: Border( - top: BorderSide( - color: Colors.black, // 设置边框颜色 - width: 0.3, // 设置边框宽度 - ), - ), - ), - child: SafeArea( - top: false, - child: Row( - children: [ - navigationBarItem(Icons.key, - TranslationLoader.lanKeys!.device!.tr, logic, 0, () { - logic.setIndex(0); - }), - navigationBarItem(Icons.shopping_cart, '商城'.tr, logic, 1, - () { - logic.setIndex(1); - }), - navigationBarItem(Icons.message, - TranslationLoader.lanKeys!.message!.tr, logic, 2, () { - logic.setIndex(2); - }), - navigationBarItem(Icons.account_circle, '我的'.tr, logic, 3, - () { - logic.setIndex(3); - }), - ], - ), - ), - ), + bottomNavigationBar: buildBottomNavigationBar(logic), ); }); } - //布局 - Widget pageView( - {required Widget widget, - required LockMainXHJLogic logic, - required int index}) { - return Positioned.fill( - child: Offstage( - offstage: logic.state.index != index, - child: widget, + Widget buildBottomNavigationBar(LockMainXHJLogic logic) { + return Container( + padding: + EdgeInsets.only(top: 20.h, bottom: GetPlatform.isAndroid ? 20.h : 0), + decoration: const BoxDecoration( + color: Colors.transparent, + border: Border(top: BorderSide(color: Colors.black, width: 0.3)), + ), + child: SafeArea( + top: false, + child: Row( + children: [ + navigationBarItem(logic, Icons.key, '设备'.tr, 0), + navigationBarItem(logic, Icons.shopping_cart, '商城'.tr, 1), + navigationBarItem(logic, Icons.message, '消息'.tr, 2), + navigationBarItem(logic, Icons.account_circle, '我的'.tr, 3), + ], + ), ), ); } - //底部按钮 - Widget navigationBarItem(IconData icon, String text, LockMainXHJLogic logic, - int index, GestureTapCallback? onTop) { - final bool check = logic.state.index == index; + Widget navigationBarItem( + LockMainXHJLogic logic, IconData icon, String text, int index) { return Expanded( child: GestureDetector( - onTap: onTop, + onTap: () { + _pageController.jumpToPage(index); + logic.setIndex(index); + }, child: Container( color: Colors.transparent, child: Column( @@ -157,16 +119,18 @@ class _StarLockMainXHJPageState extends State child: Icon( icon, size: 32.r, - color: - check ? AppColors.mainColor : AppColors.darkGrayTextColor, + color: logic.state.index == index + ? AppColors.mainColor + : AppColors.darkGrayTextColor, ), ), Text( text, style: TextStyle( fontSize: 16.sp, - color: - check ? AppColors.mainColor : AppColors.darkGrayTextColor, + color: logic.state.index == index + ? AppColors.mainColor + : AppColors.darkGrayTextColor, ), ), ], diff --git a/lib/mine/mall/lockMall_logic.dart b/lib/mine/mall/lockMall_logic.dart index e9daa4e9..fc41e91d 100755 --- a/lib/mine/mall/lockMall_logic.dart +++ b/lib/mine/mall/lockMall_logic.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:fluwx/fluwx.dart'; import 'package:get/get.dart'; @@ -25,13 +26,12 @@ class LockMallLogic extends BaseGetXController { //获取商城跳转地址 Future getMallURLRequest() async { - LockMallDataEntity entity = await ApiRepository.to.getMallURLData(); + final LockMallDataEntity entity = await ApiRepository.to.getMallURLData(); if (entity.errorCode!.codeIsSuccessful) { state.lockMallUrl.value = entity.data!.url!; state.mallWebView.setNavigationDelegate( NavigationDelegate( onProgress: (int progress) { - // Update loading bar. state.webProgress.value = progress / 100; }, onPageStarted: (String url) { @@ -40,6 +40,7 @@ class LockMallLogic extends BaseGetXController { onPageFinished: (String url) { state.webProgress.value = 1.0; refreshGoBack(); + update(); }, onWebResourceError: (WebResourceError error) {}, onNavigationRequest: (NavigationRequest request) async { @@ -53,27 +54,24 @@ class LockMallLogic extends BaseGetXController { ), ); state.mallWebView.loadRequest(Uri.parse(state.lockMallUrl.value)); - // FlutterBridge.postMessage({action:'',data:'{}',callFun:'回调给js的方法'}) state.mallWebView.addJavaScriptChannel( - "FlutterBridge", + 'FlutterBridge', onMessageReceived: (JavaScriptMessage message) async { flutterBridge(message); }, ); - // onMessageReceived } } //监听webview的调用 Future flutterBridge(JavaScriptMessage message) async { final dynamic obj = json.decode(message.message); - AppLog.log(obj.toString()); if (obj is! Map && obj['action'] is String) { return; } - String action = obj['action']; - dynamic data = obj['data']; - String? callFun = obj['callFun']; + final String action = obj['action']; + final dynamic data = obj['data']; + final String? callFun = obj['callFun']; switch (action) { case 'WechatPayParams': //微信支付 @@ -84,9 +82,9 @@ class LockMallLogic extends BaseGetXController { //微信支付 Future wxPay(dynamic data, String? callFun) async { - WxPayTool.pay(WxPayTool.mapToPayment(data), (response) { + WxPayTool.pay(WxPayTool.mapToPayment(data), (WeChatResponse response) { if (response is WeChatPaymentResponse) { - Map data = { + final Map data = { 'type': response.type, 'extData': response.extData, 'errCode': response.errCode, @@ -101,7 +99,7 @@ class LockMallLogic extends BaseGetXController { //判断webview 是否可以有路由可以回退,无则退出当前页面 Future canGoBack(bool didPop) async { - bool canGoBack = await state.mallWebView.canGoBack(); + final bool canGoBack = await state.mallWebView.canGoBack(); bool isMall = true; if (Get.isRegistered() && F.isXHJ) { isMall = Get.find().isMall; @@ -131,7 +129,7 @@ class LockMallLogic extends BaseGetXController { if (state.allowReturn) { return; } - state.mallWebView.canGoBack().then((value) { + state.mallWebView.canGoBack().then((bool value) { state.canGoBack = value; update(); }); diff --git a/lib/mine/mall/lockMall_page.dart b/lib/mine/mall/lockMall_page.dart index ef7614c6..1bd6b0b1 100755 --- a/lib/mine/mall/lockMall_page.dart +++ b/lib/mine/mall/lockMall_page.dart @@ -17,7 +17,7 @@ class LockMallPage extends StatefulWidget { State createState() => _LockMallPageState(); } -class _LockMallPageState extends State { +class _LockMallPageState extends State with AutomaticKeepAliveClientMixin { @override void initState() { super.initState(); @@ -25,8 +25,8 @@ class _LockMallPageState extends State { @override Widget build(BuildContext context) { - // FIXME 如果未登录状态,应先跳转登录页 - // FIXME url应该使用接口获取,接口名称 “获取商城跳转地址:/mall/getUrl“ POST请求,无参数,需要登录 + // 如果未登录状态,应先跳转登录页 + // url应该使用接口获取,接口名称 “获取商城跳转地址:/mall/getUrl“ POST请求,无参数,需要登录 // String url = 'https://ge.mall.star-lock.cn/quick_login?id=4&key=1ffb9d37109b8351ebb04ccfcca02c8e'; return GetBuilder( init: LockMallLogic(allowReturn: widget.allowReturn), @@ -55,7 +55,7 @@ class _LockMallPageState extends State { PopScope( onPopInvoked: logic.canGoBack, canPop: false, - child: SizedBox(), + child: const SizedBox(), ), Container( padding: EdgeInsets.only(bottom: 10.w), @@ -76,10 +76,13 @@ class _LockMallPageState extends State { } String getWebTitle(LockMallLogic logic) { - String webTitleStr = "配件商城".tr; + String webTitleStr = '配件商城'.tr; logic.state.mallWebView.getTitle().then((result) { webTitleStr = result!; }); return webTitleStr; } + + @override + bool get wantKeepAlive => true; } diff --git a/lib/mine/message/messageList/messageList_xhj_page.dart b/lib/mine/message/messageList/messageList_xhj_page.dart index b0837627..ecd5d31f 100755 --- a/lib/mine/message/messageList/messageList_xhj_page.dart +++ b/lib/mine/message/messageList/messageList_xhj_page.dart @@ -25,7 +25,7 @@ class MessageListXHJPage extends StatefulWidget { } class _MessageListXHJPageState extends State - with TickerProviderStateMixin { + with TickerProviderStateMixin ,AutomaticKeepAliveClientMixin { final MessageListLogic logic = Get.put(MessageListLogic()); final MessageListState state = Get.find().state; @@ -257,4 +257,7 @@ class _MessageListXHJPageState extends State ), ); } + + @override + bool get wantKeepAlive => true; } diff --git a/lib/mine/mineSet/mineSet/mineSet_page.dart b/lib/mine/mineSet/mineSet/mineSet_page.dart index 55718339..51cd8e96 100755 --- a/lib/mine/mineSet/mineSet/mineSet_page.dart +++ b/lib/mine/mineSet/mineSet/mineSet_page.dart @@ -29,7 +29,8 @@ class MineSetPage extends StatefulWidget { State createState() => _MineSetPageState(); } -class _MineSetPageState extends State with WidgetsBindingObserver { +class _MineSetPageState extends State + with WidgetsBindingObserver, AutomaticKeepAliveClientMixin { final MineSetLogic logic = Get.put(MineSetLogic()); final MineSetState state = Get.find().state; @@ -590,4 +591,7 @@ class _MineSetPageState extends State with WidgetsBindingObserver { WidgetsBinding.instance.removeObserver(this); super.dispose(); } + + @override + bool get wantKeepAlive => true; } diff --git a/lib/tools/pay/wx_pay_tool.dart b/lib/tools/pay/wx_pay_tool.dart index d5231c51..20e025a5 100755 --- a/lib/tools/pay/wx_pay_tool.dart +++ b/lib/tools/pay/wx_pay_tool.dart @@ -5,8 +5,10 @@ import 'package:fluwx/fluwx.dart'; /// /// class WxPayTool { - static bool isInit = false; static Fluwx fluwx = Fluwx(); + static bool isInit = false; + static String associationUrl = ''; + static init(String appId, String universalLink) { fluwx.registerApi(appId: appId, universalLink: universalLink); @@ -15,7 +17,7 @@ class WxPayTool { static Future pay(Payment payment, WeChatResponseSubscriber listener) async { if (!isInit) { isInit = true; - await init(payment.appId, 'https://lock.skychip.top/apple-app-site-association.json'); + await init(payment.appId, associationUrl); //回调 responseListener(WeChatResponse response) { if (response is WeChatPaymentResponse) { @@ -30,7 +32,7 @@ class WxPayTool { } static Payment mapToPayment(dynamic data) { - Payment payment = Payment( + final Payment payment = Payment( appId: data['appId'], partnerId: data['partnerId'], prepayId: data['prepayId'],