更新
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user