249 lines
7.7 KiB
Dart
249 lines
7.7 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(
|
|
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());
|
|
}
|
|
}
|
|
}
|