更新小e界面白屏问题

This commit is contained in:
wyf
2026-02-05 15:25:20 +08:00
parent 3ef22a36c0
commit 6709bcb446
13 changed files with 2151 additions and 338 deletions

View File

@@ -0,0 +1,771 @@
// // 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(
valueColor: AlwaysStoppedAnimation<Color>(
Colors.white),
),
],
),
),
),
],
);
}),
),
),
],
),
);
});
}
}