diff --git a/assets/fonts/flymeFont.ttf b/assets/fonts/flymeFont.ttf new file mode 100644 index 0000000..55911ff Binary files /dev/null and b/assets/fonts/flymeFont.ttf differ diff --git a/lib/main.dart b/lib/main.dart index 6d2e6f1..73a82d7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,7 +5,6 @@ import 'services/saf_storage_service.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); - // 🟢 初始化 SAF 服务 await SafStorageService().init(); runApp(const MyApp()); @@ -19,9 +18,47 @@ class MyApp extends StatelessWidget { return MaterialApp( title: '电池健康度', theme: ThemeData( + // 🟢 中文用 HarmonyOS Sans SC fontFamily: 'HarmonyOS_Sans_SC', - colorScheme: ColorScheme.fromSeed( - seedColor: const Color.fromARGB(255, 255, 255, 255), + // 🟢 数字回退到 FlymeFont + fontFamilyFallback: const ['Flyme'], + // 🟢 统一文字颜色为黑色 + colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFFFFFFFF)) + .copyWith( + onSurface: Colors.black, // 主要文字颜色 + onBackground: Colors.black, + ), + textTheme: const TextTheme( + // 大标题/数字(健康度、容量等) + displayMedium: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + fontFamilyFallback: ['Flyme'], + color: Colors.black, + ), + // 标题(如“容量百分比变动趋势”) + headlineMedium: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + fontFamilyFallback: ['Flyme'], + color: Colors.black, + ), + // 正文(电压、温度、循环次数等) + bodyMedium: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + fontFamilyFallback: ['Flyme'], + color: Colors.black, + ), + // 小字(日期、辅助信息) + bodySmall: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + fontFamilyFallback: ['Flyme'], + color: Colors.black87, + ), + // 数字专用(大号数字,如健康度百分比) + displayLarge: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + fontFamilyFallback: ['Flyme'], + color: Colors.black, + ), ), useMaterial3: true, ), diff --git a/lib/widgets/battery_info_panel.dart b/lib/widgets/battery_info_panel.dart index aee9898..922fbd4 100644 --- a/lib/widgets/battery_info_panel.dart +++ b/lib/widgets/battery_info_panel.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -/// 电池信息面板(电压 + 温度 + 极值) class BatteryInfoPanel extends StatelessWidget { final double batteryVolt; final double batteryTemp; @@ -37,21 +36,67 @@ class BatteryInfoPanel extends StatelessWidget { const SizedBox(height: 8), Row( children: [ - Text( - '↑ ${maxVolt.toStringAsFixed(3)}V', - style: const TextStyle( - color: Colors.red, - fontSize: 14, - fontWeight: FontWeight.w500, + RichText( + text: TextSpan( + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + ), + children: [ + const TextSpan( + text: '↑ ', + style: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + color: Colors.red, + ), + ), + TextSpan( + text: maxVolt.toStringAsFixed(3), + style: const TextStyle( + fontFamily: 'Flyme', // 🟢 数字用 Flyme + color: Colors.red, + ), + ), + const TextSpan( + text: 'V', + style: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + color: Colors.red, + ), + ), + ], ), ), const SizedBox(width: 12), - Text( - '↓ ${minVolt.toStringAsFixed(3)}V', - style: const TextStyle( - color: Colors.blue, - fontSize: 14, - fontWeight: FontWeight.w500, + RichText( + text: TextSpan( + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + ), + children: [ + const TextSpan( + text: '↓ ', + style: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + color: Colors.blue, + ), + ), + TextSpan( + text: minVolt.toStringAsFixed(3), + style: const TextStyle( + fontFamily: 'Flyme', // 🟢 数字用 Flyme + color: Colors.blue, + ), + ), + const TextSpan( + text: 'V', + style: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + color: Colors.blue, + ), + ), + ], ), ), ], @@ -71,21 +116,67 @@ class BatteryInfoPanel extends StatelessWidget { const SizedBox(height: 8), Row( children: [ - Text( - '↑ ${maxTemp.toStringAsFixed(0)}°C', - style: const TextStyle( - color: Colors.red, - fontSize: 14, - fontWeight: FontWeight.w500, + RichText( + text: TextSpan( + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + ), + children: [ + const TextSpan( + text: '↑ ', + style: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + color: Colors.red, + ), + ), + TextSpan( + text: maxTemp.toStringAsFixed(0), + style: const TextStyle( + fontFamily: 'Flyme', // 🟢 数字用 Flyme + color: Colors.red, + ), + ), + const TextSpan( + text: '°C', + style: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + color: Colors.red, + ), + ), + ], ), ), const SizedBox(width: 12), - Text( - '↓ ${minTemp.toStringAsFixed(0)}°C', - style: const TextStyle( - color: Colors.blue, - fontSize: 14, - fontWeight: FontWeight.w500, + RichText( + text: TextSpan( + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + ), + children: [ + const TextSpan( + text: '↓ ', + style: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + color: Colors.blue, + ), + ), + TextSpan( + text: minTemp.toStringAsFixed(0), + style: const TextStyle( + fontFamily: 'Flyme', // 🟢 数字用 Flyme + color: Colors.blue, + ), + ), + const TextSpan( + text: '°C', + style: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + color: Colors.blue, + ), + ), + ], ), ), ], @@ -123,11 +214,22 @@ class BatteryInfoPanel extends StatelessWidget { children: [ icon, const SizedBox(width: 6), - Text(label, style: const TextStyle(fontSize: 14, color: Colors.grey)), + Text( + label, + style: const TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + fontSize: 14, + color: Colors.grey, + ), + ), const SizedBox(width: 6), Text( value, - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w500), + style: const TextStyle( + fontFamily: 'Flyme', // 🟢 数字(含单位)用 Flyme + fontSize: 16, + fontWeight: FontWeight.w500, + ), ), ], ); diff --git a/lib/widgets/battery_summary.dart b/lib/widgets/battery_summary.dart index 51c4565..cc41f22 100644 --- a/lib/widgets/battery_summary.dart +++ b/lib/widgets/battery_summary.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; -/// 电池健康度摘要组件(健康度 + cycles + mAh) class BatterySummary extends StatelessWidget { final double healthPercent; final int cycleCount; @@ -28,6 +27,7 @@ class BatterySummary extends StatelessWidget { Text( healthPercent.toStringAsFixed(1), style: TextStyle( + fontFamily: 'Flyme', fontSize: 40, fontWeight: FontWeight.w500, height: 1.0, @@ -38,6 +38,7 @@ class BatterySummary extends StatelessWidget { Text( '%', style: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', fontSize: 20, fontWeight: FontWeight.w300, height: 1.0, @@ -51,47 +52,73 @@ class BatterySummary extends StatelessWidget { Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ - Text( - '$cycleCount cycles', // ✅ 修正:去掉下划线,使用 cycleCount - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - height: 1.2, + RichText( + text: TextSpan( + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + height: 1.2, + color: Colors.black, + ), + children: [ + TextSpan( + text: '$cycleCount', + style: const TextStyle( + fontFamily: 'Flyme', + color: Colors.black, + ), + ), + const TextSpan( + text: ' cycles', + style: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + color: Colors.black, + ), + ), + ], ), ), const SizedBox(height: 4), - Text.rich( - TextSpan( + RichText( + text: TextSpan( + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w300, + height: 1.0, + color: Colors.black, + ), children: [ TextSpan( text: currentCap.toStringAsFixed(0), style: const TextStyle( - fontSize: 20, - fontWeight: FontWeight.w300, + fontFamily: 'Flyme', + color: Colors.black, ), ), TextSpan( text: ' / ', style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w300, + fontFamily: 'HarmonyOS_Sans_SC', color: Colors.grey.shade500, ), ), + // 🟢 设计容量数字用 Flyme,单位用 Harmony TextSpan( - text: '${designCap}mAh', + text: designCap.toString(), style: const TextStyle( - fontSize: 20, - fontWeight: FontWeight.w300, + fontFamily: 'Flyme', + color: Colors.black, + ), + ), + TextSpan( + text: 'mAh', + style: const TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + color: Colors.black, ), ), ], ), - style: const TextStyle( - fontSize: 20, - fontWeight: FontWeight.w300, - height: 1.0, - ), ), ], ), diff --git a/lib/widgets/charge_detail_page.dart b/lib/widgets/charge_detail_page.dart index fea56db..610be3a 100644 --- a/lib/widgets/charge_detail_page.dart +++ b/lib/widgets/charge_detail_page.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import '../utils/charge_utils.dart'; -/// 充电详情页 class ChargeDetailPage extends StatelessWidget { final String chargeType; final bool isWireless; @@ -12,14 +11,14 @@ class ChargeDetailPage extends StatelessWidget { final int? wiredLevel; const ChargeDetailPage({ - super.key, + Key? key, required this.chargeType, required this.isWireless, required this.power, required this.volt, required this.curr, this.wiredLevel, - }); + }) : super(key: key); String _getProtocolDisplay() { if (isWireless) return '无线充电($chargeType)'; @@ -43,9 +42,8 @@ class ChargeDetailPage extends StatelessWidget { @override Widget build(BuildContext context) { return AnnotatedRegion( - // 🟢 1.5.0 与主界面统一状态栏样式 value: const SystemUiOverlayStyle( - statusBarColor: Color.fromRGBO(157, 212, 237, 0.5), + statusBarColor: Color.fromRGBO(157, 212, 237, 0.1), statusBarIconBrightness: Brightness.dark, statusBarBrightness: Brightness.dark, ), @@ -53,7 +51,7 @@ class ChargeDetailPage extends StatelessWidget { backgroundColor: Colors.white, appBar: AppBar( title: const Text('充电详情'), - backgroundColor: Colors.white, // 🟢 与主界面统一 + backgroundColor: Colors.white, elevation: 0, scrolledUnderElevation: 0, shadowColor: Colors.transparent, @@ -66,38 +64,36 @@ class ChargeDetailPage extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - _buildDetailRow('协议', _getProtocolDisplay()), + _buildTextRow('协议', _getProtocolDisplay()), const Divider(), - // 有线充电:标定档位 + 实际功率 if (!isWireless) ...[ - _buildDetailRow('标定档位', _getRequestedDisplay()), + _buildTextRow('标定档位', _getRequestedDisplay()), const Divider(), - _buildDetailRow('实际功率', _getActualDisplay()), + _buildTextRow('实际功率', _getActualDisplay()), const Divider(), ] else ...[ - _buildDetailRow( - '功率', - ChargeUtils.getDisplayPowerWireless(power), - ), + _buildTextRow('功率', ChargeUtils.getDisplayPowerWireless(power)), const Divider(), ], - _buildDetailRow('电压', '${volt.toStringAsFixed(2)}V'), + _buildDetailRow('电压', volt, 'V'), const Divider(), - _buildDetailRow('电流', '${curr.toStringAsFixed(2)}A'), + _buildDetailRow('电流', curr, 'A'), const Divider(), - // 辅助信息 - if (isWireless) _buildDetailRow('类型', '无线'), - if (!isWireless && wiredLevel == null) - _buildDetailRow('档位', '自动'), + if (isWireless) _buildTextRow('类型', '无线'), + if (!isWireless && wiredLevel == null) _buildTextRow('档位', '自动'), const Spacer(), Center( child: Text( '数据来自 BMS 实时日志', - style: TextStyle(fontSize: 12, color: Colors.grey.shade500), + style: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + fontSize: 12, + color: Colors.grey.shade500, + ), ), ), ], @@ -107,7 +103,8 @@ class ChargeDetailPage extends StatelessWidget { ); } - Widget _buildDetailRow(String label, String value) { + /// 纯文本行(协议、功率、档位等) + Widget _buildTextRow(String label, String value) { return Padding( padding: const EdgeInsets.symmetric(vertical: 6.0), child: Row( @@ -116,6 +113,7 @@ class ChargeDetailPage extends StatelessWidget { Text( label, style: const TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', fontSize: 16, fontWeight: FontWeight.w400, color: Colors.grey, @@ -124,6 +122,7 @@ class ChargeDetailPage extends StatelessWidget { Text( value, style: const TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', // 复杂字符串保持 Harmony fontSize: 16, fontWeight: FontWeight.w500, color: Colors.black87, @@ -133,4 +132,44 @@ class ChargeDetailPage extends StatelessWidget { ), ); } + + /// 数值行(电压/电流,数字用 Flyme,单位用 Harmony) + Widget _buildDetailRow(String label, double value, String unit) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 6.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + label, + style: const TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + fontSize: 16, + fontWeight: FontWeight.w400, + color: Colors.grey, + ), + ), + RichText( + text: TextSpan( + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Colors.black87, + ), + children: [ + TextSpan( + text: value.toStringAsFixed(2), + style: const TextStyle(fontFamily: 'Flyme'), // 🟢 数字用 Flyme + ), + TextSpan( + text: unit, + style: const TextStyle(fontFamily: 'HarmonyOS_Sans_SC'), + ), + ], + ), + ), + ], + ), + ); + } } diff --git a/lib/widgets/charge_entry.dart b/lib/widgets/charge_entry.dart index 263b58e..56ccd8d 100644 --- a/lib/widgets/charge_entry.dart +++ b/lib/widgets/charge_entry.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; -/// 充电入口行(显示充电状态 + 点击进入详情) class ChargeEntry extends StatelessWidget { final String summary; final bool isCharging; @@ -23,6 +22,7 @@ class ChargeEntry extends StatelessWidget { Text( summary, style: const TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', // 🟢 混合文本用 Harmony fontSize: 16, fontWeight: FontWeight.w500, color: Colors.black87, @@ -33,6 +33,7 @@ class ChargeEntry extends StatelessWidget { Text( '充电信息', style: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', fontSize: 16, fontWeight: FontWeight.w500, color: Colors.grey.shade700, @@ -42,6 +43,7 @@ class ChargeEntry extends StatelessWidget { Text( '>', style: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', fontSize: 16, fontWeight: FontWeight.w500, color: Colors.grey.shade700, diff --git a/lib/widgets/trend_chart.dart b/lib/widgets/trend_chart.dart index 9139359..cf099a6 100644 --- a/lib/widgets/trend_chart.dart +++ b/lib/widgets/trend_chart.dart @@ -50,7 +50,11 @@ class TrendChart extends StatelessWidget { children: [ const Text( '容量百分比变动趋势(近15天)', - style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500), + style: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + fontSize: 16, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 8), Row( @@ -64,6 +68,7 @@ class TrendChart extends StatelessWidget { Text( '100', style: TextStyle( + fontFamily: 'Flyme', fontSize: 10, color: Colors.grey, height: 1.0, @@ -72,6 +77,7 @@ class TrendChart extends StatelessWidget { Text( '70', style: TextStyle( + fontFamily: 'Flyme', fontSize: 10, color: Colors.grey, height: 1.0, @@ -139,6 +145,7 @@ class TrendChart extends StatelessWidget { child: Text( sevenDaysAgoDate, style: const TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', fontSize: 9, color: Colors.grey, height: 1.0, @@ -152,6 +159,7 @@ class TrendChart extends StatelessWidget { child: Text( todayDate, style: const TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', fontSize: 9, color: Colors.black, height: 1.0, @@ -172,7 +180,11 @@ class TrendChart extends StatelessWidget { padding: EdgeInsets.only(top: 8.0), child: Text( '暂无历史数据,请点击刷新按钮更新', - style: TextStyle(fontSize: 12, color: Colors.grey), + style: TextStyle( + fontFamily: 'HarmonyOS_Sans_SC', + fontSize: 12, + color: Colors.grey, + ), ), ), ], diff --git a/pubspec.yaml b/pubspec.yaml index f754e59..a7922eb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -75,6 +75,9 @@ flutter: weight: 400 - asset: assets/fonts/HarmonyOS_Sans_SC_Medium.ttf weight: 500 + - family: Flyme + fonts: + - asset: assets/fonts/flymeFont.ttf assets: - assets/icons/