From b2cd46bc7ac338a14fbbb0dfeb4ec944a9fe2d4c Mon Sep 17 00:00:00 2001 From: wyf <494641114@qq.com> Date: Tue, 19 Aug 2025 14:54:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=B0=8Fe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/login/th_bind_tel_page.dart | 17 ++ lib/pages/main_bottom/e_page.dart | 277 +++++++++++++----- .../main_bottom/main_page_bottom_change.dart | 3 +- .../mh_page/user/page/bind_tel_page.dart | 45 +-- lib/routers/routers.dart | 3 +- 5 files changed, 249 insertions(+), 96 deletions(-) diff --git a/lib/pages/login/th_bind_tel_page.dart b/lib/pages/login/th_bind_tel_page.dart index d156937..3742ec9 100644 --- a/lib/pages/login/th_bind_tel_page.dart +++ b/lib/pages/login/th_bind_tel_page.dart @@ -545,6 +545,23 @@ class THBindTelWidget extends GetView { .button_container_radius, // 统一圆角 // 保留你原有的业务逻辑不变 onTap: () async { + String msg = await controller.bindTel(); + if (msg == null || msg.isEmpty) { + MHTLoginController loginController = + Get.find(); + //TODO 微信回调监听操作全部跳转页面前成功以后移除监听,防止重复监听,其他方式登录成功也需要移出监听 + loginController.fluwxCancelable?.cancel(); + // 登录成功移出网络检查监听 + Checknetwork.subscription?.cancel(); + final box = GetStorage(); + box.remove('countdown'); + CountdownController countdownController = + Get.find(); + countdownController.countdown = 0.obs; + Get.offAndToNamed("/mianPageBottomChange"); + } else { + TopSlideNotification.show(context,text: msg!,textColor: themeController.currentColor.sc9); + } ApiResponse apiResponse = await controller.updateUserPhone(); diff --git a/lib/pages/main_bottom/e_page.dart b/lib/pages/main_bottom/e_page.dart index f41078f..ed45fc9 100644 --- a/lib/pages/main_bottom/e_page.dart +++ b/lib/pages/main_bottom/e_page.dart @@ -1,16 +1,23 @@ +import 'dart:convert'; + import 'package:ef/ef.dart'; import 'package:flutter/material.dart'; -import 'package:vbvs_app/common/color/appConstants.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; +import 'package:vbvs_app/common/color/app_uri_status.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; -import 'package:vbvs_app/common/util/MyUtils.dart'; -import 'package:vbvs_app/component/tool/ClickableContainer.dart'; import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; +import 'package:vbvs_app/controller/device/blueteeth_bind_controller.dart'; +import 'package:vbvs_app/controller/device/body_device_controller.dart'; +import 'package:vbvs_app/controller/device/device_type_controller.dart'; import 'package:vbvs_app/controller/main_bottom/global_controller.dart'; +import 'package:vbvs_app/controller/theme_controller/ThemeController.dart'; import 'package:vbvs_app/controller/user_info_controller.dart'; import 'package:vbvs_app/enum/LoginStatus.dart'; +import 'package:vbvs_app/model/api_response.dart'; class EPage extends StatefulWidget { - const EPage({super.key}); + final String sleepUri; + const EPage({super.key, required this.sleepUri}); @override State createState() => _EPageState(); @@ -19,83 +26,207 @@ class EPage extends StatefulWidget { class _EPageState extends State { GlobalController globalController = Get.find(); UserInfoController userInfoController = Get.find(); + BlueteethBindController blueteethBindController = Get.find(); + ThemeController themeController = Get.find(); + DeviceTypeController deviceTypeController = Get.find(); + + ValueNotifier isPageLoading = ValueNotifier(true); + RxList deviceList = [].obs; + RxString finalUri = RxString(''); + + @override + void initState() { + super.initState(); + getDeviceList(); + } + + @override + void dispose() { + isPageLoading.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { - return LayoutBuilder( - builder: (context, boxConstraints) => GestureDetector( - // onTap: () => FocusScope.of(context).unfocus(),, - child: Scaffold( - appBar: AppBar( - backgroundColor: themeController.currentColor.sc17, - // backgroundColor: Colors.transparent, - automaticallyImplyLeading: false, - iconTheme: IconThemeData(color: themeController.currentColor.sc3), - titleSpacing: 0, - // leading: returnIconButtom, - title: Container( - width: double.infinity, - height: 180.rpx, - child: Stack( - alignment: Alignment.center, - children: [ - /// 居中标题 - Text( - '小e'.tr, - style: TextStyle( - fontFamily: 'Readex Pro', - color: themeController.currentColor.sc3, - letterSpacing: 0, - fontSize: 30.rpx, - ), - ), + bool isLoggedIn = userInfoController.model.login == LoginStatus.LOGIN.code; - /// 左边返回按钮 - // Positioned( - // left: 0, - // child: returnIconButtom, - // ), - ], + return LayoutBuilder( + builder: (context, bodySize) => GestureDetector( + child: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/img/bgNoImg.png'), + fit: BoxFit.fill, + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: AppBar( + backgroundColor: themeController.currentColor.sc17, + automaticallyImplyLeading: false, + iconTheme: IconThemeData(color: themeController.currentColor.sc3), + titleSpacing: 0, + title: Container( + width: double.infinity, + height: 180.rpx, + child: Stack( + alignment: Alignment.center, + children: [ + Text( + '小e'.tr, + style: TextStyle( + fontFamily: 'Readex Pro', + color: themeController.currentColor.sc3, + fontSize: 30.rpx, + ), + ), + ], + ), ), ), - actions: [], - centerTitle: false, - ), - backgroundColor: Colors.transparent, - body: SafeArea( - top: true, - child: Column(children: [ - Expanded( - child: ClickableContainer( - backgroundColor: Colors.transparent, - highlightColor: Colors.transparent, - padding: EdgeInsets.all(0.rpx), - onTap: () { - UserInfoController userInfoController = Get.find(); - bool isLoggedIn = - userInfoController.model.login == LoginStatus.LOGIN.code; - if (!isLoggedIn) { - TopSlideNotification.show(context, - text: "必须登录提示".tr, - textColor: themeController.currentColor.sc9); - Get.toNamed("/otherLoginPage"); - } else { - TopSlideNotification.show(context, text: "待开发功能".tr); - } - }, - child: Container( - // child: widget.webView, - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage('assets/img/xiaoe.png'), // 本地图片 - fit: BoxFit.fill, // 填满整个 Container - ), - ), - ), - )), - ]), + body: SafeArea( + top: true, + child: isLoggedIn + ? _buildLoggedInContent() + : _buildLoggedOutContent(), + ), ), ), ), ); } + + // Widget _buildLoggedInContent() { + // return Obx(() { + // if (finalUri.isEmpty) { + // return Center(child: CircularProgressIndicator()); + // } + + // return Stack( + // children: [ + // InAppWebView( + // initialUrlRequest: URLRequest(url: WebUri(finalUri.value)), + // onLoadStart: (controller, url) { + // isPageLoading.value = true; + // }, + // onLoadStop: (controller, url) { + // isPageLoading.value = false; + // }, + // ), + // ValueListenableBuilder( + // valueListenable: isPageLoading, + // builder: (context, isLoading, child) { + // return isLoading + // ? Center(child: CircularProgressIndicator()) + // : SizedBox.shrink(); + // }, + // ), + // ], + // ); + // }); + // } + Widget _buildLoggedInContent() { + return Obx(() { + if (finalUri.isEmpty) { + return Center(child: CircularProgressIndicator()); + } + + // 如果设备列表为空 + if (deviceList.isEmpty) { + return GestureDetector( + onTap: () { + TopSlideNotification.show( + context, + text: "请先绑定设备".tr, + textColor: themeController.currentColor.sc9, + ); + }, + child: Center( + child: Image.asset( + "assets/img/xiaoe.png", // 可以显示默认背景 + fit: BoxFit.contain, + ), + ), + ); + } + + // 设备列表不为空,加载 WebView + return Stack( + children: [ + InAppWebView( + initialUrlRequest: URLRequest(url: WebUri(finalUri.value)), + onLoadStart: (controller, url) { + isPageLoading.value = true; + }, + onLoadStop: (controller, url) { + isPageLoading.value = false; + }, + ), + ValueListenableBuilder( + valueListenable: isPageLoading, + builder: (context, isLoading, child) { + return isLoading + ? Center(child: CircularProgressIndicator()) + : SizedBox.shrink(); + }, + ), + ], + ); + }); + } + + Widget _buildLoggedOutContent() { + return GestureDetector( + onTap: () { + TopSlideNotification.show( + context, + text: "必须登录提示".tr, + textColor: themeController.currentColor.sc9, + ); + Get.toNamed("/otherLoginPage"); + }, + child: Center( + child: Image.asset( + "assets/img/xiaoe.png", + fit: BoxFit.contain, + ), + ), + ); + } + + Future getDeviceList() async { + BodyDeviceController bodyDeviceController = Get.find(); + ApiResponse apiResponse = await bodyDeviceController.getDeviceList(); + + if (apiResponse.code == HttpStatusCodes.ok) { + List rawList = apiResponse.data; + + // 提取 mac 和 person.name + List> newList = rawList.map((item) { + String mac = item['mac'] ?? ''; + String name = (item['person'] != null && + item['person']['name'] != null && + item['person']['name'].toString().trim().isNotEmpty) + ? item['person']['name'] + "_${mac}" + : '未命名'.tr + "_${mac}"; + return { + 'mac': mac, + 'name': name, + }; + }).toList(); + + deviceList.value = newList; + + // 拼接参数 person + if (deviceList.isNotEmpty) { + // JSON 编码整个 deviceList 对象数组 + String personParam = Uri.encodeComponent(jsonEncode(deviceList)); + finalUri.value = "${widget.sleepUri}?person=$personParam"; + } else { + finalUri.value = widget.sleepUri; + } + } + + ef.log("msg"); + } } diff --git a/lib/pages/main_bottom/main_page_bottom_change.dart b/lib/pages/main_bottom/main_page_bottom_change.dart index b1d9fe5..ace7e68 100644 --- a/lib/pages/main_bottom/main_page_bottom_change.dart +++ b/lib/pages/main_bottom/main_page_bottom_change.dart @@ -71,7 +71,8 @@ class MainPageBottomChange extends GetView { List arr = [ HomePage(), // SleepReportPage(), - EPage(), + // EPage(), + EPage(sleepUri:"https://xiaoe.he-info.cn/"), MessagePage(), MinePage(), ]; diff --git a/lib/pages/mh_page/user/page/bind_tel_page.dart b/lib/pages/mh_page/user/page/bind_tel_page.dart index 2e8fbc2..a550f52 100644 --- a/lib/pages/mh_page/user/page/bind_tel_page.dart +++ b/lib/pages/mh_page/user/page/bind_tel_page.dart @@ -309,7 +309,8 @@ class BindTelWidget extends GetView { } String msg = await controller - .getCode(context,img); + .getCode( + context, img); if (msg.isNotEmpty) { return; } @@ -427,28 +428,30 @@ class BindTelWidget extends GetView { gradientDirection: GradientDirection.vertical, onTap: () async { - // String msg = await controller.bindTel(); - // if (msg == null || msg.isEmpty) { - // MHTLoginController loginController = - // Get.find(); - // //TODO 微信回调监听操作全部跳转页面前成功以后移除监听,防止重复监听,其他方式登录成功也需要移出监听 - // loginController.fluwxCancelable - // ?.cancel(); - // // 登录成功移出网络检查监听 - // Checknetwork.subscription?.cancel(); - // final box = GetStorage(); - // box.remove('countdown'); - // CountdownController - // countdownController = Get.find(); - // countdownController.countdown = 0.obs; - // Get.offAndToNamed( - // "/mianPageBottomChange"); - // } else { - // showToast(msg); - // } + String msg = await controller.bindTel(); + if (msg == null || msg.isEmpty) { + MHTLoginController loginController = + Get.find(); + //TODO 微信回调监听操作全部跳转页面前成功以后移除监听,防止重复监听,其他方式登录成功也需要移出监听 + loginController.fluwxCancelable + ?.cancel(); + // 登录成功移出网络检查监听 + Checknetwork.subscription?.cancel(); + final box = GetStorage(); + box.remove('countdown'); + CountdownController + countdownController = Get.find(); + countdownController.countdown = 0.obs; + Get.offAndToNamed( + "/mianPageBottomChange"); + } else { + TopSlideNotification.show(context, + text: msg!, + textColor: themeController + .currentColor.sc9); + } ApiResponse apiResponse = await controller.updateUserPhone(); - if (apiResponse.code == HttpStatusCodes.ok) { UserInfoController userInfoController = diff --git a/lib/routers/routers.dart b/lib/routers/routers.dart index 19a512a..b1230ad 100644 --- a/lib/routers/routers.dart +++ b/lib/routers/routers.dart @@ -55,7 +55,8 @@ var routes = { "/homePage": (contxt) => HomePage(), "/sleepReportPage": (contxt, {arguments}) => SleepReportPage(sleepUri: arguments), - "/ePage": (contxt) => EPage(), + // "/ePage": (contxt) => EPage(), + "/ePage": (contxt, {arguments}) => EPage(sleepUri: arguments), "/messagePage": (contxt) => MessagePage(), "/minePage": (contxt) => MinePage(), "/mianPageBottomChange": (contxt) => MainPageBottomChange(),