From bc18f0bf4f45ed3302228715d40bc85a4abb2add Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sat, 16 Aug 2025 21:02:25 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(=E6=9D=83=E9=99=90):=20=E6=94=B9?= =?UTF-8?q?=E8=BF=9B=E8=93=9D=E7=89=99=E6=9D=83=E9=99=90=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E6=9D=83=E9=99=90=E7=BB=84=E5=8A=A0?= =?UTF-8?q?=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) { From 5322b131f7abbda3c622aff43a25891c9c3ed9a7 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sat, 16 Aug 2025 22:17:31 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(permissions):=20=E7=A7=BB=E9=99=A4iOS?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E8=93=9D=E7=89=99=E6=9D=83=E9=99=90=E4=BB=A5?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E4=B8=8D=E5=BF=85=E8=A6=81=E7=9A=84=E8=AF=B7?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit iOS平台不需要单独请求蓝牙权限,因此从权限列表中移除以避免不必要的权限请求弹窗 --- .../controllers/permissions_controller.dart | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/modules/permissions/controllers/permissions_controller.dart b/lib/modules/permissions/controllers/permissions_controller.dart index 4034cb772..1c40d55a2 100644 --- a/lib/modules/permissions/controllers/permissions_controller.dart +++ b/lib/modules/permissions/controllers/permissions_controller.dart @@ -12,7 +12,7 @@ class PermissionsController extends GetxController { // 是否正在请求权限 final RxBool isRequestingPermission = false.obs; - + // Android版本信息(用于权限组显示判断) final RxInt androidSdkVersion = 0.obs; @@ -22,7 +22,7 @@ class PermissionsController extends GetxController { _initAndroidVersion(); checkAllPermissions(); } - + /// 初始化Android版本信息 Future _initAndroidVersion() async { if (Platform.isAndroid) { @@ -36,7 +36,7 @@ class PermissionsController extends GetxController { } } } - + /// 检查是否应该显示蓝牙权限组 bool shouldShowBluetoothPermissions() { if (Platform.isAndroid) { @@ -48,7 +48,7 @@ class PermissionsController extends GetxController { } return false; } - + /// 检查是否应该显示存储权限组 bool shouldShowStoragePermissions() { if (Platform.isAndroid) { @@ -109,22 +109,22 @@ class PermissionsController extends GetxController { /// 获取平台特定的权限列表 Future> _getPlatformPermissions() async { final bluetoothPermissions = await _getBluetoothPermissions(); - + if (Platform.isIOS) { final List permissions = [ Permission.calendarFullAccess, Permission.location, Permission.contacts, - ...bluetoothPermissions, + //...bluetoothPermissions, Permission.notification, Permission.microphone, ]; - + // iOS系统不添加存储权限(根据shouldShowStoragePermissions方法) if (shouldShowStoragePermissions()) { permissions.add(Permission.storage); } - + return permissions; } else if (Platform.isAndroid) { final List permissions = [ @@ -138,12 +138,12 @@ class PermissionsController extends GetxController { Permission.scheduleExactAlarm, Permission.microphone, ]; - + // 只在Android 10及以下版本添加存储权限 if (shouldShowStoragePermissions()) { permissions.add(Permission.storage); } - + return permissions; } return [];