This commit is contained in:
wyf
2025-05-23 14:51:09 +08:00
parent 8a418c9c98
commit c650bad8b1
36 changed files with 1297 additions and 892 deletions

View File

@@ -1,5 +1,4 @@
import 'dart:async';
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
@@ -18,7 +17,8 @@ import 'package:vbvs_app/controller/theme_controller/ThemeController.dart';
import 'package:vbvs_app/pages/device/component/DeviceDataComponentWidget.dart';
class BodyDeviceWidget extends StatefulWidget {
const BodyDeviceWidget({super.key});
var type;
BodyDeviceWidget({super.key, required this.type});
@override
State<BodyDeviceWidget> createState() => _BodyDevicePageState();
@@ -29,6 +29,7 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
final BodyDeviceController bodyDeviceController = Get.find();
HomeController homeController = Get.find();
final GlobalKey addIconKey = GlobalKey();
final ScrollController _scrollController = ScrollController();
OverlayEntry? _popupEntry;
Timer? _timer;
@@ -36,7 +37,6 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
final renderBox =
addIconKey.currentContext?.findRenderObject() as RenderBox?;
if (renderBox == null) return;
final position = renderBox.localToGlobal(Offset.zero);
final size = renderBox.size;
double popupWidth = 190.rpx;
@@ -44,7 +44,7 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
// 移除之前的弹窗
_popupEntry?.remove();
// 创建新的 OverlayEntry
// 创建新的OverlayEntry
_popupEntry = OverlayEntry(
builder: (context) => Stack(
children: [
@@ -54,7 +54,6 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
color: Colors.transparent,
onDismiss: _hidePopup,
),
// 弹窗内容
Positioned(
top: position.dy + size.height + 26.rpx,
@@ -143,7 +142,7 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
),
);
// 插入新的 OverlayEntry
// 插入新的OverlayEntry
Overlay.of(context)!.insert(_popupEntry!);
}
@@ -156,17 +155,39 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
void initState() {
bodyDeviceController.keyWord.value = "";
super.initState();
// 初次请求一次
_fetchDeviceList();
// 每 5 秒定时请求一次
// 处理传入的type参数
if (widget.type != null && widget.type is Map) {
final bindType = widget.type['bind_type'];
final mac = widget.type['mac'];
if (bindType != null) {
bodyDeviceController.model.type = bindType;
homeController.model.type = bindType;
}
// 初次请求设备列表
_fetchDeviceList().then((_) {
if (mac != null) {
// 延迟执行以确保列表已渲染
WidgetsBinding.instance.addPostFrameCallback((_) {
_scrollToDeviceWithMac(mac);
});
}
});
} else {
// 没有传入type时的默认逻辑
_fetchDeviceList();
}
// 每5秒定时请求一次
_timer = Timer.periodic(Duration(seconds: 5), (timer) {
_fetchDeviceList();
});
}
void _fetchDeviceList() {
bodyDeviceController.getDeviceList().then((apiResponse) {
Future<void> _fetchDeviceList() async {
await bodyDeviceController.getDeviceList().then((apiResponse) {
if (apiResponse.code != HttpStatusCodes.ok) {
TopSlideNotification.show(
Get.context!,
@@ -177,9 +198,32 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
});
}
void _scrollToDeviceWithMac(String mac) {
final deviceList = bodyDeviceController.deviceList.value;
final index = deviceList.indexWhere((device) => device['mac'] == mac);
if (index != -1 && _scrollController.hasClients) {
// 动态计算高度:最小为 501.rpx最大为 26.6% 屏幕高度
final screenHeight = MediaQuery.of(Get.context!).size.height;
final dynamicItemHeight = (screenHeight * 0.266).rpx;
final itemHeight =
dynamicItemHeight < 501.rpx ? 501.rpx : dynamicItemHeight;
final spacing = 25.rpx;
final targetPosition = index * (itemHeight + spacing);
_scrollController.animateTo(
targetPosition,
duration: const Duration(milliseconds: 500),
curve: Curves.easeInOut,
);
}
}
@override
void dispose() {
_timer?.cancel(); // 页面销毁时取消定时器
_scrollController.dispose();
super.dispose();
}
@@ -189,16 +233,14 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
builder: (context, bodysize) => GestureDetector(
onTap: () => FocusScope.of(context).unfocus(),
child: Container(
// width: bodysize.maxWidth,
// height: bodysize.maxHeight * 1,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/img/bgNoImg.png'), // 本地图片
fit: BoxFit.fill, // 填满整个 Container
image: AssetImage('assets/img/bgNoImg.png'),
fit: BoxFit.fill,
),
),
child: Scaffold(
backgroundColor: Colors.transparent, // 加上这一行
backgroundColor: Colors.transparent,
appBar: AppBar(
backgroundColor: themeController.currentColor.sc17,
automaticallyImplyLeading: false,
@@ -216,7 +258,7 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
Text(
'体征检测设备.标题'.tr,
style: TextStyle(
fontFamily: 'Readex Pro',
fontFamily: 'ReadexPro',
color: themeController.currentColor.sc3,
letterSpacing: 0,
fontSize: 30.rpx,
@@ -224,7 +266,6 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
),
Positioned(
left: 0,
// child: returnIconButtom,
child: returnIconButtomAddCallback(() {
bodyDeviceController.getDeviceNum();
bodyDeviceController.getDeviceList();
@@ -316,10 +357,8 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
mainAxisSize: MainAxisSize.max,
children: [
Container(
width:
160.rpx, // 固定宽度为 160.rpx
alignment:
Alignment.center, // 文字居中
width: 160.rpx,
alignment: Alignment.center,
child: Text(
'体征检测设备.我的e护'.tr,
style: FlutterFlowTheme.of(
@@ -372,10 +411,8 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
mainAxisSize: MainAxisSize.max,
children: [
Container(
width:
160.rpx, // 固定宽度为 160.rpx
alignment:
Alignment.center, // 文字居中
width: 160.rpx,
alignment: Alignment.center,
child: Text(
'体征检测设备.云关爱'.tr,
style: FlutterFlowTheme.of(
@@ -407,19 +444,18 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
],
),
Obx(() {
// 横线宽度固定为 160.rpx
// 横线宽度固定为160.rpx
double lineWidth = 160.rpx;
return AnimatedPositioned(
duration: Duration(milliseconds: 300),
curve: Curves.easeInOut,
bottom: 0,
left: bodyDeviceController.model.type ==
1
? 0
: 160.rpx, // 第二个按钮横线从 160.rpx 开始
left:
bodyDeviceController.model.type == 1
? 0
: 160.rpx,
child: Container(
width: lineWidth, // 横线宽度固定为 160.rpx
width: lineWidth,
height: 4.rpx,
decoration: BoxDecoration(
color: themeController
@@ -482,12 +518,12 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
.of(context)
.labelMedium
.override(
fontFamily: 'Inter',
fontSize: 26.rpx,
letterSpacing: 0.0,
color: themeController
.currentColor
.sc4),
fontFamily: 'Inter',
fontSize: 26.rpx,
letterSpacing: 0.0,
color: themeController
.currentColor.sc4,
),
enabledBorder:
OutlineInputBorder(
borderSide: BorderSide(
@@ -625,6 +661,7 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
padding: EdgeInsetsDirectional.fromSTEB(
30.rpx, 26.rpx, 30.rpx, 0),
child: SingleChildScrollView(
controller: _scrollController,
child: Column(
mainAxisSize: MainAxisSize.max,
children: bodyDeviceController
@@ -653,7 +690,7 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
Widget _buildDeviceCard(BuildContext context,
{required String title, required String imageUrl, required String type}) {
return CustomCard(
borderRadius: 20.rpx, // 圆角大小
borderRadius: 20.rpx,
onTap: () {
if (type != null) {
if (type == '1') {
@@ -661,7 +698,7 @@ class _BodyDevicePageState extends State<BodyDeviceWidget> {
}
}
},
colors: [themeController.currentColor.sc17], // 背景色
colors: [themeController.currentColor.sc17],
child: Container(
width: double.infinity,
height: MediaQuery.sizeOf(context).height * 0.135,