Files
tuiche/lib/pages/main_bottom/xiaoe/XiaoeModel.dart

771 lines
26 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// // 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<XiaoeModel> {
// 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<void> getDeviceList() async {
// try {
// BodyDeviceController bodyDeviceController = Get.find();
// ApiResponse apiResponse =
// await bodyDeviceController.getDeviceList(isAllDevice: true);
// if (apiResponse.code == 200) {
// List<dynamic> rawList = apiResponse.data;
// // 处理设备列表数据
// List<Map<String, dynamic>> 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<void> 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<XiaoeController> {
// XiaoeView({super.key, super.oncreate});
// @override
// XiaoeController newinstance() {
// if (ef.kvRoot.XiaoeController == null) {
// ef.kvRoot.XiaoeController = XiaoeController();
// if (Get.isRegistered<XiaoeController>() == false) {
// Get.put<XiaoeController>(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<Color>(
// 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<XiaoeModel> {
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<Map<String, dynamic>> 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<void> getDeviceListAndBuildUrl() async {
try {
BodyDeviceController bodyDeviceController = Get.find();
ApiResponse apiResponse =
await bodyDeviceController.getDeviceList(isAllDevice: true);
if (apiResponse.code == 1) {
List<dynamic> rawList = apiResponse.data;
// 处理设备列表数据
List<Map<String, dynamic>> 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<void> 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<XiaoeController> {
XiaoeView({super.key, super.oncreate});
@override
XiaoeController newinstance() {
if (ef.kvRoot.XiaoeController == null) {
ef.kvRoot.XiaoeController = XiaoeController();
if (Get.isRegistered<XiaoeController>() == false) {
Get.put<XiaoeController>(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<Color>(
Colors.white),
),
],
),
),
),
],
);
}),
),
),
],
),
);
});
}
}