睡眠报告多次点击查询 显示bug
This commit is contained in:
@@ -77,7 +77,7 @@ Widget MonthDataWidget(
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
tips: buildValueTexts(sleepReport['scoreList']['data'], '分'.tr, 1),
|
tips: buildValueTexts(sleepReport['scoreList']['data'], null, 1),
|
||||||
xCount: buildMonthlyChartData(sleepReport['scoreList'])['daysInMonth']
|
xCount: buildMonthlyChartData(sleepReport['scoreList'])['daysInMonth']
|
||||||
.toInt(),
|
.toInt(),
|
||||||
yCount: sleepReport['scoreList']['yLable'].length,
|
yCount: sleepReport['scoreList']['yLable'].length,
|
||||||
@@ -547,27 +547,59 @@ Widget MonthDataWidget(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// List<String> buildValueTexts(
|
||||||
|
// List<dynamic> data,
|
||||||
|
// String? unit,
|
||||||
|
// int direction, // 0 表示左侧,1 表示右侧
|
||||||
|
// ) {
|
||||||
|
// if (data.isEmpty) return [];
|
||||||
|
|
||||||
|
// return data
|
||||||
|
// .where((item) => item.containsKey('value') && item.containsKey('st'))
|
||||||
|
// .map((item) {
|
||||||
|
// final val = item['value'].toString();
|
||||||
|
|
||||||
|
// // 单位位置
|
||||||
|
// final prefix = direction == 1 ? '' : unit;
|
||||||
|
// final suffix = direction == 1 ? unit : '';
|
||||||
|
|
||||||
|
// // 中文年月日格式
|
||||||
|
// DateTime date = DateTime.fromMillisecondsSinceEpoch(item['st']);
|
||||||
|
// final dateStr = "${date.year}/${date.month}/${date.day}";
|
||||||
|
|
||||||
|
// return "$prefix$val$suffix\n$dateStr";
|
||||||
|
// }).toList();
|
||||||
|
// }
|
||||||
|
|
||||||
List<String> buildValueTexts(
|
List<String> buildValueTexts(
|
||||||
List<dynamic> data,
|
List<dynamic> data,
|
||||||
String unit,
|
String? unit,
|
||||||
int direction, // 0 表示左侧,1 表示右侧
|
int direction, // 0 左侧,1 右侧
|
||||||
) {
|
) {
|
||||||
if (data.isEmpty) return [];
|
if (data.isEmpty) return [];
|
||||||
|
|
||||||
|
final safeUnit = unit ?? ""; // 防止 null
|
||||||
|
|
||||||
return data
|
return data
|
||||||
.where((item) => item.containsKey('value') && item.containsKey('st'))
|
.where((item) =>
|
||||||
|
item is Map && item.containsKey('value') && item.containsKey('st'))
|
||||||
.map((item) {
|
.map((item) {
|
||||||
final val = item['value'].toString();
|
final val = item['value'].toString();
|
||||||
|
|
||||||
// 单位位置
|
// ✅ 如果单位为空,不拼接单位
|
||||||
final prefix = direction == 1 ? '' : unit;
|
final prefix = safeUnit.isEmpty ? '' : (direction == 0 ? safeUnit : '');
|
||||||
final suffix = direction == 1 ? unit : '';
|
final suffix = safeUnit.isEmpty ? '' : (direction == 1 ? safeUnit : '');
|
||||||
|
|
||||||
// 中文年月日格式
|
// ✅ 处理时间戳
|
||||||
DateTime date = DateTime.fromMillisecondsSinceEpoch(item['st']);
|
final ts = item['st'];
|
||||||
final dateStr = "${date.year}/${date.month}/${date.day}";
|
String dateStr = '';
|
||||||
|
if (ts != null && ts is int && ts > 0) {
|
||||||
|
final date = DateTime.fromMillisecondsSinceEpoch(ts);
|
||||||
|
// 格式化为 yyyy/MM/dd
|
||||||
|
dateStr = "${date.year}/${date.month}/${date.day}";
|
||||||
|
}
|
||||||
|
|
||||||
return "$prefix$val$suffix\n$dateStr";
|
return "$prefix$val$suffix${dateStr.isNotEmpty ? '\n$dateStr' : ''}";
|
||||||
}).toList();
|
}).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ Widget WeekDataWidget(
|
|||||||
displayMode: ChartDisplayMode.bar,
|
displayMode: ChartDisplayMode.bar,
|
||||||
barColors:
|
barColors:
|
||||||
buildWeekDatesAndPoints(sleepReport['scoreList'])['colors'],
|
buildWeekDatesAndPoints(sleepReport['scoreList'])['colors'],
|
||||||
tips: buildValueTexts(sleepReport['scoreList']['data'], '分'.tr, 1),
|
tips: buildValueTexts(sleepReport['scoreList']['data'], null, 1),
|
||||||
xUnit: sleepReport['scoreList']['yUnit'],
|
xUnit: sleepReport['scoreList']['yUnit'],
|
||||||
barWidth: 0.2,
|
barWidth: 0.2,
|
||||||
),
|
),
|
||||||
@@ -705,16 +705,31 @@ double getYPositionBySegmentedLabels(List<double> labels, double value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//关键点标签
|
//关键点标签
|
||||||
|
// List<String> buildValueTexts(
|
||||||
|
// List<dynamic> data,
|
||||||
|
// String unit,
|
||||||
|
// int direction, // 0 表示左侧,1 表示右侧
|
||||||
|
// ) {
|
||||||
|
// if (data.isEmpty) return [];
|
||||||
|
// return data.where((item) => item.containsKey('value')).map((item) {
|
||||||
|
// final val = item['value'].toString();
|
||||||
|
// return direction == 1 ? "$val$unit" : "$unit$val";
|
||||||
|
// }).toList();
|
||||||
|
// }
|
||||||
List<String> buildValueTexts(
|
List<String> buildValueTexts(
|
||||||
List<dynamic> data,
|
List<dynamic> data,
|
||||||
String unit,
|
String? unit, // ✅ unit 改为可空类型
|
||||||
int direction, // 0 表示左侧,1 表示右侧
|
int direction, // 0 表示左侧,1 表示右侧
|
||||||
) {
|
) {
|
||||||
if (data.isEmpty) return [];
|
if (data.isEmpty) return [];
|
||||||
|
|
||||||
|
final safeUnit = unit ?? ""; // ✅ 防止 null
|
||||||
|
|
||||||
return data.where((item) => item.containsKey('value')).map((item) {
|
return data.where((item) => item.containsKey('value')).map((item) {
|
||||||
final val = item['value'].toString();
|
final val = item['value'].toString();
|
||||||
return direction == 1 ? "$val$unit" : "$unit$val";
|
// ✅ 只有当 unit 不为空时才拼接
|
||||||
|
if (safeUnit.isEmpty) return val;
|
||||||
|
return direction == 1 ? "$val$safeUnit" : "$safeUnit$val";
|
||||||
}).toList();
|
}).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,17 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
super.dispose();
|
||||||
|
Future.microtask(() {
|
||||||
|
if (Get.isRegistered<SleepReportController>()) {
|
||||||
|
sleepReportController.isLoading.value = false;
|
||||||
|
sleepReportController.sleepReport.value = {};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
@@ -69,7 +80,7 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
|
|||||||
// ✅ 延迟执行赋值逻辑
|
// ✅ 延迟执行赋值逻辑
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
final selected = DateTime.fromMillisecondsSinceEpoch(widget.data['date']);
|
final selected = DateTime.fromMillisecondsSinceEpoch(widget.data['date']);
|
||||||
|
sleepReportController.isLoading.value = true;
|
||||||
calendarController.selectedDate.value = selected;
|
calendarController.selectedDate.value = selected;
|
||||||
sleepReportController.selectedDate.value = selected;
|
sleepReportController.selectedDate.value = selected;
|
||||||
|
|
||||||
@@ -111,11 +122,6 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
Future.microtask(() {
|
Future.microtask(() {
|
||||||
|
|||||||
Reference in New Issue
Block a user