Files
tuiche/lib/pages/main_bottom/e_page.dart
2025-12-05 17:37:01 +08:00

345 lines
11 KiB
Dart

import 'dart:convert';
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:vbvs_app/common/color/appConstants.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/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/APPPackageType.dart';
import 'package:vbvs_app/enum/LoginStatus.dart';
import 'package:vbvs_app/model/api_response.dart';
class EPage extends StatefulWidget {
final String sleepUri;
const EPage({super.key, required this.sleepUri});
@override
State<EPage> createState() => _EPageState();
}
class _EPageState extends State<EPage> with AutomaticKeepAliveClientMixin {
GlobalController globalController = Get.find();
UserInfoController userInfoController = Get.find();
BlueteethBindController blueteethBindController = Get.find();
ThemeController themeController = Get.find();
DeviceTypeController deviceTypeController = Get.find();
ValueNotifier<bool> isPageLoading = ValueNotifier<bool>(true);
RxList deviceList = [].obs;
RxString finalUri = RxString('');
@override
bool get wantKeepAlive => true; // 保持页面状态
@override
void initState() {
super.initState();
getDeviceList();
}
@override
void dispose() {
isPageLoading.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
super.build(context); // ⚠️必须调用,保证 keepAlive 生效
bool isLoggedIn = userInfoController.model.login == LoginStatus.LOGIN.code;
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,
),
),
],
),
),
),
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<bool>(
// valueListenable: isPageLoading,
// builder: (context, isLoading, child) {
// return isLoading
// ? Center(child: CircularProgressIndicator())
// : SizedBox.shrink();
// },
// ),
// ],
// );
// });
// }
Widget _buildLoggedInContent() {
return Obx(() {
if (finalUri.isEmpty) {
return Center(
child: CircularProgressIndicator(
strokeWidth: 2,
valueColor: AlwaysStoppedAnimation<Color>(
themeController.currentColor.sc1,
),
),
);
}
// 如果设备列表为空
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 +
"?t=${DateTime.now().millisecondsSinceEpoch}")),
onLoadStart: (controller, url) {
isPageLoading.value = true;
},
onLoadStop: (controller, url) {
isPageLoading.value = false;
},
),
ValueListenableBuilder<bool>(
valueListenable: isPageLoading,
builder: (context, isLoading, child) {
return isLoading
? Center(
child: CircularProgressIndicator(
strokeWidth: 2,
valueColor: AlwaysStoppedAnimation<Color>(
themeController.currentColor.sc1,
),
),
)
: 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<void> getDeviceList() async {
try {
BodyDeviceController bodyDeviceController = Get.find();
ApiResponse apiResponse =
await bodyDeviceController.getDeviceList(isAllDevice: true);
if (apiResponse.code == HttpStatusCodes.ok) {
List<dynamic> rawList = apiResponse.data;
// 提取 mac 和 person.name
List<Map<String, dynamic>> 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;
}
}
String? language = "";
if (AppConstants().ent_type == APPPackageType.MHT.code) {
if (mhLanguageController.selectLanguage != null) {
language = mhLanguageController.selectLanguage.value!.language_code;
}
} else {
if (languageController.selectLanguage != null) {
language = languageController.selectLanguage.value!.language_code;
}
}
if (language != null && language.isNotEmpty) {
if (finalUri.value.contains("?")) {
finalUri.value += "&lang=$language";
} else {
finalUri.value += "?lang=$language";
}
}
ef.log("msg");
} catch (e) {
ef.log(e.toString());
}
}
// Future<void> getDeviceList() async {
// try {
// BodyDeviceController bodyDeviceController = Get.find();
// ApiResponse apiResponse =
// await bodyDeviceController.getDeviceList(isAllDevice: true);
// // 调试:打印返回的数据结构
// print('API响应数据: $apiResponse');
// print('API响应数据类型: ${apiResponse.data.runtimeType}');
// print('API响应数据内容: ${apiResponse.data}');
// if (apiResponse.code == HttpStatusCodes.ok) {
// List<dynamic> rawList = apiResponse.data;
// // 调试:检查 rawList 的类型和内容
// print('rawList 类型: ${rawList.runtimeType}');
// print('rawList 长度: ${rawList.length}');
// if (rawList.isNotEmpty) {
// print('rawList[0] 类型: ${rawList[0].runtimeType}');
// print('rawList[0] 内容: ${rawList[0]}');
// }
// // 安全处理:确保每个元素都是 Map
// List<Map<String, dynamic>> newList =
// rawList.whereType<Map>().map((item) {
// // 调试每个 item
// print('处理 item: $item');
// print('item 类型: ${item.runtimeType}');
// String mac = (item['mac'] ?? '').toString();
// String name = '未命名'.tr + "_${mac}";
// if (item['person'] != null && item['person'] is Map) {
// var person = item['person'] as Map;
// if (person['name'] != null &&
// person['name'].toString().trim().isNotEmpty) {
// name = '${person['name']}_${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;
// }
// }
// // ... 后续语言处理代码不变
// } catch (e) {
// print('getDeviceList 错误详情: $e');
// print('错误堆栈: ${e}');
// ef.log(e.toString());
// }
// }
}