更新日历样式
This commit is contained in:
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 8.4 KiB |
@@ -3,8 +3,11 @@ import 'package:get/get.dart';
|
||||
import 'package:vbvs_app/common/color/appConstants.dart';
|
||||
import 'package:vbvs_app/common/util/FitTool.dart';
|
||||
import 'package:vbvs_app/common/util/MyUtils.dart';
|
||||
import 'package:vbvs_app/common/util/requestWithLog.dart';
|
||||
import 'package:vbvs_app/component/tool/ClickableContainer.dart';
|
||||
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
|
||||
import 'package:vbvs_app/controller/date/CalendarController.dart';
|
||||
import 'package:vbvs_app/pages/main_bottom/component/main_page_b_bottom_change.dart';
|
||||
import 'SleepdateWidget.dart';
|
||||
|
||||
class SleepCalendarWidget extends StatefulWidget {
|
||||
@@ -12,9 +15,11 @@ class SleepCalendarWidget extends StatefulWidget {
|
||||
final ValueChanged<DateTime>? onDateSelected;
|
||||
final int? type; // 新增参数,默认日历类型为日
|
||||
final Color highlightColor; // ✅ 新增
|
||||
final String? mac;
|
||||
|
||||
const SleepCalendarWidget({
|
||||
super.key,
|
||||
this.mac,
|
||||
this.timestamp,
|
||||
this.onDateSelected,
|
||||
this.type = 1,
|
||||
@@ -27,27 +32,89 @@ class SleepCalendarWidget extends StatefulWidget {
|
||||
|
||||
class _SleepCalendarWidgetState extends State<SleepCalendarWidget> {
|
||||
CalendarController calendarController = Get.find();
|
||||
|
||||
RxMap sleepDate = <String, dynamic>{}.obs;
|
||||
RxList showLabel = <dynamic>[
|
||||
{"level": 5, "name": "无报告", "color": "#9E9E9E"}
|
||||
].obs;
|
||||
// @override
|
||||
// void initState() {
|
||||
// super.initState();
|
||||
// final initialDate = widget.timestamp != null
|
||||
// ? DateTime.fromMillisecondsSinceEpoch(widget.timestamp!)
|
||||
// : DateTime.now();
|
||||
// calendarController.displayedMonth.value = initialDate;
|
||||
// calendarController.selectedDate.value = initialDate;
|
||||
// }
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
final initialDate = widget.timestamp != null
|
||||
? DateTime.fromMillisecondsSinceEpoch(widget.timestamp!)
|
||||
: DateTime.now();
|
||||
calendarController.displayedMonth.value = initialDate;
|
||||
calendarController.selectedDate.value = initialDate;
|
||||
|
||||
// 初始化请求
|
||||
fetchDate(initialDate);
|
||||
|
||||
// 每当月份变化时,重新请求数据
|
||||
ever(calendarController.displayedMonth, (DateTime newMonth) {
|
||||
fetchDate(newMonth);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> fetchDate(DateTime timeStamp) async {
|
||||
final dateStr = timeStamp.toString().split(' ')[0];
|
||||
|
||||
await requestWithLog(
|
||||
logTitle: "查询睡眠报告",
|
||||
method: MyHttpMethod.get,
|
||||
queryUrl:
|
||||
"https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.mac}&time=$dateStr&type=3",
|
||||
onSuccess: (res) {
|
||||
sleepDate.value = res.data;
|
||||
showLabel.value = [
|
||||
...res.data['scoreList']['type'],
|
||||
{"level": 5, "name": "无报告", "color": "#9E9E9E"},
|
||||
// ✅ 注意拼写是 scoreList
|
||||
];
|
||||
},
|
||||
onFailure: (res) {
|
||||
sleepDate.value = {};
|
||||
showLabel.value = [
|
||||
{"level": 5, "name": "无报告", "color": "#9E9E9E"},
|
||||
];
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> fetchSleepColor(DateTime timeStamp) async {
|
||||
final dateStr = timeStamp.toString().split(' ')[0];
|
||||
|
||||
await requestWithLog(
|
||||
logTitle: "查询睡眠报告",
|
||||
method: MyHttpMethod.get,
|
||||
queryUrl: "https://sleepdata.he-info.com/api/analysis/sleep/score/type",
|
||||
onSuccess: (res) {
|
||||
sleepDate.value = res.data;
|
||||
showLabel.value = [
|
||||
...res.data['scoreList']['type'],
|
||||
{"level": 5, "name": "无报告", "color": "#9E9E9E"},
|
||||
// ✅ 注意拼写是 scoreList
|
||||
];
|
||||
},
|
||||
onFailure: (res) {
|
||||
sleepDate.value = {};
|
||||
showLabel.value = [
|
||||
{"level": 5, "name": "无报告", "color": "#9E9E9E"},
|
||||
];
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
List<Map<String, dynamic>> showLabel = [
|
||||
{"level": 1, "name": "优秀", "color": Color(0xFF4CAF50)},
|
||||
{"level": 2, "name": "良好", "color": Color(0xFF8BC34A)},
|
||||
{"level": 3, "name": "合格", "color": Color(0xFFFFC107)},
|
||||
{"level": 4, "name": "注意", "color": Color(0xFFF44336)},
|
||||
{"level": 5, "name": "无报告", "color": Color(0xFF9E9E9E)},
|
||||
];
|
||||
|
||||
return Container(
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
@@ -117,7 +184,7 @@ class _SleepCalendarWidgetState extends State<SleepCalendarWidget> {
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildCalendarBody(List<Map<String, dynamic>> showLabel) {
|
||||
Widget _buildCalendarBody(List<dynamic> showLabel) {
|
||||
return Container(
|
||||
width: double.infinity,
|
||||
constraints: BoxConstraints(minHeight: 720.rpx),
|
||||
@@ -135,9 +202,8 @@ class _SleepCalendarWidgetState extends State<SleepCalendarWidget> {
|
||||
children: [
|
||||
// 仅当为日历模式显示周标题
|
||||
_buildWeekdayHeader(),
|
||||
// 日历日期格子,支持日和周的高亮逻辑
|
||||
|
||||
_buildCalendarGrid(calendarRows, selectedDate),
|
||||
// 日历日期格子,支持日和周的高亮逻辑sleep
|
||||
_buildCalendarGrid(calendarRows, selectedDate, sleepDate.value),
|
||||
// TODO: 你可以扩展 month 类型的展示
|
||||
SizedBox(height: 55.rpx),
|
||||
_buildLegend(showLabel),
|
||||
@@ -169,8 +235,8 @@ class _SleepCalendarWidgetState extends State<SleepCalendarWidget> {
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildCalendarGrid(
|
||||
List<List<DateTime>> calendarRows, DateTime? selectedDate) {
|
||||
Widget _buildCalendarGrid(List<List<DateTime>> calendarRows,
|
||||
DateTime? selectedDate, Map sleepDate) {
|
||||
final isMonthSelected = widget.type == 3;
|
||||
|
||||
Widget content = Column(
|
||||
@@ -197,6 +263,7 @@ class _SleepCalendarWidgetState extends State<SleepCalendarWidget> {
|
||||
return Expanded(
|
||||
child: SleepdateWidget(
|
||||
highlightColor: widget.highlightColor, // ✅ 传入高亮颜色
|
||||
sleepDate: sleepDate,
|
||||
date: date,
|
||||
isSelected: isSelected,
|
||||
onTap: () {
|
||||
@@ -257,7 +324,7 @@ class _SleepCalendarWidgetState extends State<SleepCalendarWidget> {
|
||||
}
|
||||
}
|
||||
|
||||
Widget _buildLegend(List<Map<String, dynamic>> showLabel) {
|
||||
Widget _buildLegend(List showLabel) {
|
||||
return Wrap(
|
||||
spacing: 20.rpx,
|
||||
runSpacing: 20.rpx,
|
||||
@@ -271,7 +338,7 @@ class _SleepCalendarWidgetState extends State<SleepCalendarWidget> {
|
||||
width: 20.rpx,
|
||||
height: 20.rpx,
|
||||
decoration: BoxDecoration(
|
||||
color: item["color"],
|
||||
color: stringToColor(item["color"]),
|
||||
borderRadius: BorderRadius.circular(10.rpx),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:vbvs_app/common/util/FitTool.dart';
|
||||
import 'package:vbvs_app/common/util/MyUtils.dart';
|
||||
import 'package:vbvs_app/component/tool/ClickableContainer.dart';
|
||||
|
||||
class SleepdateWidget extends StatelessWidget {
|
||||
@@ -7,17 +8,90 @@ class SleepdateWidget extends StatelessWidget {
|
||||
final bool isSelected;
|
||||
final VoidCallback onTap;
|
||||
final Color highlightColor; // 新增
|
||||
|
||||
const SleepdateWidget({
|
||||
super.key,
|
||||
final Map sleepDate;
|
||||
SleepdateWidget({
|
||||
required this.sleepDate,
|
||||
required this.date,
|
||||
required this.isSelected,
|
||||
required this.onTap,
|
||||
this.highlightColor = Colors.black, // 默认值黑色
|
||||
});
|
||||
|
||||
@override
|
||||
// Widget build(BuildContext context) {
|
||||
// return ClickableContainer(
|
||||
// onTap: onTap,
|
||||
// backgroundColor: Colors.transparent,
|
||||
// highlightColor: Colors.transparent,
|
||||
// padding: EdgeInsets.all(4.rpx),
|
||||
// child: Container(
|
||||
// width: 90.rpx,
|
||||
// height: 90.rpx,
|
||||
// decoration: BoxDecoration(
|
||||
// borderRadius: BorderRadius.circular(30.rpx),
|
||||
// color: isSelected ? highlightColor : Colors.transparent, // 使用传入的颜色
|
||||
// ),
|
||||
// child: Padding(
|
||||
// padding:
|
||||
// EdgeInsetsDirectional.fromSTEB(10.rpx, 10.rpx, 10.rpx, 10.rpx),
|
||||
// child: Container(
|
||||
// decoration: BoxDecoration(
|
||||
// color: Color(0xFF757575),
|
||||
// shape: BoxShape.circle,
|
||||
// ),
|
||||
// alignment: Alignment.center,
|
||||
// child: Text(
|
||||
// '${date.day}',
|
||||
// style: TextStyle(
|
||||
// color: Colors.white,
|
||||
// fontSize: 26.rpx,
|
||||
// letterSpacing: 0.0,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Color? fillColor;
|
||||
|
||||
// 判断是否存在 score 数据
|
||||
final List<dynamic>? dataList = sleepDate['scoreList']?['data'];
|
||||
final List<dynamic>? typeList = sleepDate['scoreList']?['type'];
|
||||
|
||||
if (dataList != null && typeList != null) {
|
||||
// 查找是否有匹配日期的数据
|
||||
for (var item in dataList) {
|
||||
final st = item['st'];
|
||||
final level = item['level'];
|
||||
|
||||
if (st is int) {
|
||||
final itemDate =
|
||||
DateTime.fromMillisecondsSinceEpoch(st).toLocal(); // 转为本地时间
|
||||
|
||||
// 判断是否是同一天
|
||||
if (itemDate.year == date.year &&
|
||||
itemDate.month == date.month &&
|
||||
itemDate.day == date.day) {
|
||||
// 找到对应 level 的颜色
|
||||
final matchType = typeList.firstWhere(
|
||||
(e) => e['level'] == level,
|
||||
orElse: () => null,
|
||||
);
|
||||
|
||||
if (matchType != null && matchType['color'] != null) {
|
||||
final hexColor = matchType['color'];
|
||||
fillColor = stringToColor(hexColor);
|
||||
}
|
||||
|
||||
break; // 找到就跳出
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ClickableContainer(
|
||||
onTap: onTap,
|
||||
backgroundColor: Colors.transparent,
|
||||
@@ -28,14 +102,14 @@ class SleepdateWidget extends StatelessWidget {
|
||||
height: 90.rpx,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(30.rpx),
|
||||
color: isSelected ? highlightColor : Colors.transparent, // 使用传入的颜色
|
||||
color: isSelected ? highlightColor : Colors.transparent,
|
||||
),
|
||||
child: Padding(
|
||||
padding:
|
||||
EdgeInsetsDirectional.fromSTEB(10.rpx, 10.rpx, 10.rpx, 10.rpx),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Color(0xFF757575),
|
||||
color: fillColor ?? Color(0xFF757575), // 如果匹配不到就默认灰色
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
alignment: Alignment.center,
|
||||
|
||||
@@ -1328,28 +1328,49 @@ void showProgressDialog(
|
||||
void showSleepCalendarBottomSheet({
|
||||
required BuildContext context,
|
||||
int? timestamp,
|
||||
int? type = 1, // 新增参数,默认值为1
|
||||
int? type = 1,
|
||||
String? mac,
|
||||
required void Function(DateTime selectedDate) onDateSelected,
|
||||
}) {
|
||||
showModalBottomSheet(
|
||||
showGeneralDialog(
|
||||
context: context,
|
||||
isScrollControlled: false,
|
||||
backgroundColor: Colors.transparent,
|
||||
builder: (context) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xFF242835),
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.circular(20.rpx),
|
||||
topRight: Radius.circular(20.rpx),
|
||||
barrierDismissible: true,
|
||||
barrierLabel: 'Dismiss',
|
||||
barrierColor: Colors.black.withOpacity(0.4), // 移到这里,替代 Scaffold 背景
|
||||
transitionDuration: const Duration(milliseconds: 300),
|
||||
pageBuilder: (context, animation, secondaryAnimation) {
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
Navigator.of(context).pop(); // 点击空白关闭
|
||||
},
|
||||
child: Material(
|
||||
type: MaterialType.transparency,
|
||||
child: Align(
|
||||
alignment: Alignment.bottomCenter,
|
||||
child: GestureDetector(
|
||||
onTap: () {}, // 阻止点击透传到外部(避免误关)
|
||||
child: FractionallySizedBox(
|
||||
widthFactor: 1.0,
|
||||
heightFactor: 0.55,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xFF242835),
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.circular(20.rpx),
|
||||
topRight: Radius.circular(20.rpx),
|
||||
),
|
||||
),
|
||||
child: SleepCalendarWidget(
|
||||
timestamp: timestamp,
|
||||
type: type,
|
||||
mac: mac,
|
||||
onDateSelected: onDateSelected,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
child: SleepCalendarWidget(
|
||||
timestamp: timestamp,
|
||||
type: type, // 传递类型给子组件
|
||||
onDateSelected: onDateSelected,
|
||||
// highlightColor: Colors.green,
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
@@ -314,6 +314,7 @@ class _OtherLoginPageState extends State<OtherLoginPage> {
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Align(
|
||||
alignment: AlignmentDirectional(-1, 0),
|
||||
child: Padding(
|
||||
|
||||
@@ -317,16 +317,14 @@ class EditAddressPage extends GetView<AddressController>
|
||||
),
|
||||
),
|
||||
Container(
|
||||
width: MediaQuery.sizeOf(
|
||||
context)
|
||||
.width,
|
||||
height: MediaQuery.sizeOf(
|
||||
context)
|
||||
.height *
|
||||
0.038,
|
||||
constraints:
|
||||
const BoxConstraints(
|
||||
minHeight: 31,
|
||||
// width: MediaQuery.sizeOf(
|
||||
// context)
|
||||
// .width,
|
||||
height:
|
||||
bodysize!.maxHeight *
|
||||
0.038,
|
||||
constraints: BoxConstraints(
|
||||
minHeight: 61.rpx,
|
||||
),
|
||||
decoration: BoxDecoration(),
|
||||
child: Row(
|
||||
@@ -339,19 +337,14 @@ class EditAddressPage extends GetView<AddressController>
|
||||
context)
|
||||
.width *
|
||||
0.17,
|
||||
height:
|
||||
MediaQuery.sizeOf(
|
||||
context)
|
||||
.height *
|
||||
0.038,
|
||||
decoration:
|
||||
BoxDecoration(),
|
||||
constraints:
|
||||
BoxConstraints(
|
||||
minWidth:
|
||||
105.rpx,
|
||||
maxWidth:
|
||||
105.rpx),
|
||||
decoration:
|
||||
BoxDecoration(),
|
||||
child: Row(
|
||||
mainAxisSize:
|
||||
MainAxisSize
|
||||
@@ -375,8 +368,6 @@ class EditAddressPage extends GetView<AddressController>
|
||||
),
|
||||
Expanded(
|
||||
child: Container(
|
||||
width: 100,
|
||||
height: 100,
|
||||
decoration:
|
||||
BoxDecoration(
|
||||
color:
|
||||
@@ -386,105 +377,120 @@ class EditAddressPage extends GetView<AddressController>
|
||||
.circular(
|
||||
8),
|
||||
),
|
||||
child:
|
||||
TextFormField(
|
||||
// autofocus: true,
|
||||
obscureText:
|
||||
false,
|
||||
onChanged: (val) {
|
||||
controller.model
|
||||
.name = val;
|
||||
},
|
||||
|
||||
initialValue:
|
||||
address[
|
||||
'name'],
|
||||
decoration:
|
||||
InputDecoration(
|
||||
contentPadding:
|
||||
EdgeInsets
|
||||
.symmetric(
|
||||
vertical:
|
||||
25.rpx,
|
||||
horizontal:
|
||||
26.rpx,
|
||||
),
|
||||
labelStyle:
|
||||
TextStyle(
|
||||
fontFamily:
|
||||
'Readex Pro',
|
||||
letterSpacing:
|
||||
0,
|
||||
),
|
||||
hintStyle:
|
||||
TextStyle(
|
||||
fontFamily:
|
||||
'Readex Pro',
|
||||
letterSpacing:
|
||||
0,
|
||||
),
|
||||
enabledBorder:
|
||||
UnderlineInputBorder(
|
||||
borderSide:
|
||||
const BorderSide(
|
||||
color: Color(
|
||||
0x00000000),
|
||||
width: 2,
|
||||
width:
|
||||
double.infinity,
|
||||
child: Padding(
|
||||
padding:
|
||||
EdgeInsetsDirectional
|
||||
.fromSTEB(
|
||||
35.rpx,
|
||||
0,
|
||||
35.rpx,
|
||||
0),
|
||||
child: Row(
|
||||
mainAxisSize:
|
||||
MainAxisSize
|
||||
.max,
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment
|
||||
.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child:
|
||||
Container(
|
||||
child:
|
||||
Align(
|
||||
alignment: AlignmentDirectional(
|
||||
-1,
|
||||
0),
|
||||
child:
|
||||
TextFormField(
|
||||
onChanged:
|
||||
(value) {
|
||||
controller.model.name =
|
||||
value;
|
||||
},
|
||||
autofocus:
|
||||
false,
|
||||
obscureText:
|
||||
false,
|
||||
decoration:
|
||||
InputDecoration(
|
||||
contentPadding:
|
||||
EdgeInsets.all(0),
|
||||
isDense:
|
||||
true,
|
||||
labelStyle:
|
||||
TextStyle(
|
||||
fontFamily: 'Inter',
|
||||
fontSize: 26.rpx,
|
||||
letterSpacing: 0.0,
|
||||
),
|
||||
hintStyle:
|
||||
TextStyle(
|
||||
fontFamily: 'Inter',
|
||||
fontSize: 26.rpx,
|
||||
letterSpacing: 0.0,
|
||||
color: themeController.currentColor.sc4,
|
||||
),
|
||||
enabledBorder:
|
||||
OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Color(0x00000000),
|
||||
width: 1.rpx,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(8.rpx),
|
||||
),
|
||||
focusedBorder:
|
||||
OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Color(0x00000000),
|
||||
width: 1.rpx,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(8.rpx),
|
||||
),
|
||||
errorBorder:
|
||||
OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Colors.red,
|
||||
width: 1.rpx,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(8.rpx),
|
||||
),
|
||||
focusedErrorBorder:
|
||||
OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Colors.red,
|
||||
width: 1.rpx,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(8.rpx),
|
||||
),
|
||||
filled:
|
||||
false,
|
||||
fillColor:
|
||||
Colors.white,
|
||||
),
|
||||
style:
|
||||
TextStyle(
|
||||
fontFamily:
|
||||
'Readex Pro',
|
||||
letterSpacing:
|
||||
0,
|
||||
color:
|
||||
Colors.black,
|
||||
fontSize:
|
||||
26.rpx,
|
||||
),
|
||||
// cursorColor:
|
||||
// Colors.black,
|
||||
// validator: _model
|
||||
// .textControllerValidator
|
||||
// .asValidator(context),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius
|
||||
.circular(
|
||||
8),
|
||||
),
|
||||
focusedBorder:
|
||||
UnderlineInputBorder(
|
||||
borderSide:
|
||||
const BorderSide(
|
||||
color: Color(
|
||||
0x00000000),
|
||||
width: 2,
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius
|
||||
.circular(
|
||||
8),
|
||||
),
|
||||
errorBorder:
|
||||
UnderlineInputBorder(
|
||||
borderSide:
|
||||
const BorderSide(
|
||||
color: Color(
|
||||
0x00000000),
|
||||
width: 2,
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius
|
||||
.circular(
|
||||
8),
|
||||
),
|
||||
focusedErrorBorder:
|
||||
UnderlineInputBorder(
|
||||
borderSide:
|
||||
const BorderSide(
|
||||
color: Color(
|
||||
0x00000000),
|
||||
width: 2,
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius
|
||||
.circular(
|
||||
8),
|
||||
),
|
||||
),
|
||||
style: TextStyle(
|
||||
fontFamily:
|
||||
'Readex Pro',
|
||||
letterSpacing:
|
||||
0,
|
||||
color: Colors
|
||||
.black,
|
||||
fontSize:
|
||||
26.rpx,
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -494,17 +500,16 @@ class EditAddressPage extends GetView<AddressController>
|
||||
),
|
||||
),
|
||||
Container(
|
||||
width: MediaQuery.sizeOf(
|
||||
context)
|
||||
.width,
|
||||
height: MediaQuery.sizeOf(
|
||||
context)
|
||||
.height *
|
||||
0.038,
|
||||
constraints:
|
||||
const BoxConstraints(
|
||||
minHeight: 31,
|
||||
// width: MediaQuery.sizeOf(
|
||||
// context)
|
||||
// .width,
|
||||
height:
|
||||
bodysize!.maxHeight *
|
||||
0.038,
|
||||
constraints: BoxConstraints(
|
||||
minHeight: 61.rpx,
|
||||
),
|
||||
decoration: BoxDecoration(),
|
||||
child: Row(
|
||||
mainAxisSize:
|
||||
MainAxisSize.max,
|
||||
@@ -515,19 +520,14 @@ class EditAddressPage extends GetView<AddressController>
|
||||
context)
|
||||
.width *
|
||||
0.17,
|
||||
height:
|
||||
MediaQuery.sizeOf(
|
||||
context)
|
||||
.height *
|
||||
0.038,
|
||||
decoration:
|
||||
BoxDecoration(),
|
||||
constraints:
|
||||
BoxConstraints(
|
||||
minWidth:
|
||||
105.rpx,
|
||||
maxWidth:
|
||||
105.rpx),
|
||||
decoration:
|
||||
BoxDecoration(),
|
||||
child: Row(
|
||||
mainAxisSize:
|
||||
MainAxisSize
|
||||
@@ -535,136 +535,145 @@ class EditAddressPage extends GetView<AddressController>
|
||||
children: [
|
||||
Text(
|
||||
'手机号',
|
||||
style:
|
||||
TextStyle(
|
||||
fontFamily:
|
||||
'Readex Pro',
|
||||
fontSize:
|
||||
AppFontsize
|
||||
.normal_text_size,
|
||||
letterSpacing:
|
||||
0,
|
||||
color: Colors
|
||||
.white,
|
||||
),
|
||||
style: TextStyle(
|
||||
fontFamily:
|
||||
'Readex Pro',
|
||||
fontSize:
|
||||
AppFontsize
|
||||
.normal_text_size,
|
||||
letterSpacing:
|
||||
0,
|
||||
color: Colors
|
||||
.white),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Container(
|
||||
width: 100,
|
||||
height: 100,
|
||||
decoration:
|
||||
BoxDecoration(
|
||||
color:
|
||||
Colors.white,
|
||||
borderRadius:
|
||||
BorderRadius
|
||||
.circular(
|
||||
8),
|
||||
color:
|
||||
Colors.white,
|
||||
),
|
||||
child:
|
||||
TextFormField(
|
||||
// autofocus: true,
|
||||
onChanged: (val) {
|
||||
controller.model
|
||||
.tel = val;
|
||||
},
|
||||
textAlignVertical:
|
||||
TextAlignVertical
|
||||
.center, // 垂直居中
|
||||
obscureText:
|
||||
false,
|
||||
initialValue:
|
||||
address[
|
||||
'tel'],
|
||||
decoration:
|
||||
InputDecoration(
|
||||
contentPadding:
|
||||
EdgeInsets
|
||||
.symmetric(
|
||||
vertical:
|
||||
25.rpx,
|
||||
horizontal:
|
||||
26.rpx,
|
||||
),
|
||||
labelStyle:
|
||||
TextStyle(
|
||||
fontFamily:
|
||||
'Readex Pro',
|
||||
letterSpacing:
|
||||
0,
|
||||
),
|
||||
hintStyle:
|
||||
TextStyle(
|
||||
fontFamily:
|
||||
'Readex Pro',
|
||||
letterSpacing:
|
||||
0,
|
||||
),
|
||||
enabledBorder:
|
||||
UnderlineInputBorder(
|
||||
borderSide:
|
||||
const BorderSide(
|
||||
color: Color(
|
||||
0x00000000),
|
||||
width: 2,
|
||||
width:
|
||||
double.infinity,
|
||||
child: Padding(
|
||||
padding:
|
||||
EdgeInsetsDirectional
|
||||
.fromSTEB(
|
||||
35.rpx,
|
||||
0,
|
||||
35.rpx,
|
||||
0),
|
||||
child: Row(
|
||||
mainAxisSize:
|
||||
MainAxisSize
|
||||
.max,
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment
|
||||
.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child:
|
||||
Container(
|
||||
child:
|
||||
Align(
|
||||
alignment: AlignmentDirectional(
|
||||
-1,
|
||||
0),
|
||||
child:
|
||||
TextFormField(
|
||||
onChanged:
|
||||
(value) {
|
||||
controller.model.tel =
|
||||
value;
|
||||
},
|
||||
autofocus:
|
||||
false,
|
||||
obscureText:
|
||||
false,
|
||||
decoration:
|
||||
InputDecoration(
|
||||
contentPadding:
|
||||
EdgeInsets.all(0),
|
||||
isDense:
|
||||
true,
|
||||
labelStyle:
|
||||
TextStyle(
|
||||
fontFamily: 'Inter',
|
||||
fontSize: 26.rpx,
|
||||
letterSpacing: 0.0,
|
||||
),
|
||||
hintStyle:
|
||||
TextStyle(
|
||||
fontFamily: 'Inter',
|
||||
fontSize: 26.rpx,
|
||||
letterSpacing: 0.0,
|
||||
color: themeController.currentColor.sc4,
|
||||
),
|
||||
enabledBorder:
|
||||
OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Color(0x00000000),
|
||||
width: 1.rpx,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(8.rpx),
|
||||
),
|
||||
focusedBorder:
|
||||
OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Color(0x00000000),
|
||||
width: 1.rpx,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(8.rpx),
|
||||
),
|
||||
errorBorder:
|
||||
OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Colors.red,
|
||||
width: 1.rpx,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(8.rpx),
|
||||
),
|
||||
focusedErrorBorder:
|
||||
OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Colors.red,
|
||||
width: 1.rpx,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(8.rpx),
|
||||
),
|
||||
filled:
|
||||
false,
|
||||
fillColor:
|
||||
Colors.white,
|
||||
),
|
||||
style:
|
||||
TextStyle(
|
||||
fontFamily:
|
||||
'Readex Pro',
|
||||
letterSpacing:
|
||||
0,
|
||||
color:
|
||||
Colors.black,
|
||||
fontSize:
|
||||
26.rpx,
|
||||
),
|
||||
// cursorColor:
|
||||
// Colors.black,
|
||||
// validator: _model
|
||||
// .textControllerValidator
|
||||
// .asValidator(context),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius
|
||||
.circular(
|
||||
8),
|
||||
),
|
||||
focusedBorder:
|
||||
UnderlineInputBorder(
|
||||
borderSide:
|
||||
const BorderSide(
|
||||
color: Color(
|
||||
0x00000000),
|
||||
width: 2,
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius
|
||||
.circular(
|
||||
8),
|
||||
),
|
||||
errorBorder:
|
||||
UnderlineInputBorder(
|
||||
borderSide:
|
||||
const BorderSide(
|
||||
color: Color(
|
||||
0x00000000),
|
||||
width: 2,
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius
|
||||
.circular(
|
||||
8),
|
||||
),
|
||||
focusedErrorBorder:
|
||||
UnderlineInputBorder(
|
||||
borderSide:
|
||||
const BorderSide(
|
||||
color: Color(
|
||||
0x00000000),
|
||||
width: 2,
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius
|
||||
.circular(
|
||||
8),
|
||||
),
|
||||
),
|
||||
style: TextStyle(
|
||||
fontFamily:
|
||||
'Readex Pro',
|
||||
letterSpacing:
|
||||
0,
|
||||
color: Colors
|
||||
.black,
|
||||
fontSize:
|
||||
26.rpx,
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -740,158 +749,6 @@ class EditAddressPage extends GetView<AddressController>
|
||||
],
|
||||
),
|
||||
),
|
||||
// Expanded(
|
||||
// child: InkWell(
|
||||
// onTap: () {
|
||||
// CityPicker.show(
|
||||
// context:
|
||||
// context,
|
||||
// cityPickerListener:
|
||||
// this,
|
||||
// // 在大屏/Web 上最大宽度为 600px
|
||||
// // 移除内边距
|
||||
// );
|
||||
// },
|
||||
// child: Container(
|
||||
// width: 100,
|
||||
// height: 100,
|
||||
// decoration:
|
||||
// BoxDecoration(
|
||||
// color: const Color(
|
||||
// 0xFFF3F5F6),
|
||||
// borderRadius:
|
||||
// BorderRadius
|
||||
// .circular(
|
||||
// 8),
|
||||
// ),
|
||||
// alignment:
|
||||
// Alignment
|
||||
// .center,
|
||||
// child: Obx(() {
|
||||
// return TextFormField(
|
||||
// enabled:
|
||||
// false,
|
||||
// controller: controller.onReDraw(
|
||||
// TextEditingController(
|
||||
// text:
|
||||
// controller.model.all_address),
|
||||
// (val) {
|
||||
// val.text =
|
||||
// controller.model.all_address ??
|
||||
// "";
|
||||
// }),
|
||||
// // autofocus: true,
|
||||
// obscureText:
|
||||
// false,
|
||||
// maxLines: 1,
|
||||
// textAlignVertical:
|
||||
// TextAlignVertical
|
||||
// .center, // 垂直居中
|
||||
// decoration: InputDecoration(
|
||||
// contentPadding: EdgeInsets.symmetric(
|
||||
// vertical:
|
||||
// 25.rpx,
|
||||
// horizontal:
|
||||
// 26.rpx,
|
||||
// ),
|
||||
// labelStyle: TextStyle(
|
||||
// fontFamily:
|
||||
// 'Readex Pro',
|
||||
// letterSpacing:
|
||||
// 0,
|
||||
// ),
|
||||
// hintStyle: TextStyle(
|
||||
// fontFamily:
|
||||
// 'Readex Pro',
|
||||
// letterSpacing:
|
||||
// 0,
|
||||
// ),
|
||||
// enabledBorder: UnderlineInputBorder(
|
||||
// borderSide:
|
||||
// const BorderSide(
|
||||
// color:
|
||||
// Color(0x00000000),
|
||||
// width:
|
||||
// 2,
|
||||
// ),
|
||||
// borderRadius:
|
||||
// BorderRadius.circular(8),
|
||||
// ),
|
||||
// disabledBorder: UnderlineInputBorder(
|
||||
// borderSide:
|
||||
// const BorderSide(
|
||||
// color:
|
||||
// Color(0x00000000),
|
||||
// width:
|
||||
// 0,
|
||||
// ),
|
||||
// borderRadius:
|
||||
// BorderRadius.circular(8),
|
||||
// ),
|
||||
// focusedBorder: UnderlineInputBorder(
|
||||
// borderSide:
|
||||
// const BorderSide(
|
||||
// color:
|
||||
// Color(0x00000000),
|
||||
// width:
|
||||
// 2,
|
||||
// ),
|
||||
// borderRadius:
|
||||
// BorderRadius.circular(8),
|
||||
// ),
|
||||
// errorBorder: UnderlineInputBorder(
|
||||
// borderSide:
|
||||
// const BorderSide(
|
||||
// color:
|
||||
// Color(0x00000000),
|
||||
// width:
|
||||
// 2,
|
||||
// ),
|
||||
// borderRadius:
|
||||
// BorderRadius.circular(8),
|
||||
// ),
|
||||
// focusedErrorBorder: UnderlineInputBorder(
|
||||
// borderSide:
|
||||
// const BorderSide(
|
||||
// color:
|
||||
// Color(0x00000000),
|
||||
// width:
|
||||
// 2,
|
||||
// ),
|
||||
// borderRadius:
|
||||
// BorderRadius.circular(8),
|
||||
// ),
|
||||
// suffixIcon: Transform.rotate(
|
||||
// angle:
|
||||
// 1.5708, // 90 度相当于 pi / 2 弧度
|
||||
// child:
|
||||
// Icon(
|
||||
// Icons.arrow_forward_ios,
|
||||
// color:
|
||||
// Colors.black,
|
||||
// size:
|
||||
// 26.rpx,
|
||||
// ),
|
||||
// )),
|
||||
// style:
|
||||
// TextStyle(
|
||||
// fontFamily:
|
||||
// 'Readex Pro',
|
||||
// letterSpacing:
|
||||
// 0,
|
||||
// color: Color(
|
||||
// 0xFF333333),
|
||||
// fontSize:
|
||||
// 26.rpx,
|
||||
// overflow:
|
||||
// TextOverflow
|
||||
// .ellipsis,
|
||||
// ),
|
||||
// );
|
||||
// })),
|
||||
|
||||
// ),
|
||||
// ),
|
||||
Expanded(
|
||||
child: InkWell(
|
||||
onTap: () {
|
||||
@@ -1087,7 +944,7 @@ class EditAddressPage extends GetView<AddressController>
|
||||
vertical:
|
||||
10.rpx,
|
||||
horizontal:
|
||||
26.rpx,
|
||||
35.rpx,
|
||||
),
|
||||
labelStyle:
|
||||
TextStyle(
|
||||
@@ -1163,6 +1020,9 @@ class EditAddressPage extends GetView<AddressController>
|
||||
fontSize:
|
||||
26.rpx,
|
||||
),
|
||||
// cursorColor:
|
||||
// Colors
|
||||
// .black,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -22,8 +22,10 @@ class MessageDetailPage extends StatefulWidget {
|
||||
class _MessageDetailPageState extends State<MessageDetailPage> {
|
||||
MHDeviceShareController controller = Get.find();
|
||||
MhMessageController messageController = Get.find();
|
||||
RxInt status = 0.obs;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
status.value = widget.data['status'];
|
||||
var messageInfo = widget.data;
|
||||
return LayoutBuilder(
|
||||
builder: (context, boxConstraints) => GestureDetector(
|
||||
@@ -171,34 +173,32 @@ class _MessageDetailPageState extends State<MessageDetailPage> {
|
||||
),
|
||||
width: double.infinity,
|
||||
child: TextButton(
|
||||
onPressed: () async {
|
||||
if (widget.data['status'] == 1) {
|
||||
ApiResponse apiResponse =
|
||||
await controller.confirmShare(widget.data['data']['shareCode']);
|
||||
if (apiResponse.code == HttpStatusCodes.ok) {
|
||||
TopSlideNotification.show(context,
|
||||
text: apiResponse.msg!, textColor: Color(0xFF00C1AA));
|
||||
messageController.getMessageList();
|
||||
messageController.updateAll();
|
||||
} else {
|
||||
TopSlideNotification.show(context,
|
||||
text: apiResponse.msg!, textColor: Color(0XFFFF7159));
|
||||
messageController.getMessageList();
|
||||
messageController.updateAll();
|
||||
onPressed: () async {
|
||||
if (widget.data['status'] == 1) {
|
||||
ApiResponse apiResponse = await controller
|
||||
.confirmShare(widget.data['data']['shareCode']);
|
||||
if (apiResponse.code == HttpStatusCodes.ok) {
|
||||
TopSlideNotification.show(context,
|
||||
text: apiResponse.msg!, textColor: Color(0xFF00C1AA));
|
||||
messageController.getMessageList();
|
||||
messageController.updateAll();
|
||||
} else {
|
||||
TopSlideNotification.show(context,
|
||||
text: apiResponse.msg!, textColor: Color(0XFFFF7159));
|
||||
messageController.getMessageList();
|
||||
messageController.updateAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
child: Text(
|
||||
getStatusText(widget.data['status']),
|
||||
style: TextStyle(
|
||||
fontFamily: 'Readex Pro',
|
||||
color:
|
||||
widget.data['status'] == 1 ? Colors.white : Color(0xFF929699),
|
||||
fontSize: 26.rpx,
|
||||
letterSpacing: 0,
|
||||
),
|
||||
),
|
||||
),
|
||||
},
|
||||
child: Obx(() => Text(
|
||||
getStatusText(status.value),
|
||||
style: TextStyle(
|
||||
fontFamily: 'Readex Pro',
|
||||
color: status.value == 1 ? Colors.white : Color(0xFF929699),
|
||||
fontSize: 26.rpx,
|
||||
letterSpacing: 0,
|
||||
),
|
||||
))),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ class RepairHistoryWidget extends GetView<RepairInfoController> {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
repairListController.model.repairList[index]['device']
|
||||
repairListController.model.repairList[index]['device'][0]
|
||||
['mac'] ??
|
||||
'',
|
||||
style: TextStyle(
|
||||
|
||||
@@ -1430,7 +1430,7 @@ class MHTLoginPage extends GetView<MHTLoginController> {
|
||||
'Readex Pro',
|
||||
color:
|
||||
Colors.white,
|
||||
fontSize: 12,
|
||||
fontSize: 23.rpx,
|
||||
letterSpacing: 0,
|
||||
),
|
||||
),
|
||||
@@ -1458,7 +1458,7 @@ class MHTLoginPage extends GetView<MHTLoginController> {
|
||||
color:
|
||||
stringToColor(
|
||||
"FF9F66"),
|
||||
fontSize: 12,
|
||||
fontSize: 23.rpx,
|
||||
letterSpacing:
|
||||
0,
|
||||
),
|
||||
@@ -1476,7 +1476,7 @@ class MHTLoginPage extends GetView<MHTLoginController> {
|
||||
'Readex Pro',
|
||||
color:
|
||||
Colors.white,
|
||||
fontSize: 12,
|
||||
fontSize: 23.rpx,
|
||||
letterSpacing: 0,
|
||||
),
|
||||
),
|
||||
@@ -1504,7 +1504,7 @@ class MHTLoginPage extends GetView<MHTLoginController> {
|
||||
color:
|
||||
stringToColor(
|
||||
"FF9F66"),
|
||||
fontSize: 12,
|
||||
fontSize: 23.rpx,
|
||||
letterSpacing:
|
||||
0,
|
||||
),
|
||||
|
||||
@@ -886,8 +886,6 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
|
||||
final today = DateTime(now.year, now.month, now.day);
|
||||
DateTime targetDate = selectedDate;
|
||||
|
||||
|
||||
|
||||
if (type == 1) {
|
||||
final nextDate = selectedDate.add(const Duration(days: 1));
|
||||
if (!nextDate.isAfter(today)) {
|
||||
@@ -1085,6 +1083,7 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
|
||||
type: sleepReportController.model.type,
|
||||
timestamp: selectedDate.millisecondsSinceEpoch,
|
||||
context: context,
|
||||
mac: widget.data['mac'],
|
||||
onDateSelected: (newDate) {
|
||||
sleepReportController.selectedDate.value = newDate;
|
||||
calendarController.selectedDate.value = newDate;
|
||||
@@ -1121,9 +1120,9 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
|
||||
},
|
||||
);
|
||||
},
|
||||
child: SizedBox(
|
||||
width: 28.rpx,
|
||||
height: 28.rpx,
|
||||
child: Container(
|
||||
width: 36.rpx,
|
||||
height: 36.rpx,
|
||||
child: SvgPicture.asset(
|
||||
'assets/img/icon/calendar.svg',
|
||||
fit: BoxFit.cover,
|
||||
|
||||
Reference in New Issue
Block a user