From df1a4949178144f0f606eef06c777dc10f25cfcf Mon Sep 17 00:00:00 2001 From: wyf <494641114@qq.com> Date: Tue, 24 Jun 2025 17:14:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0web=E5=AE=9E=E6=97=B6?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/AndroidManifest.xml | 4 +- lib/component/base/SleepdateWidget.dart | 5 +- .../component/main_page_b_bottom_change.dart | 34 +++- lib/pages/mh_page/MattressControl.dart | 6 +- .../component/HomeDeviceStausWidget.dart | 23 ++- lib/pages/mh_page/test/WebviewTestModel.dart | 174 +++++++++++++++++- pubspec.yaml | 2 +- 7 files changed, 229 insertions(+), 19 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 523e747..93944bf 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -38,8 +38,8 @@ globalKey = GlobalKey<_HomePageState>(); + + MainPageBBottomChange({Key? key}) : super(key: globalKey); + + // 静态方法:外部调用,跳转 tab + static void jumpTo(int index) { + final state = globalKey.currentState; + if (state != null) { + state.switchTab(index); + } + } + @override _HomePageState createState() => _HomePageState(); } + class _HomePageState extends State with SingleTickerProviderStateMixin { int selectedIndex = 0; @@ -95,4 +108,23 @@ class _HomePageState extends State ), ); } + + void switchTab(int index) { + final begin = currentPosition; + final end = index.toDouble(); + + _positionAnimation = Tween(begin: begin, end: end).animate( + CurvedAnimation(parent: _controller, curve: Curves.easeOut), + )..addListener(() { + setState(() {}); + }); + + _controller.forward(from: 0.0); + currentPosition = end; + + setState(() { + selectedIndex = index; + }); +} + } diff --git a/lib/pages/mh_page/MattressControl.dart b/lib/pages/mh_page/MattressControl.dart index 6d7331b..74682fa 100644 --- a/lib/pages/mh_page/MattressControl.dart +++ b/lib/pages/mh_page/MattressControl.dart @@ -138,9 +138,9 @@ class _MattressControlPageState extends State { body: SafeArea( child: WebviewTestView( - oncreate: (widget) { - return WebviewTestController(); - }, + // oncreate: (widget) { + // return WebviewTestController(); + // }, ), ), )))); diff --git a/lib/pages/mh_page/homepage/component/HomeDeviceStausWidget.dart b/lib/pages/mh_page/homepage/component/HomeDeviceStausWidget.dart index 602d80a..20e2a91 100644 --- a/lib/pages/mh_page/homepage/component/HomeDeviceStausWidget.dart +++ b/lib/pages/mh_page/homepage/component/HomeDeviceStausWidget.dart @@ -5,6 +5,8 @@ import 'package:vbvs_app/common/color/appConstants.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/component/tool/CustomCard.dart'; import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; +import 'package:vbvs_app/pages/main_bottom/component/main_page_b_bottom_change.dart'; +import 'package:vbvs_app/pages/mh_page/test/WebviewTestModel.dart'; class HomeDeviceStausWidget extends StatefulWidget { final deviceStatus; @@ -72,10 +74,25 @@ class _HomeDeviceStausWidgetState extends State { CustomCard( gradientDirection: GradientDirection.vertical, borderRadius: 10.rpx, - onTap: () { - // 点击回调逻辑放这里 - TopSlideNotification.show(context,text: "功能开发中...".tr); + onTap: () async { + try { + var device = widget.deviceStatus; + WebviewTestController webviewTestController = Get.find(); + var future = webviewTestController.web.jsbridge?.dart + .appToHtmlDevice(device); + + Future.delayed(Duration(seconds: 5), () { + TopSlideNotification.show(context, text: "控制界面初始化中,请稍后再试".tr); + return; + }); + + await future; // 等待最终完成(即使超过 5 秒) + MainPageBBottomChange.jumpTo(2); + } catch (e) { + print("发生异常: $e"); + } }, + colors: AppConstants().mhtButtongradientColors, // 你原本没有渐变,单色即可 enableGradient: true, // 关闭渐变 diff --git a/lib/pages/mh_page/test/WebviewTestModel.dart b/lib/pages/mh_page/test/WebviewTestModel.dart index 1010092..3f3ac66 100644 --- a/lib/pages/mh_page/test/WebviewTestModel.dart +++ b/lib/pages/mh_page/test/WebviewTestModel.dart @@ -1,12 +1,18 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:EasyDartModule/EasyDartModule.dart' as edm; +import 'package:easydevice/easydevice.dart'; +import 'package:easyweb/base/easyws.dart'; +import 'package:easyweb/base/minisdk.dart'; import 'package:easyweb/easyweb.dart'; import 'package:ef/ef.dart'; import 'package:flutter/material.dart'; -import 'package:easyweb/base/minisdk.dart'; -import 'package:easydevice/easydevice.dart'; +import 'package:vbvs_app/common/color/ServiceConstant.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; +import 'package:vbvs_app/common/util/requestWithLog.dart'; import 'package:vbvs_app/controller/user_info_controller.dart'; import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart'; -import 'package:vbvs_app/pages/mh_page/room_picker.dart'; class WebviewTestModel { WebviewTestModel(); @@ -18,12 +24,16 @@ class WebviewTestModel { class WebviewTestController extends GetControllerEx { var selectDevice = {}; + var lastSelectDevice = {}; var bluetooth = 0; + List personList = []; + List instantData = []; + WebviewTestController() : super(WebviewTestModel()) { web = WebviewHelper( jsbridge: buildsdk( - father: this, - clientId: '494641114', + // father: this, + // clientId: '494641114', // dbgserverUrl: 'ws://192.168.1.2:9001', ), settings: buildsettings(), @@ -51,8 +61,23 @@ class WebviewTestController extends GetControllerEx { return true; }); bridge.sdk.selectDevice((args) async { - ef.log('selectDevice: $args'); - selectDevice = args[0]; + try { + ef.log('selectDevice: $args'); + selectDevice = args[0]; + await queryPersonInfoByMac(); + if (selectDevice != null && + selectDevice.isNotEmpty && + selectDevice['mac'] != null && + (selectDevice['mac'] != args[0]['mac'])) { + lastSelectDevice = selectDevice; + } + dealInstantData(selectDevice); + } catch (e) { + ef.log("[aaaa]$e"); + } + + //查询人员信息 + return true; }); bridge.sdk.updateBlueToothStatus((args) async { @@ -70,6 +95,30 @@ class WebviewTestController extends GetControllerEx { .toList(); return allDevices; }); + //请求token信息 + bridge.sdk.queryUserToken((args) async { + ef.log('queryUserToken: $args'); + // bluetooth = args[0]; + return edm.EasyDartModule.dio.token; + }); + //请求设备人员信息 + bridge.sdk.queryPersonInfo((args) async { + ef.log('queryPersonInfo: $args'); + // bluetooth = args[0]; + return personList; + }); + //请求实时体征数据 + bridge.sdk.queryInstantData((args) async { + ef.log('queryInstantData: $args'); + // bluetooth = args[0]; + return instantData; + }); + bridge.sdk.queryInstantData((args) async { + ef.log('queryInstantData: $args'); + // bluetooth = args[0]; + return instantData; + }); + }); web //.file( @@ -91,6 +140,117 @@ class WebviewTestController extends GetControllerEx { late WebviewHelper web; var ready = false.obs; var cnt = 0.obs; + + Future queryPersonInfoByMac() async { + UserInfoController userInfoController = Get.find(); + String serviceAddress = ServiceConstant.service_address; + String serviceName = ServiceConstant.server_service; + String serviceApi = ServiceConstant.person_info; + String queryUrl = + "${serviceAddress}${serviceName}${serviceApi}?mac=${selectDevice['mac']}"; + try { + final res = await requestWithLog( + logTitle: "查询设备绑定人员列表", + method: MyHttpMethod.get, + queryUrl: queryUrl, + onSuccess: (res) { + personList = res.data; + }); + } catch (e) { + print("查询设备绑定列表失败: $e"); + } + } + + void dealInstantData(selectDevice) { + //处理实时数据 + // edm.EasyDartModule.websocket.sendData( + // jsonEncode(WebSocketMessage(path: "/vsbs/web/rt/marttress", type: 2))); + lastSelectDevice; + var ws; + ws = Easyws( + url: ServiceConstant.webSocketService, + onData: (data) { + ef.log("ws recv =>$data"); + try { + var tmp; + if (data is String) { + tmp = jsonDecode(data); // 只有是 String 才 decode + } else if (data is Map) { + tmp = data; // 直接用 + } else { + print("未知数据格式"); + } + print("aaa"); + if (tmp['data'] != null && tmp['data'] is Map) { + var newData = tmp['data']; + var mac = newData['mac']; + if (mac != null) { + // 删除已有的同 mac 项 + instantData.removeWhere((element) => element['mac'] == mac); + // 添加新的数据 + instantData.add(newData); + } + } + } catch (e) { + ef.log("ws error =>$e"); + } + }, + onStateChange: (x) { + ef.log("ws =>$x"); + if (x == EasywsState.connected) { + try { + if (lastSelectDevice != null && lastSelectDevice.isNotEmpty) { + List oldMacList = [ + lastSelectDevice['bind_mac_a'], + lastSelectDevice['bind_mac_b'], + ]; + for (String? mac in oldMacList) { + if (mac != null && mac.isNotEmpty) { + bool success = ws.send({ + "type": 2, + "path": "/vsbs/web/rt/marttress", + "data": {"mac": mac}, + }); + if (success) { + ef.log("✅ 已取消监听:$mac"); + } + } + } + } + } catch (e) { + ef.log("❌ 取消旧设备监听失败: $e"); + } + try { + // 2. 开始监听新设备(A/B 都监听) + if (selectDevice != null && selectDevice.isNotEmpty) { + List newMacList = [ + selectDevice['bind_mac_a'], + selectDevice['bind_mac_b'], + ]; + for (String? mac in newMacList) { + if (mac != null && mac.isNotEmpty) { + bool success = ws.send({ + "type": 1, + "path": "/vsbs/web/rt/marttress", + "data": {"mac": mac}, + }); + if (success) { + ef.log("✅ 开始监听新设备:$mac"); + } + } + } + + // 更新记录 + lastSelectDevice = selectDevice; + } + } catch (e) { + ef.log("❌ 监听新设备失败: $e"); + } + } + }, + ); + ws.connect(); + } //EasyFlutter End } diff --git a/pubspec.yaml b/pubspec.yaml index 52b019d..bea776f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -66,7 +66,7 @@ dependencies: easyweb: git: url: https://gitea.wslpc.real.he-info.cn:94/flutter/easyweb.git - ref: main + ref: e86d515f77 archive: ^4.0.0