From fa480cd0d5e2ee3fe85660e19c7c1607463b7b1d Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sat, 16 Aug 2025 21:02:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=9D=83=E9=99=90):=20=E6=94=B9=E8=BF=9B?= =?UTF-8?q?=E8=93=9D=E7=89=99=E6=9D=83=E9=99=90=E5=A4=84=E7=90=86=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9D=83=E9=99=90=E7=BB=84=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加动态获取蓝牙权限的功能,根据平台和Android版本返回不同的权限列表。将权限组加载改为异步方式,并使用FutureBuilder优化UI加载体验。移除不必要的ListView嵌套,改为SingleChildScrollView提升性能。 --- .../permissions/models/permission_group.dart | 40 +++++++++++-- .../permissions/views/permissions_view.dart | 59 +++++++++++-------- 2 files changed, 72 insertions(+), 27 deletions(-) diff --git a/lib/modules/permissions/models/permission_group.dart b/lib/modules/permissions/models/permission_group.dart index 99a27ae43..5426a7336 100644 --- a/lib/modules/permissions/models/permission_group.dart +++ b/lib/modules/permissions/models/permission_group.dart @@ -1,5 +1,7 @@ +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; +import 'package:device_info_plus/device_info_plus.dart'; class PermissionGroup { final String titleKey; @@ -12,7 +14,37 @@ class PermissionGroup { required this.permissions, }); - static List getPlatformGroups() { + /// 获取蓝牙权限列表(根据平台和Android版本) + static Future> _getBluetoothPermissions() async { + if (Platform.isAndroid) { + try { + final deviceInfo = DeviceInfoPlugin(); + final androidInfo = await deviceInfo.androidInfo; + // Android 12+ (API 31+) 使用新的蓝牙权限 + if (androidInfo.version.sdkInt >= 31) { + return [ + Permission.bluetoothScan, + Permission.bluetoothConnect, + ]; + } + // Android 12以下不显示蓝牙权限(因为会自动授予) + return []; + } catch (e) { + print('获取Android版本信息失败: $e'); + return []; + } + } else if (Platform.isIOS) { + // iOS使用基本蓝牙权限 + return [Permission.bluetooth]; + } + return []; + } + + /// 获取平台特定的权限组列表(异步方法) + static Future> getPlatformGroups() async { + // 动态获取蓝牙权限列表 + final bluetoothPermissions = await _getBluetoothPermissions(); + return [ // 通讯权限组 - 仅Android(包含联系人权限) const PermissionGroup( @@ -20,11 +52,11 @@ class PermissionGroup { icon: Icons.phone_android, permissions: [Permission.phone, Permission.sms, Permission.contacts], ), - // 蓝牙权限组 - Android 12+ - const PermissionGroup( + // 蓝牙权限组 - 根据平台动态获取权限 + PermissionGroup( titleKey: 'bluetoothPermissions', icon: Icons.bluetooth, - permissions: [Permission.bluetoothScan, Permission.bluetoothConnect], + permissions: bluetoothPermissions, ), // 通知权限组 const PermissionGroup( diff --git a/lib/modules/permissions/views/permissions_view.dart b/lib/modules/permissions/views/permissions_view.dart index 8022d8a2c..94d188ff2 100644 --- a/lib/modules/permissions/views/permissions_view.dart +++ b/lib/modules/permissions/views/permissions_view.dart @@ -46,39 +46,52 @@ class PermissionsView extends GetView { return RefreshIndicator( onRefresh: controller.checkAllPermissions, - child: ListView( + child: SingleChildScrollView( padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h), - children: _buildPermissionGroups(isDarkMode), + child: _buildPermissionGroups(isDarkMode), ), ); }), ); } - List _buildPermissionGroups(bool isDarkMode) { - final groups = PermissionGroup.getPlatformGroups(); - final List widgets = []; - - for (int i = 0; i < groups.length; i++) { - final group = groups[i]; - - // 过滤平台特定权限 - if (_shouldShowGroup(group)) { - widgets.add(_buildPermissionSection( - group.titleKey, - group.icon, - group.permissions, - controller.permissionStatuses, - isDarkMode, - )); + Widget _buildPermissionGroups(bool isDarkMode) { + return FutureBuilder>( + future: PermissionGroup.getPlatformGroups(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } - if (i < groups.length - 1) { - widgets.add(SizedBox(height: 20.h)); + if (snapshot.hasError) { + return Center(child: Text('加载权限组失败: ${snapshot.error}')); } - } - } + + final groups = snapshot.data ?? []; + final List widgets = []; - return widgets; + for (int i = 0; i < groups.length; i++) { + final group = groups[i]; + + // 过滤平台特定权限 + if (_shouldShowGroup(group)) { + widgets.add(_buildPermissionSection( + group.titleKey, + group.icon, + group.permissions, + controller.permissionStatuses, + isDarkMode, + )); + + if (i < groups.length - 1) { + widgets.add(SizedBox(height: 20.h)); + } + } + } + + return Column(children: widgets); + }, + ); } bool _shouldShowGroup(PermissionGroup group) {