更新日历样式
This commit is contained in:
@@ -95,6 +95,8 @@ class WeatherModelController extends GetControllerEx<WeatherModel> {
|
||||
// 调用获取天气方法
|
||||
_getCurrentWeather();
|
||||
} catch (e) {
|
||||
|
||||
|
||||
print(e);
|
||||
EasyDartModule.logger.error("获取位置失败: $e");
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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),
|
||||
);
|
||||
}
|
||||
// 若已满,不绘制灰色段、也不显示文字(不做任何处理)
|
||||
|
||||
@@ -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'],
|
||||
|
||||
@@ -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
|
||||
),
|
||||
),
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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'],
|
||||
),
|
||||
|
||||
@@ -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: [
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user