254 lines
8.1 KiB
Dart
254 lines
8.1 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/NewTopSlideNotification.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';
|
||
import 'package:flutter/services.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(getBackgroundImageNoImage()),
|
||
fit: BoxFit.fill,
|
||
),
|
||
),
|
||
child: Scaffold(
|
||
backgroundColor: Colors.transparent,
|
||
appBar: AppBar(
|
||
systemOverlayStyle: SystemUiOverlayStyle(
|
||
statusBarColor: Colors.transparent, // 状态栏背景色
|
||
statusBarIconBrightness: Brightness.light, // 图标颜色(Android)
|
||
statusBarBrightness: Brightness.light, // 图标颜色(iOS)
|
||
),
|
||
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: () {
|
||
NewTopSlideNotification.show(
|
||
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: () {
|
||
NewTopSlideNotification.show(
|
||
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());
|
||
}
|
||
}
|
||
}
|