// // lib/controller/xiaoe/xiaoe_controller.dart // import 'dart:async'; // import 'package:EasyDartModule/EasyDartModule.dart' as edm; // import 'package:easyweb/base/minisdk.dart'; // import 'package:easyweb/easyweb.dart'; // import 'package:ef/ef.dart'; // import 'package:flutter/material.dart'; // import 'package:vbvs_app/common/util/FitTool.dart'; // import 'package:vbvs_app/controller/device/body_device_controller.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'; // import 'package:vbvs_app/pages/main_bottom/component/main_page_b_bottom_change.dart'; // class XiaoeModel { // XiaoeModel(); // } // class XiaoeController extends GetControllerEx { // XiaoeController() : super(XiaoeModel()) { // web = WebviewHelper( // isheadless: false, // jsbridge: buildsdk( // father: this, // ), // settings: buildsettings(), // params: PlatformHeadlessInAppWebViewCreationParams( // onLoadStop: (controller, url) { // setState(() { // ready.value = true; // }); // }, // onLoadResource: (controller, resource) { // // 资源加载回调 // ef.log("msg"); // loadRecource.value = true; // updateAll(); // }, // initialUrlRequest: // URLRequest(url: WebUri("http://127.0.0.1/index.html?"))), // ); // } // // 变量与WebviewTestController保持一致 // var selectDevice = {}; // var lastSelectDevice = {}; // var bluetooth = 0; // List personList = []; // List instantData = []; // List deviceList = []; // 小e需要的设备列表 // RxBool initFlag = false.obs; // Timer? _resourceLoadTimer; // Widget webviewWidget = Container(); // var wifiResponseData; // late WebviewHelper web; // var ready = false.obs; // var cnt = 0.obs; // var loadRecource = false.obs; // int sourceTime = 0; // // 获取设备列表 // Future getDeviceList() async { // try { // BodyDeviceController bodyDeviceController = Get.find(); // ApiResponse apiResponse = // await bodyDeviceController.getDeviceList(isAllDevice: true); // if (apiResponse.code == 200) { // List rawList = apiResponse.data; // // 处理设备列表数据 // List> newList = rawList.map((item) { // String mac = item['mac']?.toString() ?? ''; // String name = ''; // if (item['person'] != null && // item['person']['name'] != null && // item['person']['name'].toString().trim().isNotEmpty) { // name = '${item['person']['name']}_$mac'; // } else { // name = '${'体征检测设备'.tr}_$mac'; // } // return { // 'mac': mac, // 'name': name, // 'deviceType': item['device_type'] ?? '', // 'person': item['person'] ?? {}, // 'rawData': item, // }; // }).toList(); // deviceList = newList; // ef.log("小e获取到${deviceList.length}个设备"); // } // } catch (e) { // ef.log("小e获取设备列表错误: $e"); // } // } // Future startXiaoe() async { // try { // ef.log('开始启动小e应用...'); // // 先获取设备列表 // await getDeviceList(); // ef.log('开始运行小e Web应用...'); // // 运行小e应用 // var x1 = await ef.kvRoot.appmanger.find("xiaoe"); // var x2 = await ef.kvRoot.appmanger.find("mhtControl"); // print("$x1"); // print("$x2"); // await web.runApp('xiaoe').then((x) { // ef.log('web.runApp 执行完成,结果: $x'); // ready.value = true; // ef.log('ready.value 设置为 true'); // // 设置资源加载超时定时器 // _resourceLoadTimer = Timer(Duration(seconds: 15), () { // ef.log('资源加载超时定时器触发,当前 loadRecource.value = ${loadRecource.value}'); // if (!loadRecource.value) { // loadRecource.value = true; // updateAll(); // ef.log('小e资源加载超时,强制显示页面'); // } // }); // }); // } catch (e, s) { // ef.log('启动小e错误: $e, $s'); // ef.log('错误堆栈: $s'); // } // } // @override // void onInit() { // super.onInit(); // ef.log("小e控制器初始化 =>${DateTime.now()}"); // // 延迟启动 // Future.delayed(Duration(milliseconds: 300), () { // startXiaoe(); // }); // } // @override // void onClose() { // _resourceLoadTimer?.cancel(); // super.onClose(); // } // } // class XiaoeView extends GetComponent { // XiaoeView({super.key, super.oncreate}); // @override // XiaoeController newinstance() { // if (ef.kvRoot.XiaoeController == null) { // ef.kvRoot.XiaoeController = XiaoeController(); // if (Get.isRegistered() == false) { // Get.put(ef.kvRoot.XiaoeController); // XiaoeController xiaoeController = Get.find(); // xiaoeController.global = true; // return xiaoeController; // } // } // return ef.kvRoot.XiaoeController; // } // @override // Widget build(BuildContext context) { // return Obx(() { // UserInfoController userInfoController = Get.find(); // BodyDeviceController bodyDeviceController = Get.find(); // final isLoggedIn = // userInfoController.model.login == LoginStatus.LOGIN.code; // final hasDevice = bodyDeviceController.deviceList.isNotEmpty; // final showWeb = isLoggedIn && hasDevice; // final mainAxisAlignment = // showWeb ? MainAxisAlignment.start : MainAxisAlignment.center; // return Scaffold( // backgroundColor: Colors.transparent, // body: Column( // crossAxisAlignment: CrossAxisAlignment.center, // mainAxisSize: MainAxisSize.max, // mainAxisAlignment: mainAxisAlignment, // children: [ // // 未登录提示 // if (!isLoggedIn) // Center( // child: InkWell( // onTap: () => Get.toNamed("/loginPage"), // child: Container( // padding: EdgeInsets.symmetric( // vertical: 20.rpx, horizontal: 40.rpx), // child: RichText( // text: TextSpan( // children: [ // TextSpan( // text: "请先".tr, // style: TextStyle( // color: Colors.white, // fontSize: 30.rpx, // ), // ), // WidgetSpan( // child: Stack( // children: [ // Text( // "登录".tr, // style: TextStyle( // color: Colors.blue, // fontSize: 30.rpx, // ), // ), // Positioned( // bottom: 0, // left: 0, // right: 0, // child: Container( // height: 1, // color: Colors.blue, // ), // ), // ], // ), // ), // TextSpan( // text: "后,再使用小e".tr, // style: TextStyle( // color: Colors.white, // fontSize: 30.rpx, // ), // ), // ], // ), // ), // ), // ), // ), // // 已登录但无设备提示 // if (isLoggedIn && !hasDevice) // Center( // child: InkWell( // onTap: () {}, // child: Container( // padding: EdgeInsets.symmetric( // vertical: 20.rpx, horizontal: 40.rpx), // child: RichText( // text: TextSpan( // children: [ // TextSpan( // text: "请先".tr, // style: TextStyle( // color: Colors.white, // fontSize: 30.rpx, // ), // ), // WidgetSpan( // child: Stack( // children: [ // Text( // "绑定设备".tr, // style: TextStyle( // color: Colors.blue, // fontSize: 30.rpx, // ), // ), // Positioned( // bottom: 0, // left: 0, // right: 0, // child: Container( // height: 1, // color: Colors.blue, // ), // ), // ], // ), // ), // TextSpan( // text: "后,再使用小e".tr, // style: TextStyle( // color: Colors.white, // fontSize: 30.rpx, // ), // ), // ], // ), // ), // ), // ), // ), // // 显示 WebView // if (showWeb) // Expanded( // child: Align( // alignment: Alignment.topLeft, // child: Obx(() { // return Stack( // children: [ // controller.ready.value // ? controller.web.build() // : Container(), // if (!controller.loadRecource.value) // Positioned.fill( // child: Container( // decoration: BoxDecoration( // image: DecorationImage( // image: AssetImage( // "assets/img/xiaoe.png", // ), // fit: BoxFit.fill, // ), // ), // alignment: Alignment.center, // child: Column( // mainAxisSize: MainAxisSize.min, // children: [ // CircularProgressIndicator( // valueColor: AlwaysStoppedAnimation( // Colors.white), // ), // ], // ), // ), // ), // ], // ); // }), // ), // ), // ], // ), // ); // }); // } // } // lib/controller/xiaoe/xiaoe_controller.dart import 'dart:async'; import 'dart:convert'; import 'package:easyweb/base/minisdk.dart'; import 'package:easyweb/easyweb.dart'; import 'package:ef/ef.dart'; import 'package:flutter/material.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/controller/device/body_device_controller.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 XiaoeModel { XiaoeModel(); } class XiaoeController extends GetControllerEx { XiaoeController() : super(XiaoeModel()) { // 初始URL为空,在获取设备列表后设置 initialUrl = ""; // web = WebviewHelper( // isheadless: false, // jsbridge: buildsdk( // father: this, // ), // settings: buildsettings(), // params: PlatformHeadlessInAppWebViewCreationParams( // onLoadStop: (controller, url) { // setState(() { // ready.value = true; // }); // }, // onLoadResource: (controller, resource) { // // 资源加载回调 // ef.log("msg"); // loadRecource.value = true; // updateAll(); // }, // initialUrlRequest: URLRequest(url: WebUri(initialUrl)), // ), // ); } String initialUrl = ""; // 存储初始URL // 变量与WebviewTestController保持一致 var selectDevice = {}; var lastSelectDevice = {}; var bluetooth = 0; List personList = []; List instantData = []; List deviceList = []; // 小e需要的设备列表 RxBool initFlag = false.obs; Timer? _resourceLoadTimer; Widget webviewWidget = Container(); var wifiResponseData; late WebviewHelper web; var ready = false.obs; var cnt = 0.obs; var loadRecource = false.obs; int sourceTime = 0; bool _isStarting = false; // 添加启动标志 // 构建最终的URL String _buildFinalUrl(String baseUrl) { String queryParams = '?t=${DateTime.now().millisecondsSinceEpoch}'; if (deviceList.isNotEmpty) { // 提取小e需要的格式 List> xiaoeDeviceList = deviceList.map((device) { return { 'mac': device['mac'] ?? '', 'name': device['name'] ?? '', }; }).toList(); String personParam = Uri.encodeComponent(jsonEncode(xiaoeDeviceList)); queryParams += '&person=$personParam'; } // 添加语言参数(根据你的实际逻辑调整) String? language = ""; // 这里保持你原来的语言逻辑 // if (AppConstants().ent_type == APPPackageType.MHT.code) { // // 假设你有 mhLanguageController // // if (mhLanguageController.selectLanguage != null) { // // language = mhLanguageController.selectLanguage.value!.language_code; // // } // } else { // // 假设你有 languageController // // if (languageController.selectLanguage != null) { // // language = languageController.selectLanguage.value!.language_code; // // } // } if (language != null && language.isNotEmpty) { queryParams += '&lang=$language'; } return baseUrl + queryParams; } // 获取设备列表并构建URL Future getDeviceListAndBuildUrl() async { try { BodyDeviceController bodyDeviceController = Get.find(); ApiResponse apiResponse = await bodyDeviceController.getDeviceList(isAllDevice: true); if (apiResponse.code == 1) { List rawList = apiResponse.data; // 处理设备列表数据 List> newList = rawList.map((item) { String mac = item['mac']?.toString() ?? ''; String name = ''; if (item['person'] != null && item['person']['name'] != null && item['person']['name'].toString().trim().isNotEmpty) { name = '${item['person']['name']}_$mac'; } else { name = '${'体征检测设备'.tr}_$mac'; } return { 'mac': mac, 'name': name, 'deviceType': item['device_type'] ?? '', 'person': item['person'] ?? {}, 'rawData': item, }; }).toList(); deviceList = newList; ef.log("小e获取到${deviceList.length}个设备"); // 构建最终的URL String baseUrl = "http://127.0.0.1/index.html"; initialUrl = _buildFinalUrl(baseUrl); ef.log("小e初始URL: $initialUrl"); } else { // API调用失败时使用基础URL String baseUrl = "http://127.0.0.1/index.html"; initialUrl = baseUrl + '?t=${DateTime.now().millisecondsSinceEpoch}'; ef.log("获取设备列表失败,使用基础URL: $initialUrl"); } } catch (e) { ef.log("小e获取设备列表错误: $e"); // 出错时使用基础URL String baseUrl = "http://127.0.0.1/index.html"; initialUrl = baseUrl + '?t=${DateTime.now().millisecondsSinceEpoch}'; } } Future startXiaoe() async { try { if (_isStarting) { ef.log('小e已经在启动中,跳过'); return; } _isStarting = true; // 标记为启动中 ef.log('开始启动小e应用...'); // 先获取设备列表并构建URL await getDeviceListAndBuildUrl(); // 重新创建WebviewHelper,传入新的URL web = WebviewHelper( isheadless: false, jsbridge: buildsdk(father: this), settings: buildsettings(), params: PlatformHeadlessInAppWebViewCreationParams( onLoadStop: (controller, url) { setState(() { ready.value = true; }); }, onLoadResource: (controller, resource) { ef.log("msg"); loadRecource.value = true; updateAll(); }, initialUrlRequest: URLRequest(url: WebUri(initialUrl)), ), ); ef.log('开始运行小e Web应用...'); await web.runApp('xiaoe').then((x) { ef.log('web.runApp 执行完成,结果: $x'); ready.value = true; ef.log('ready.value 设置为 true'); // 设置资源加载超时定时器 // _resourceLoadTimer = Timer(Duration(seconds: 15), () { // ef.log('资源加载超时定时器触发,当前 loadRecource.value = ${loadRecource.value}'); // if (!loadRecource.value) { // loadRecource.value = true; // updateAll(); // ef.log('小e资源加载超时,强制显示页面'); // } // }); }); } catch (e, s) { ef.log('启动小e错误: $e, $s'); ef.log('错误堆栈: $s'); } } @override void onInit() { super.onInit(); ef.log("小e控制器初始化 =>${DateTime.now()}"); // 延迟启动 Future.delayed(Duration(milliseconds: 300), () { startXiaoe(); }); } @override void onClose() { _resourceLoadTimer?.cancel(); super.onClose(); } } class XiaoeView extends GetComponent { XiaoeView({super.key, super.oncreate}); @override XiaoeController newinstance() { if (ef.kvRoot.XiaoeController == null) { ef.kvRoot.XiaoeController = XiaoeController(); if (Get.isRegistered() == false) { Get.put(ef.kvRoot.XiaoeController); XiaoeController xiaoeController = Get.find(); xiaoeController.global = true; return xiaoeController; } } return ef.kvRoot.XiaoeController; } @override Widget build(BuildContext context) { return Obx(() { UserInfoController userInfoController = Get.find(); BodyDeviceController bodyDeviceController = Get.find(); final isLoggedIn = userInfoController.model.login == LoginStatus.LOGIN.code; final hasDevice = bodyDeviceController.deviceList.isNotEmpty; final showWeb = isLoggedIn && hasDevice; final mainAxisAlignment = showWeb ? MainAxisAlignment.start : MainAxisAlignment.center; return Scaffold( backgroundColor: Colors.transparent, body: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.max, mainAxisAlignment: mainAxisAlignment, children: [ // 未登录提示 if (!isLoggedIn) Center( child: InkWell( onTap: () => Get.toNamed("/loginPage"), child: Container( padding: EdgeInsets.symmetric( vertical: 20.rpx, horizontal: 40.rpx), child: RichText( text: TextSpan( children: [ TextSpan( text: "请先".tr, style: TextStyle( color: Colors.white, fontSize: 30.rpx, ), ), WidgetSpan( child: Stack( children: [ Text( "登录".tr, style: TextStyle( color: Colors.blue, fontSize: 30.rpx, ), ), Positioned( bottom: 0, left: 0, right: 0, child: Container( height: 1, color: Colors.blue, ), ), ], ), ), TextSpan( text: "后,再使用小e".tr, style: TextStyle( color: Colors.white, fontSize: 30.rpx, ), ), ], ), ), ), ), ), // 已登录但无设备提示 if (isLoggedIn && !hasDevice) Center( child: InkWell( onTap: () {}, child: Container( padding: EdgeInsets.symmetric( vertical: 20.rpx, horizontal: 40.rpx), child: RichText( text: TextSpan( children: [ TextSpan( text: "请先".tr, style: TextStyle( color: Colors.white, fontSize: 30.rpx, ), ), WidgetSpan( child: Stack( children: [ Text( "绑定设备".tr, style: TextStyle( color: Colors.blue, fontSize: 30.rpx, ), ), Positioned( bottom: 0, left: 0, right: 0, child: Container( height: 1, color: Colors.blue, ), ), ], ), ), TextSpan( text: "后,再使用小e".tr, style: TextStyle( color: Colors.white, fontSize: 30.rpx, ), ), ], ), ), ), ), ), // 显示 WebView if (showWeb) Expanded( child: Align( alignment: Alignment.topLeft, child: Obx(() { return Stack( children: [ controller.ready.value ? controller.web.build() : Container(), if (!controller.loadRecource.value) Positioned.fill( child: Container( decoration: BoxDecoration( image: DecorationImage( image: AssetImage( "assets/img/xiaoe.png", ), fit: BoxFit.fill, ), ), alignment: Alignment.center, child: Column( mainAxisSize: MainAxisSize.min, children: [ CircularProgressIndicator( strokeWidth: 2, valueColor: AlwaysStoppedAnimation( Colors.white), ), ], ), ), ), ], ); }), ), ), ], ), ); }); } }