import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import '../models/data_abnormal_type.dart'; class BatteryInfoPanel extends StatelessWidget { final double batteryVolt; final double batteryTemp; final double maxVolt; final double minVolt; final double maxTemp; final double minTemp; final DataAbnormalType abnormalType; final double tempAvg; const BatteryInfoPanel({ super.key, required this.batteryVolt, required this.batteryTemp, required this.maxVolt, required this.minVolt, required this.maxTemp, required this.minTemp, this.tempAvg = 0, this.abnormalType = DataAbnormalType.none, }); @override Widget build(BuildContext context) { final bool isVoltageAbnormal = abnormalType == DataAbnormalType.voltageAbnormal; final Color voltColor = isVoltageAbnormal ? Colors.red : Colors.black; return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildInfoItem( _buildIcon('voltage'), '电压', '${batteryVolt.toStringAsFixed(3)}V', textColor: voltColor, ), const SizedBox(height: 8), Row( children: [ RichText( text: TextSpan( style: TextStyle( fontFamily: 'Flyme', fontSize: 14, fontWeight: FontWeight.w500, color: Colors.red, ), children: [ const TextSpan( text: '↑ ', style: TextStyle( fontFamily: 'HarmonyOS_Sans_SC', color: Colors.red, ), ), TextSpan( text: '${maxVolt.toStringAsFixed(3)}V', style: TextStyle( color: isVoltageAbnormal ? Colors.red : Colors.red, ), ), ], ), ), const SizedBox(width: 12), RichText( text: TextSpan( style: TextStyle( fontFamily: 'Flyme', fontSize: 14, fontWeight: FontWeight.w500, color: Colors.blue, ), children: [ const TextSpan( text: '↓ ', style: TextStyle( fontFamily: 'HarmonyOS_Sans_SC', color: Colors.blue, ), ), TextSpan( text: '${minVolt.toStringAsFixed(3)}V', style: TextStyle( color: isVoltageAbnormal ? Colors.red : Colors.blue, ), ), ], ), ), ], ), ], ), ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildInfoItem( _buildIcon('temperature'), '温度', '${batteryTemp.toStringAsFixed(0)}℃', ), const SizedBox(height: 8), // 🆕 一行显示:↑ max ↓ min [avg] avg Row( children: [ RichText( text: TextSpan( style: const TextStyle( fontFamily: 'Flyme', fontSize: 12, fontWeight: FontWeight.w500, color: Colors.red, ), children: [ const TextSpan( text: '↑ ', style: TextStyle( fontFamily: 'HarmonyOS_Sans_SC', color: Colors.red, ), ), TextSpan(text: '${maxTemp.toStringAsFixed(1)}℃'), ], ), ), const SizedBox(width: 6), RichText( text: TextSpan( style: const TextStyle( fontFamily: 'Flyme', fontSize: 12, fontWeight: FontWeight.w500, color: Colors.blue, ), children: [ const TextSpan( text: '↓ ', style: TextStyle( fontFamily: 'HarmonyOS_Sans_SC', color: Colors.blue, ), ), TextSpan(text: '${minTemp.toStringAsFixed(1)}℃'), ], ), ), const SizedBox(width: 6), _buildIcon('avg', size: 14), const SizedBox(width: 2), Text( '${tempAvg.toStringAsFixed(1)}℃', style: const TextStyle( fontFamily: 'Flyme', fontSize: 12, fontWeight: FontWeight.w500, color: Colors.grey, ), ), ], ), ], ), ), ], ); } Widget _buildIcon(String type, {double size = 18}) { switch (type) { case 'voltage': return SvgPicture.asset( 'assets/icons/si--lightning-fill.svg', width: size, height: size, colorFilter: const ColorFilter.mode(Colors.grey, BlendMode.srcIn), ); case 'temperature': return SvgPicture.asset( 'assets/icons/mdi--temperature.svg', width: size, height: size, colorFilter: const ColorFilter.mode(Colors.grey, BlendMode.srcIn), ); case 'avg': // 🆕 return SvgPicture.asset( 'assets/icons/avg.svg', width: size, height: size, colorFilter: const ColorFilter.mode(Colors.grey, BlendMode.srcIn), ); default: return Icon(Icons.help_outline, size: size, color: Colors.grey); } } Widget _buildInfoItem( Widget icon, String label, String value, { Color textColor = Colors.black, }) { return Row( children: [ icon, const SizedBox(width: 6), Text( label, style: const TextStyle( fontFamily: 'HarmonyOS_Sans_SC', fontSize: 14, color: Colors.grey, ), ), const SizedBox(width: 6), Text( value, style: TextStyle( fontFamily: 'Flyme', fontSize: 16, fontWeight: FontWeight.w500, color: textColor, ), ), ], ); } }