更新日历样式

This commit is contained in:
czz
2025-07-11 16:48:25 +08:00
parent 092267ae3a
commit de5bacb553
11 changed files with 271 additions and 89 deletions

View File

@@ -95,6 +95,8 @@ class WeatherModelController extends GetControllerEx<WeatherModel> {
// 调用获取天气方法
_getCurrentWeather();
} catch (e) {
print(e);
EasyDartModule.logger.error("获取位置失败: $e");
}

View File

@@ -271,6 +271,153 @@ Future showDateSelectionDialog(BuildContext context,
);
}
Future showMonthSelectionDialog(
BuildContext context, {
required DateTime checkDate,
Function(DateTime)? checkChange,
String title = "选择月份",
}) {
ThemeController themeController = Get.find();
final List<int> years = List.generate(100, (i) => DateTime.now().year - i)
..sort();
final List<int> months = List.generate(12, (i) => i + 1);
final RxInt yearIndex = years.indexOf(checkDate.year).obs;
final RxInt monthIndex = months.indexOf(checkDate.month).obs;
return showDialog(
context: context,
barrierDismissible: true,
builder: (BuildContext context) {
return Stack(
children: [
Positioned(
bottom: 0,
left: 0,
right: 0,
child: Material(
color: Colors.transparent,
child: Dialog(
backgroundColor: const Color(0xFF003058),
insetPadding: EdgeInsets.zero,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(0),
),
child: Container(
width: double.infinity,
padding: EdgeInsets.fromLTRB(30.rpx, 10.rpx, 30.rpx, 90.rpx),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ClickableContainer(
backgroundColor: Colors.transparent,
highlightColor: Colors.transparent,
padding: EdgeInsets.zero,
onTap: () => Navigator.of(context).pop(),
child: Container(
width: 100.rpx,
height: 60.rpx,
alignment: Alignment.center,
child: Text("取消",
style: TextStyle(
fontSize: 30.rpx, color: Colors.white)),
),
),
Text(
title,
style: TextStyle(
fontFamily: 'Readex Pro',
color: themeController.currentColor.sc3,
fontSize: 30.rpx,
),
),
ClickableContainer(
backgroundColor: Colors.transparent,
highlightColor: Colors.transparent,
padding: EdgeInsets.zero,
onTap: () {
final selectedDate = DateTime(
years[yearIndex.value],
months[monthIndex.value],
);
Navigator.of(context).pop();
checkChange?.call(selectedDate);
},
child: Container(
width: 100.rpx,
height: 60.rpx,
alignment: Alignment.center,
child: Text("确定",
style: TextStyle(
fontSize: 30.rpx,
color: stringToColor("#84F5FF"))),
),
),
],
),
SizedBox(height: 20.rpx),
Stack(
children: [
Positioned.fill(
child: IgnorePointer(
child: Center(
child: Container(
height: 90.rpx,
margin:
EdgeInsets.symmetric(horizontal: 95.rpx),
decoration: BoxDecoration(
color: const Color(0xFF84F5FF),
borderRadius: BorderRadius.circular(16.rpx),
),
),
),
),
),
SizedBox(
height: 240.rpx,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 95.rpx),
child: Row(
children: [
Expanded(
child: getOnePickers(
context,
years,
yearIndex,
unit: "",
),
),
Expanded(
child: getOnePickers(
context,
months,
monthIndex,
unit: "",
),
),
],
),
),
),
],
),
],
),
),
),
),
),
],
);
},
);
}
Future<void> showWeightPickerDialog(
BuildContext context, {
required String initialWeight, // 初始体重单位kg

View File

@@ -46,11 +46,12 @@ class LineView extends StatelessWidget {
bottom: bottomPadding.rpx,
),
child: EasyChartView(
key: Key(DateTime.now().toString()),
size: Size(b.maxWidth, 220.rpx),
drawer: ChartDrawer(
xAxis: ChartAxis(
intent: 44,
entintent: 15,
intent: 28,
entintent: 9,
labels: xLabels,
count: xCount,
),
@@ -177,7 +178,7 @@ class LineView extends StatelessWidget {
remainHeight,
Paint()
..color =
stringToColor(remainColor).withOpacity(0.8),
stringToColor(remainColor).withOpacity(0.5),
);
}
// 若已满,不绘制灰色段、也不显示文字(不做任何处理)

View File

@@ -66,9 +66,7 @@ class MHTHomeController extends GetControllerEx<MHTHomeModel> {
String queryUrl =
"${serviceAddress}${serviceName}${serviceApi}?bindNum=1";
String? language = "";
if (languageController.selectLanguage != null) {
language = languageController.selectLanguage.value!.language_code;
}
language = languageController.selectLanguage.value!.language_code;
if (language != null && language.isNotEmpty) {
if (queryUrl.contains("?")) {
queryUrl += "&lang=$language";
@@ -77,19 +75,14 @@ class MHTHomeController extends GetControllerEx<MHTHomeModel> {
}
}
var response = await EasyDartModule.dio.get(queryUrl);
if (response != null) {
var responseData =
response.data is String ? jsonDecode(response.data) : response.data;
ApiResponse res =
ApiResponse.fromJson(responseData, (object) => object);
MyUtils.formatResponse(res, "设备.设备列表请求成功".tr, "设备.设备列表请求失败".tr);
if (res.code == HttpStatusCodes.ok) {
bindDeviceNum.value = res.total!;
updateAll();
return res;
}
} else {
return ApiResponse(code: -1, msg: "服务器.失败".tr);
var responseData =
response.data is String ? jsonDecode(response.data) : response.data;
ApiResponse res = ApiResponse.fromJson(responseData, (object) => object);
MyUtils.formatResponse(res, "设备.设备列表请求成功".tr, "设备.设备列表请求失败".tr);
if (res.code == HttpStatusCodes.ok) {
bindDeviceNum.value = res.total!;
updateAll();
return res;
}
return apiResponse;
} catch (e) {
@@ -126,9 +119,7 @@ class MHTHomeController extends GetControllerEx<MHTHomeModel> {
}
String? language = "";
if (languageController.selectLanguage != null) {
language = languageController.selectLanguage.value!.language_code;
}
language = languageController.selectLanguage.value!.language_code;
if (language != null && language.isNotEmpty) {
queryParams['lang'] = language;
}
@@ -139,19 +130,14 @@ class MHTHomeController extends GetControllerEx<MHTHomeModel> {
}
var response = await EasyDartModule.dio.get(queryUrl);
if (response != null) {
var responseData =
response.data is String ? jsonDecode(response.data) : response.data;
ApiResponse res =
ApiResponse.fromJson(responseData, (object) => object);
MyUtils.formatResponse(res, "设备.设备列表请求成功".tr, "设备.设备列表请求失败".tr);
if (res.code == HttpStatusCodes.ok) {
deviceList.value = res.data!;
updateAll();
return res;
}
} else {
return ApiResponse(code: -1, msg: "服务器.失败".tr);
var responseData =
response.data is String ? jsonDecode(response.data) : response.data;
ApiResponse res = ApiResponse.fromJson(responseData, (object) => object);
MyUtils.formatResponse(res, "设备.设备列表请求成功".tr, "设备.设备列表请求失败".tr);
if (res.code == HttpStatusCodes.ok) {
deviceList.value = res.data!;
updateAll();
return res;
}
return apiResponse;
} catch (e) {
@@ -365,7 +351,7 @@ class MHTHomeController extends GetControllerEx<MHTHomeModel> {
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.device_show;
String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
String queryUrl = "$serviceAddress$serviceName$serviceApi";
String? language = "";
if (languageController.selectLanguage != null) {
language = languageController.selectLanguage.value!.language_code;
@@ -568,7 +554,7 @@ class MHTHomeController extends GetControllerEx<MHTHomeModel> {
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.user_setting;
String type = "control_${tmp['mac']}";
String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
String queryUrl = "$serviceAddress$serviceName$serviceApi";
var data = {
"type": type,
"duration": tmp['duration'],

View File

@@ -53,11 +53,12 @@ class _DataShowWidgetState extends State<DataShowWidget> {
width: MediaQuery.sizeOf(context).width * 0.35, // 固定宽度
decoration: BoxDecoration(),
child: Align(
alignment: widget.alignment == MainAxisAlignment.start
? Alignment.centerLeft
: widget.alignment == MainAxisAlignment.center
? Alignment.center
: Alignment.centerRight, // 根据传入的 alignment 设置对齐
alignment: Alignment.centerLeft,
// widget.alignment == MainAxisAlignment.start
// ? Alignment.centerLeft
// : widget.alignment == MainAxisAlignment.center
// ? Alignment.center
// : Alignment.centerRight, // 根据传入的 alignment 设置对齐
child: widget.widget1, // 显示传入的 widget1
),
),

View File

@@ -89,7 +89,7 @@ class SegmentedCircleWithCenterWidget extends StatelessWidget {
centerWidget, // 放置自定义的中心 Widget
Positioned(
bottom: 140.rpx,
right: 60.rpx, // 放置在右侧
right: 50.rpx, // 放置在右侧
child: SvgPicture.asset(
_getTrendIcon(trend),
width: trend != 0 ? 14.rpx : 18.rpx,

View File

@@ -123,7 +123,7 @@ class _SleepScoreWidgetState extends State<SleepScoreWidget> {
// SegmentData(color: Colors.orange, value: 10),
// ],
segments: segments,
strokeWidth: 6.rpx,
strokeWidth: 12.rpx,
gapAngle: 8,
centerWidget: Container(
child: Column(

View File

@@ -96,7 +96,7 @@ Widget WeekDataWidget(
buildWeekDatesAndPoints(sleepReport['scoreList'])['colors'],
tips: buildValueTexts(sleepReport['scoreList']['data'], '', 1),
xUnit: sleepReport['scoreList']['yUnit'],
barWidth: 0.1,
barWidth: 0.2,
),
showLabel: sleepReport['scoreList']['type'],
),
@@ -193,7 +193,7 @@ Widget WeekDataWidget(
offset,
textAlign: TextAlign.center,
style: TextStyle(
color: Color(0xFFFFFFFF).withOpacity(0.06),
color: Color(0xFFFFFFFF).withOpacity(0.6),
fontSize: 18.rpx),
);
},
@@ -206,7 +206,7 @@ Widget WeekDataWidget(
displayMode: ChartDisplayMode.dualBar,
xUnit: sleepReport['csd']['yUnit'],
tips: buildSleepValueTexts(sleepReport['csd']['data'], '小时', 1),
barWidth: 0.1,
barWidth: 0.2,
),
showLabel: sleepReport['csd']['type'],
),

View File

@@ -103,7 +103,7 @@ class AvgSleepScoreWidget extends StatelessWidget {
height: 256.rpx,
child: SegmentedCircleWithCenterWidget(
segments: segments,
strokeWidth: 6.rpx,
strokeWidth: 12.rpx,
gapAngle: 0,
centerWidget: Column(
mainAxisAlignment: MainAxisAlignment.center,
@@ -136,7 +136,7 @@ class AvgSleepScoreWidget extends StatelessWidget {
runSpacing: 20.rpx,
children: showLabel.map<Widget>((item) {
return Container(
padding: EdgeInsets.all(5),
padding: EdgeInsets.all(5.rpx),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [

View File

@@ -1032,7 +1032,7 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
),
),
Padding(
padding: EdgeInsets.symmetric(horizontal: 26.rpx),
padding: EdgeInsets.symmetric(horizontal: 20.rpx),
child: Text(
displayText,
style: TextStyle(
@@ -1079,46 +1079,91 @@ class _NewSleepReportPageState extends State<NewSleepReportPage> {
padding: EdgeInsets.zero,
borderRadius: 8,
onTap: () {
showSleepCalendarBottomSheet(
type: sleepReportController.model.type,
timestamp: selectedDate.millisecondsSinceEpoch,
context: context,
mac: widget.data['mac'],
onDateSelected: (newDate) {
sleepReportController.selectedDate.value = newDate;
calendarController.selectedDate.value = newDate;
String data = MyUtils.formatDate(
calendarController.selectedDate.value!);
requestWithLog(
logTitle: "查询睡眠报告",
method: MyHttpMethod.get,
queryUrl:
"https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=${data}&type=${sleepReportController.model.type}",
onSuccess: (res) {
print(res);
sleepReportController.sleepReport.value = res.data;
sleepReportController.model.type == 3
? showMonthSelectionDialog(context, checkDate: selectedDate,
checkChange: (DateTime d) {
sleepReportController.selectedDate.value = d;
calendarController.selectedDate.value = d;
String data = MyUtils.formatDate(
calendarController.selectedDate.value!);
requestWithLog(
logTitle: "查询睡眠报告",
method: MyHttpMethod.get,
queryUrl:
"https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=${data}&type=${sleepReportController.model.type}",
onSuccess: (res) {
print(res);
sleepReportController.sleepReport.value = res.data;
sleepReportController.updateAll();
},
onFailure: (res) {
if (MainPageBBottomChange.getCurrentIndex() !=
null) {
if (MainPageBBottomChange.getCurrentIndex() ==
1) {
TopSlideNotification.show(context,
text: res.msg!,
textColor:
themeController.currentColor.sc9);
}
} else {
TopSlideNotification.show(context,
text: res.msg!,
textColor: themeController.currentColor.sc9);
}
sleepReportController.sleepReport.value = {};
sleepReportController.updateAll();
print(res);
});
sleepReportController.updateAll();
calendarController.updateAll();
})
: showSleepCalendarBottomSheet(
type: sleepReportController.model.type,
timestamp: selectedDate.millisecondsSinceEpoch,
context: context,
mac: widget.data['mac'],
onDateSelected: (newDate) {
sleepReportController.selectedDate.value = newDate;
calendarController.selectedDate.value = newDate;
String data = MyUtils.formatDate(
calendarController.selectedDate.value!);
requestWithLog(
logTitle: "查询睡眠报告",
method: MyHttpMethod.get,
queryUrl:
"https://sleepdata.he-info.com/api/analysis/sleep/analysis?mac=${widget.data['mac']}&time=${data}&type=${sleepReportController.model.type}",
onSuccess: (res) {
print(res);
sleepReportController.sleepReport.value =
res.data;
sleepReportController.updateAll();
},
onFailure: (res) {
if (MainPageBBottomChange.getCurrentIndex() !=
null) {
if (MainPageBBottomChange.getCurrentIndex() ==
1) {
TopSlideNotification.show(context,
text: res.msg!,
textColor:
themeController.currentColor.sc9);
}
} else {
TopSlideNotification.show(context,
text: res.msg!,
textColor:
themeController.currentColor.sc9);
}
sleepReportController.sleepReport.value = {};
sleepReportController.updateAll();
print(res);
});
sleepReportController.updateAll();
calendarController.updateAll();
},
onFailure: (res) {
if (MainPageBBottomChange.getCurrentIndex() != null) {
if (MainPageBBottomChange.getCurrentIndex() == 1) {
TopSlideNotification.show(context,
text: res.msg!,
textColor: themeController.currentColor.sc9);
}
} else {
TopSlideNotification.show(context,
text: res.msg!,
textColor: themeController.currentColor.sc9);
}
sleepReportController.sleepReport.value = {};
sleepReportController.updateAll();
print(res);
});
sleepReportController.updateAll();
calendarController.updateAll();
},
);
);
},
child: Padding(
padding: EdgeInsets.all(10.rpx),