Commit 3dde4595 authored by akari's avatar akari

feat: 添加模态确认框

parent a74d7559
...@@ -10,6 +10,7 @@ import 'package:laki_icu_app/models/bo/monitoring_bo.dart'; ...@@ -10,6 +10,7 @@ import 'package:laki_icu_app/models/bo/monitoring_bo.dart';
import 'cubit/device_control_index_cubit.dart'; import 'cubit/device_control_index_cubit.dart';
import 'cubit/device_control_index_state.dart'; import 'cubit/device_control_index_state.dart';
import 'widgets/device_control_care_panel.dart'; import 'widgets/device_control_care_panel.dart';
import 'widgets/device_control_confirm_dialog.dart';
import 'widgets/device_control_info_panel.dart'; import 'widgets/device_control_info_panel.dart';
import 'widgets/device_control_metric_card.dart'; import 'widgets/device_control_metric_card.dart';
import 'widgets/device_control_mode_panel.dart'; import 'widgets/device_control_mode_panel.dart';
...@@ -92,8 +93,7 @@ class _DeviceControlLayout extends StatelessWidget { ...@@ -92,8 +93,7 @@ class _DeviceControlLayout extends StatelessWidget {
metric: metrics[index], metric: metrics[index],
), ),
), ),
if (index < metrics.length - 1) if (index < metrics.length - 1) SizedBox(width: 24.w),
SizedBox(width: 24.w),
], ],
], ],
), ),
...@@ -151,11 +151,9 @@ class _DeviceControlLayout extends StatelessWidget { ...@@ -151,11 +151,9 @@ class _DeviceControlLayout extends StatelessWidget {
SizedBox(height: 24.h), SizedBox(height: 24.h),
Expanded( Expanded(
flex: 20, flex: 20,
child: child: BlocBuilder<DeviceControlBloc, DeviceControlState>(
BlocBuilder<DeviceControlBloc, DeviceControlState>(
buildWhen: (previous, current) => buildWhen: (previous, current) =>
previous.data.openOxygen != previous.data.openOxygen != current.data.openOxygen,
current.data.openOxygen,
builder: (context, state) { builder: (context, state) {
final isOn = state.data.openOxygen.isOn; final isOn = state.data.openOxygen.isOn;
return DeviceControlInfoPanel( return DeviceControlInfoPanel(
...@@ -165,9 +163,14 @@ class _DeviceControlLayout extends StatelessWidget { ...@@ -165,9 +163,14 @@ class _DeviceControlLayout extends StatelessWidget {
icon: Icons.air, icon: Icons.air,
body: '开启后风扇打开、制冷、加热和\n循环等设备暂停。', body: '开启后风扇打开、制冷、加热和\n循环等设备暂停。',
warning: '*保持设备周围空气相对禁止,严禁烟火', warning: '*保持设备周围空气相对禁止,严禁烟火',
onTap: () => context.read<DeviceControlBloc>().add( onTap: () {
DeviceControlOpenOxygenSwitchChanged(!isOn), confirmDeviceControlChange(
), context,
() => context.read<DeviceControlBloc>().add(
DeviceControlOpenOxygenSwitchChanged(!isOn),
),
);
},
); );
}, },
), ),
......
...@@ -7,6 +7,7 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart'; ...@@ -7,6 +7,7 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart';
import 'package:laki_icu_app/models/bo/device_control_bo.dart'; import 'package:laki_icu_app/models/bo/device_control_bo.dart';
import 'device_control_common.dart'; import 'device_control_common.dart';
import 'device_control_confirm_dialog.dart';
/// 护理等级面板 /// 护理等级面板
class DeviceControlCarePanel extends StatelessWidget { class DeviceControlCarePanel extends StatelessWidget {
...@@ -36,9 +37,14 @@ class DeviceControlCarePanel extends StatelessWidget { ...@@ -36,9 +37,14 @@ class DeviceControlCarePanel extends StatelessWidget {
Expanded( Expanded(
child: GestureDetector( child: GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () => context.read<DeviceControlBloc>().add( onTap: () {
DeviceControlCareLevelChanged(item.level), confirmDeviceControlChange(
), context,
() => context.read<DeviceControlBloc>().add(
DeviceControlCareLevelChanged(item.level),
),
);
},
child: Text( child: Text(
item.label, item.label,
textAlign: TextAlign.center, textAlign: TextAlign.center,
...@@ -101,12 +107,16 @@ class _CareLevelBar extends StatelessWidget { ...@@ -101,12 +107,16 @@ class _CareLevelBar extends StatelessWidget {
Expanded( Expanded(
child: GestureDetector( child: GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () => onTap: () {
context.read<DeviceControlBloc>().add( confirmDeviceControlChange(
context,
() => context.read<DeviceControlBloc>().add(
DeviceControlCareLevelChanged( DeviceControlCareLevelChanged(
_careLevelItems[index].level, _careLevelItems[index].level,
), ),
), ),
);
},
child: Container( child: Container(
height: 20.h, height: 20.h,
decoration: BoxDecoration( decoration: BoxDecoration(
......
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'device_control_common.dart';
class DeviceControlConfirmConfig {
DeviceControlConfirmConfig._();
static bool enabled = true;
}
Future<void> confirmDeviceControlChange(
BuildContext context,
VoidCallback onConfirmed,
) async {
if (!DeviceControlConfirmConfig.enabled) {
onConfirmed();
return;
}
final confirmed = await showDialog<bool>(
context: context,
barrierColor: Colors.black.withValues(alpha: 0.44),
builder: (_) => const _DeviceControlConfirmDialog(),
);
if (!context.mounted || confirmed != true) return;
onConfirmed();
}
class _DeviceControlConfirmDialog extends StatelessWidget {
const _DeviceControlConfirmDialog();
@override
Widget build(BuildContext context) {
return Stack(
children: [
Positioned.fill(
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
child: const SizedBox.expand(),
),
),
Center(
child: Container(
width: 680.w,
height: 450.h,
padding: EdgeInsets.fromLTRB(42.w, 34.h, 42.w, 46.h),
decoration: BoxDecoration(
color: const Color(0xFF061C34).withValues(alpha: 0.96),
borderRadius: BorderRadius.circular(8.r),
border: Border.all(
color: const Color(0xFF89DFFF),
width: 3.w,
),
boxShadow: [
BoxShadow(
color: const Color(0xFF4FC8FF).withValues(alpha: 0.45),
blurRadius: 28.r,
spreadRadius: 3.r,
),
],
),
child: Column(
children: [
Text(
'保存设定',
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Colors.white,
fontSize: 26.sp,
fontWeight: FontWeight.w800,
decoration: TextDecoration.none,
),
),
SizedBox(height: 24.h),
Divider(
color: const Color(0xFF3A9BD2).withValues(alpha: 0.42),
height: 1.h,
),
const Spacer(),
Text(
'确认设置当前修改参数',
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Colors.white,
fontSize: 36.sp,
fontWeight: FontWeight.w800,
decoration: TextDecoration.none,
),
),
const Spacer(),
Row(
children: [
Expanded(
child: _ConfirmButton(
text: '取消',
active: false,
onPressed: () => Navigator.of(context).pop(false),
),
),
SizedBox(width: 40.w),
Expanded(
child: _ConfirmButton(
text: '确认保存',
active: true,
onPressed: () => Navigator.of(context).pop(true),
),
),
],
),
],
),
),
),
],
);
}
}
class _ConfirmButton extends StatelessWidget {
const _ConfirmButton({
required this.text,
required this.active,
required this.onPressed,
});
final String text;
final bool active;
final VoidCallback onPressed;
@override
Widget build(BuildContext context) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: onPressed,
child: Container(
height: 84.h,
alignment: Alignment.center,
decoration: deviceControlButtonDecoration(
active: active,
backgroundAsset: assetButton,
),
child: Text(
text,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: active ? const Color(0xFFC9F8FF) : Colors.white,
fontSize: 26.sp,
fontWeight: FontWeight.w800,
decoration: TextDecoration.none,
),
),
),
);
}
}
...@@ -8,6 +8,7 @@ import 'package:laki_icu_app/models/bo/monitoring_bo.dart'; ...@@ -8,6 +8,7 @@ import 'package:laki_icu_app/models/bo/monitoring_bo.dart';
import 'package:laki_icu_app/utils/numeric_keyboard.dart'; import 'package:laki_icu_app/utils/numeric_keyboard.dart';
import 'device_control_common.dart'; import 'device_control_common.dart';
import 'device_control_confirm_dialog.dart';
/// 环境指标控制卡片(温度/湿度/氧气/二氧化碳) /// 环境指标控制卡片(温度/湿度/氧气/二氧化碳)
class DeviceControlMetricCard extends StatelessWidget { class DeviceControlMetricCard extends StatelessWidget {
...@@ -149,9 +150,14 @@ class DeviceControlMetricCard extends StatelessWidget { ...@@ -149,9 +150,14 @@ class DeviceControlMetricCard extends StatelessWidget {
active: adjustEventBuilder != null, active: adjustEventBuilder != null,
onTap: adjustEventBuilder == null onTap: adjustEventBuilder == null
? null ? null
: () => context.read<DeviceControlBloc>().add( : () {
adjustEventBuilder(false), confirmDeviceControlChange(
), context,
() => context.read<DeviceControlBloc>().add(
adjustEventBuilder(false),
),
);
},
), ),
const Spacer(), const Spacer(),
GestureDetector( GestureDetector(
...@@ -186,9 +192,14 @@ class DeviceControlMetricCard extends StatelessWidget { ...@@ -186,9 +192,14 @@ class DeviceControlMetricCard extends StatelessWidget {
active: adjustEventBuilder != null, active: adjustEventBuilder != null,
onTap: adjustEventBuilder == null onTap: adjustEventBuilder == null
? null ? null
: () => context.read<DeviceControlBloc>().add( : () {
adjustEventBuilder(true), confirmDeviceControlChange(
), context,
() => context.read<DeviceControlBloc>().add(
adjustEventBuilder(true),
),
);
},
), ),
], ],
), ),
...@@ -266,7 +277,10 @@ class DeviceControlMetricCard extends StatelessWidget { ...@@ -266,7 +277,10 @@ class DeviceControlMetricCard extends StatelessWidget {
final value = result.trim(); final value = result.trim();
if (value.isEmpty || value == '.') return; if (value.isEmpty || value == '.') return;
context.read<DeviceControlBloc>().add(eventBuilder(value)); await confirmDeviceControlChange(
context,
() => context.read<DeviceControlBloc>().add(eventBuilder(value)),
);
} }
} }
......
...@@ -7,6 +7,7 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart'; ...@@ -7,6 +7,7 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart';
import 'package:laki_icu_app/models/bo/device_control_bo.dart'; import 'package:laki_icu_app/models/bo/device_control_bo.dart';
import 'device_control_common.dart'; import 'device_control_common.dart';
import 'device_control_confirm_dialog.dart';
/// 模式切换面板(外循环/检查灯/照明灯/内循环/蓝光/红光) /// 模式切换面板(外循环/检查灯/照明灯/内循环/蓝光/红光)
class DeviceControlModePanel extends StatelessWidget { class DeviceControlModePanel extends StatelessWidget {
...@@ -94,9 +95,14 @@ class DeviceControlModePanel extends StatelessWidget { ...@@ -94,9 +95,14 @@ class DeviceControlModePanel extends StatelessWidget {
label: item.label, label: item.label,
icon: item.icon, icon: item.icon,
active: item.active, active: item.active,
onTap: () => context.read<DeviceControlBloc>().add( onTap: () {
item.event, confirmDeviceControlChange(
), context,
() => context.read<DeviceControlBloc>().add(
item.event,
),
);
},
), ),
), ),
], ],
......
...@@ -7,6 +7,7 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart'; ...@@ -7,6 +7,7 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart';
import 'package:laki_icu_app/utils/numeric_keyboard.dart'; import 'package:laki_icu_app/utils/numeric_keyboard.dart';
import 'device_control_common.dart'; import 'device_control_common.dart';
import 'device_control_confirm_dialog.dart';
/// 设置雾化/消毒时间面板 /// 设置雾化/消毒时间面板
class DeviceControlTimePanel extends StatelessWidget { class DeviceControlTimePanel extends StatelessWidget {
...@@ -81,7 +82,10 @@ class DeviceControlTimePanel extends StatelessWidget { ...@@ -81,7 +82,10 @@ class DeviceControlTimePanel extends StatelessWidget {
final value = result.trim(); final value = result.trim();
if (value.isEmpty) return; if (value.isEmpty) return;
context.read<DeviceControlBloc>().add(eventBuilder(value)); await confirmDeviceControlChange(
context,
() => context.read<DeviceControlBloc>().add(eventBuilder(value)),
);
} }
} }
......
...@@ -7,6 +7,7 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart'; ...@@ -7,6 +7,7 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart';
import 'package:laki_icu_app/models/bo/device_control_bo.dart'; import 'package:laki_icu_app/models/bo/device_control_bo.dart';
import 'device_control_common.dart'; import 'device_control_common.dart';
import 'device_control_confirm_dialog.dart';
/// 风速调节面板 /// 风速调节面板
class DeviceControlWindPanel extends StatelessWidget { class DeviceControlWindPanel extends StatelessWidget {
...@@ -33,11 +34,16 @@ class DeviceControlWindPanel extends StatelessWidget { ...@@ -33,11 +34,16 @@ class DeviceControlWindPanel extends StatelessWidget {
label: '睡眠模式', label: '睡眠模式',
icon: Icons.nightlight_round, icon: Icons.nightlight_round,
active: currentMode == WindSpeedMode.sleep, active: currentMode == WindSpeedMode.sleep,
onTap: () => context.read<DeviceControlBloc>().add( onTap: () {
const DeviceControlWindSpeedModeChanged( confirmDeviceControlChange(
WindSpeedMode.sleep, context,
), () => context.read<DeviceControlBloc>().add(
), const DeviceControlWindSpeedModeChanged(
WindSpeedMode.sleep,
),
),
);
},
), ),
), ),
SizedBox(height: 18.h), SizedBox(height: 18.h),
...@@ -46,11 +52,16 @@ class DeviceControlWindPanel extends StatelessWidget { ...@@ -46,11 +52,16 @@ class DeviceControlWindPanel extends StatelessWidget {
label: '舒适模式', label: '舒适模式',
icon: Icons.favorite_border, icon: Icons.favorite_border,
active: currentMode == WindSpeedMode.comfort, active: currentMode == WindSpeedMode.comfort,
onTap: () => context.read<DeviceControlBloc>().add( onTap: () {
const DeviceControlWindSpeedModeChanged( confirmDeviceControlChange(
WindSpeedMode.comfort, context,
), () => context.read<DeviceControlBloc>().add(
), const DeviceControlWindSpeedModeChanged(
WindSpeedMode.comfort,
),
),
);
},
), ),
), ),
SizedBox(height: 18.h), SizedBox(height: 18.h),
...@@ -59,11 +70,16 @@ class DeviceControlWindPanel extends StatelessWidget { ...@@ -59,11 +70,16 @@ class DeviceControlWindPanel extends StatelessWidget {
label: '强劲模式', label: '强劲模式',
icon: Icons.air, icon: Icons.air,
active: currentMode == WindSpeedMode.strong, active: currentMode == WindSpeedMode.strong,
onTap: () => context.read<DeviceControlBloc>().add( onTap: () {
const DeviceControlWindSpeedModeChanged( confirmDeviceControlChange(
WindSpeedMode.strong, context,
), () => context.read<DeviceControlBloc>().add(
), const DeviceControlWindSpeedModeChanged(
WindSpeedMode.strong,
),
),
);
},
), ),
), ),
], ],
......
...@@ -7,6 +7,10 @@ import 'package:laki_icu_app/utils/toast_utils.dart'; ...@@ -7,6 +7,10 @@ import 'package:laki_icu_app/utils/toast_utils.dart';
import '../../widgets/settings_panel_frame.dart'; import '../../widgets/settings_panel_frame.dart';
import '../cubit/factory_settings_index_cubit.dart'; import '../cubit/factory_settings_index_cubit.dart';
const bool _enableCalibrationEditing = false;
const bool _showCalibrationInitButton = false;
const bool _showCalibrationApplyButton = false;
class FactoryDeviceCalibrationPanel extends StatefulWidget { class FactoryDeviceCalibrationPanel extends StatefulWidget {
const FactoryDeviceCalibrationPanel({super.key}); const FactoryDeviceCalibrationPanel({super.key});
...@@ -64,12 +68,12 @@ class _FactoryDeviceCalibrationPanelState ...@@ -64,12 +68,12 @@ class _FactoryDeviceCalibrationPanelState
children: [ children: [
_CalibrationSectionView( _CalibrationSectionView(
section: _sections[0], section: _sections[0],
onItemTap: _editItem, onItemTap: _enableCalibrationEditing ? _editItem : null,
), ),
SizedBox(height: 28.h), SizedBox(height: 28.h),
_CalibrationSectionView( _CalibrationSectionView(
section: _sections[1], section: _sections[1],
onItemTap: _editItem, onItemTap: _enableCalibrationEditing ? _editItem : null,
), ),
], ],
), ),
...@@ -86,18 +90,20 @@ class _FactoryDeviceCalibrationPanelState ...@@ -86,18 +90,20 @@ class _FactoryDeviceCalibrationPanelState
children: [ children: [
_CalibrationSectionView( _CalibrationSectionView(
section: _sections[2], section: _sections[2],
onItemTap: _editItem, onItemTap: _enableCalibrationEditing ? _editItem : null,
), ),
const Spacer(), const Spacer(),
Center( if (_showCalibrationInitButton) ...[
child: _CalibrationButton( Center(
text: '初始化设置', child: _CalibrationButton(
width: 360.w, text: '初始化设置',
height: 72.h, width: 360.w,
onPressed: _resetDefaults, height: 72.h,
onPressed: _resetDefaults,
),
), ),
), SizedBox(height: 46.h),
SizedBox(height: 46.h), ],
Row( Row(
children: [ children: [
Expanded( Expanded(
...@@ -111,14 +117,16 @@ class _FactoryDeviceCalibrationPanelState ...@@ -111,14 +117,16 @@ class _FactoryDeviceCalibrationPanelState
}, },
), ),
), ),
SizedBox(width: 34.w), if (_showCalibrationApplyButton) ...[
Expanded( SizedBox(width: 34.w),
child: _CalibrationButton( Expanded(
text: '应用更改', child: _CalibrationButton(
height: 92.h, text: '应用更改',
onPressed: _applyChanges, height: 92.h,
onPressed: _applyChanges,
),
), ),
), ],
], ],
), ),
], ],
...@@ -136,7 +144,7 @@ class _CalibrationSectionView extends StatelessWidget { ...@@ -136,7 +144,7 @@ class _CalibrationSectionView extends StatelessWidget {
}); });
final _CalibrationSection section; final _CalibrationSection section;
final ValueChanged<_CalibrationItem> onItemTap; final ValueChanged<_CalibrationItem>? onItemTap;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
...@@ -155,7 +163,10 @@ class _CalibrationSectionView extends StatelessWidget { ...@@ -155,7 +163,10 @@ class _CalibrationSectionView extends StatelessWidget {
), ),
SizedBox(height: 24.h), SizedBox(height: 24.h),
for (final item in section.items) ...[ for (final item in section.items) ...[
_CalibrationRow(item: item, onTap: () => onItemTap(item)), _CalibrationRow(
item: item,
onTap: onItemTap == null ? null : () => onItemTap!(item),
),
SizedBox(height: 18.h), SizedBox(height: 18.h),
], ],
], ],
...@@ -170,7 +181,7 @@ class _CalibrationRow extends StatelessWidget { ...@@ -170,7 +181,7 @@ class _CalibrationRow extends StatelessWidget {
}); });
final _CalibrationItem item; final _CalibrationItem item;
final VoidCallback onTap; final VoidCallback? onTap;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
......
...@@ -8,6 +8,9 @@ import '../cubit/factory_settings_index_cubit.dart'; ...@@ -8,6 +8,9 @@ import '../cubit/factory_settings_index_cubit.dart';
import '../cubit/factory_settings_index_state.dart'; import '../cubit/factory_settings_index_state.dart';
import 'factory_device_calibration_panel.dart'; import 'factory_device_calibration_panel.dart';
const bool _showFactoryCalibrationEntry = false;
const bool _showFactoryInitEntry = false;
class FactorySettingsPanel extends StatelessWidget { class FactorySettingsPanel extends StatelessWidget {
const FactorySettingsPanel({super.key}); const FactorySettingsPanel({super.key});
...@@ -132,15 +135,18 @@ class _FactoryActionColumn extends StatelessWidget { ...@@ -132,15 +135,18 @@ class _FactoryActionColumn extends StatelessWidget {
Center( Center(
child: Column( child: Column(
children: [ children: [
_WideFactoryButton( if (_showFactoryCalibrationEntry)
text: '设备校准', _WideFactoryButton(
onPressed: () => cubit.showCalibrationPage(), text: '设备校准',
), onPressed: () => cubit.showCalibrationPage(),
SizedBox(height: 28.h), ),
_WideFactoryButton( if (_showFactoryCalibrationEntry && _showFactoryInitEntry)
text: '初始化设置', SizedBox(height: 28.h),
onPressed: () => const {}, if (_showFactoryInitEntry)
), _WideFactoryButton(
text: '初始化设置',
onPressed: () => const {},
),
], ],
), ),
), ),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment