import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import '../controllers/jieli_test_controller.dart'; import 'package:jieli/jieli.dart'; class JieliTestView extends GetView { const JieliTestView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { final isDarkMode = Theme.of(context).brightness == Brightness.dark; return Scaffold( backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], appBar: AppBar( backgroundColor: isDarkMode ? Colors.black : Colors.white, elevation: 0.5, title: Text( '杰理蓝牙测试', style: TextStyle( fontSize: 17.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, ), ), centerTitle: true, leading: IconButton( icon: Icon( Icons.arrow_back_ios, color: isDarkMode ? Colors.white : Colors.black, size: 20.sp, ), onPressed: () => Get.back(), ), ), body: Padding( padding: EdgeInsets.all(16.w), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ _buildStatusCard(isDarkMode), SizedBox(height: 16.h), _buildActionButtons(isDarkMode), SizedBox(height: 16.h), _buildDeviceInfo(isDarkMode), SizedBox(height: 16.h), _buildDevicesList(isDarkMode), ], ), ), ); } Widget _buildStatusCard(bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( color: isDarkMode ? Colors.grey[900] : Colors.white, borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.05), blurRadius: 10, offset: const Offset(0, 2), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Text( '连接状态: ', style: TextStyle( fontSize: 14.sp, color: isDarkMode ? Colors.white : Colors.black87, ), ), Obx(() => Text( controller.connectStatus.value, style: TextStyle( fontSize: 14.sp, fontWeight: FontWeight.bold, color: _getStatusColor(controller.connectStatus.value), ), )), ], ), SizedBox(height: 8.h), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Obx(() => _buildStatusChip( label: '唤醒信号', isActive: controller.wakeupReceived.value, activeColor: Colors.orange, isDarkMode: isDarkMode, )), Obx(() => _buildStatusChip( label: '音频数据', isActive: controller.audioDataReceiving.value, activeColor: Colors.green, isDarkMode: isDarkMode, )), ], ), SizedBox(height: 8.h), Obx(() => controller.audioDataReceiving.value ? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '音频数据统计:', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), ), SizedBox(height: 4.h), Text( '已接收 ${(controller.audioDataSize.value / 1024).toStringAsFixed(2)} KB', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), ), Text( '共 ${controller.receivedFrames.value} 帧', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), ), ], ) : SizedBox.shrink() ), ], ), ); } Widget _buildStatusChip({ required String label, required bool isActive, required Color activeColor, required bool isDarkMode, }) { return Container( padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h), decoration: BoxDecoration( color: isActive ? activeColor : (isDarkMode ? Colors.grey[800] : Colors.grey[200]), borderRadius: BorderRadius.circular(16.r), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Container( width: 8.w, height: 8.w, decoration: BoxDecoration( color: isActive ? Colors.white : Colors.grey, shape: BoxShape.circle, ), ), SizedBox(width: 6.w), Text( label, style: TextStyle( fontSize: 12.sp, color: isActive ? Colors.white : (isDarkMode ? Colors.white70 : Colors.black54), fontWeight: isActive ? FontWeight.bold : FontWeight.normal, ), ), ], ), ); } Widget _buildActionButtons(bool isDarkMode) { return Column( children: [ Row( children: [ Expanded( child: Obx(() => ElevatedButton.icon( onPressed: controller.isScanning.value ? controller.stopScan : controller.startScan, icon: Icon( controller.isScanning.value ? Icons.stop : Icons.bluetooth_searching, size: 18.sp, ), label: Text( controller.isScanning.value ? '停止扫描' : '扫描设备', style: TextStyle(fontSize: 14.sp), ), style: ElevatedButton.styleFrom( backgroundColor: controller.isScanning.value ? Colors.red[600] : Colors.blue[600], padding: EdgeInsets.symmetric(vertical: 12.h), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8.r), ), ), )), ), ], ), SizedBox(height: 8.h), Row( children: [ Expanded( child: ElevatedButton.icon( onPressed: controller.sendStartRecordingCommand, icon: Icon( Icons.mic, size: 18.sp, ), label: Text( '开始录音', style: TextStyle(fontSize: 14.sp), ), style: ElevatedButton.styleFrom( backgroundColor: Colors.green[600], padding: EdgeInsets.symmetric(vertical: 12.h), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8.r), ), ), ), ), SizedBox(width: 8.w), Expanded( child: ElevatedButton.icon( onPressed: controller.sendStopRecordingCommand, icon: Icon( Icons.stop_circle, size: 18.sp, ), label: Text( '停止录音', style: TextStyle(fontSize: 14.sp), ), style: ElevatedButton.styleFrom( backgroundColor: Colors.red[600], padding: EdgeInsets.symmetric(vertical: 12.h), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8.r), ), ), ), ), ], ), ], ); } Widget _buildDeviceInfo(bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( color: isDarkMode ? Colors.grey[900] : Colors.white, borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.05), blurRadius: 10, offset: const Offset(0, 2), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '设备信息:', style: TextStyle( fontSize: 14.sp, color: isDarkMode ? Colors.white : Colors.black87, ), ), SizedBox(height: 8.h), Container( padding: EdgeInsets.all(8.w), decoration: BoxDecoration( color: isDarkMode ? Colors.black : Colors.grey[100], borderRadius: BorderRadius.circular(8.r), ), child: Obx(() => Text( controller.deviceInfo.value, style: TextStyle( fontSize: 13.sp, color: isDarkMode ? Colors.white70 : Colors.black54, height: 1.4, ), )), ), SizedBox(height: 16.h), Obx(() => controller.currentDevice.value != null ? ElevatedButton.icon( onPressed: controller.disconnectDevice, icon: Icon( Icons.bluetooth_disabled, size: 16.sp, ), label: Text( '断开连接', style: TextStyle(fontSize: 13.sp), ), style: ElevatedButton.styleFrom( backgroundColor: Colors.red[600], padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 10.h), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8.r), ), ), ) : SizedBox.shrink() ), ], ), ); } Widget _buildDevicesList(bool isDarkMode) { return Expanded( child: Container( decoration: BoxDecoration( color: isDarkMode ? Colors.grey[900] : Colors.white, borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.05), blurRadius: 10, offset: const Offset(0, 2), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.all(16.w), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( '扫描到的设备', style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black87, ), ), Obx(() => Text( '${controller.scannedDevices.length}个设备', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), )), ], ), ), Divider(height: 1, thickness: 1, color: isDarkMode ? Colors.grey[800] : Colors.grey[200]), Expanded( child: Obx(() => controller.scannedDevices.isEmpty ? Center( child: controller.isScanning.value ? Column( mainAxisAlignment: MainAxisAlignment.center, children: [ CircularProgressIndicator(), SizedBox(height: 16.h), Text( '正在扫描...', style: TextStyle( fontSize: 14.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), ), ], ) : Text( '未扫描到设备', style: TextStyle( fontSize: 14.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), ), ) : ListView.separated( padding: EdgeInsets.symmetric(vertical: 8.h), itemCount: controller.scannedDevices.length, separatorBuilder: (context, index) => Divider( height: 1, thickness: 1, color: isDarkMode ? Colors.grey[800] : Colors.grey[200], ), itemBuilder: (context, index) { final device = controller.scannedDevices[index]; return ListTile( dense: true, title: Text( device.name.isEmpty ? '未知设备' : device.name, style: TextStyle( fontSize: 14.sp, fontWeight: FontWeight.w500, color: isDarkMode ? Colors.white : Colors.black87, ), ), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '设备ID: ${device.id}', style: TextStyle( fontSize: 11.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), ), Text( 'RSSI: ${device.rssi} dBm', style: TextStyle( fontSize: 11.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), ), ], ), trailing: Obx(() => controller.currentDevice.value?.id == device.id ? Chip( label: Text( '已连接', style: TextStyle( fontSize: 12.sp, color: Colors.white, ), ), backgroundColor: Colors.green, padding: EdgeInsets.symmetric(horizontal: 8.w), ) : ElevatedButton( onPressed: () => controller.connectToDevice(device), child: Text( '连接', style: TextStyle(fontSize: 12.sp), ), style: ElevatedButton.styleFrom( backgroundColor: Colors.green[600], padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(6.r), ), ), ), ), contentPadding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.h), isThreeLine: true, ); }, ), ), ), ], ), ), ); } Color _getStatusColor(String status) { switch (status) { case '连接中...': return Colors.orange; case '已连接': return Colors.green; case '连接失败': return Colors.red; case '已断开': return Colors.grey; default: return Colors.grey; } } }