Browse Source

feat(权限): 改进蓝牙权限处理并优化权限组加载

添加动态获取蓝牙权限的功能,根据平台和Android版本返回不同的权限列表。将权限组加载改为异步方式,并使用FutureBuilder优化UI加载体验。移除不必要的ListView嵌套,改为SingleChildScrollView提升性能。
weicu
lxm 1 year ago
parent
commit
fa480cd0d5
  1. 40
      lib/modules/permissions/models/permission_group.dart
  2. 59
      lib/modules/permissions/views/permissions_view.dart

40
lib/modules/permissions/models/permission_group.dart

@ -1,5 +1,7 @@
import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:device_info_plus/device_info_plus.dart';
class PermissionGroup { class PermissionGroup {
final String titleKey; final String titleKey;
@ -12,7 +14,37 @@ class PermissionGroup {
required this.permissions, required this.permissions,
}); });
static List<PermissionGroup> getPlatformGroups() { /// 获取蓝牙权限列表(根据平台和Android版本)
static Future<List<Permission>> _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<List<PermissionGroup>> getPlatformGroups() async {
// 动态获取蓝牙权限列表
final bluetoothPermissions = await _getBluetoothPermissions();
return [ return [
// 通讯权限组 - 仅Android(包含联系人权限) // 通讯权限组 - 仅Android(包含联系人权限)
const PermissionGroup( const PermissionGroup(
@ -20,11 +52,11 @@ class PermissionGroup {
icon: Icons.phone_android, icon: Icons.phone_android,
permissions: [Permission.phone, Permission.sms, Permission.contacts], permissions: [Permission.phone, Permission.sms, Permission.contacts],
), ),
// 蓝牙权限组 - Android 12+ // 蓝牙权限组 - 根据平台动态获取权限
const PermissionGroup( PermissionGroup(
titleKey: 'bluetoothPermissions', titleKey: 'bluetoothPermissions',
icon: Icons.bluetooth, icon: Icons.bluetooth,
permissions: [Permission.bluetoothScan, Permission.bluetoothConnect], permissions: bluetoothPermissions,
), ),
// 通知权限组 // 通知权限组
const PermissionGroup( const PermissionGroup(

59
lib/modules/permissions/views/permissions_view.dart

@ -46,39 +46,52 @@ class PermissionsView extends GetView<PermissionsController> {
return RefreshIndicator( return RefreshIndicator(
onRefresh: controller.checkAllPermissions, onRefresh: controller.checkAllPermissions,
child: ListView( child: SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h), padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h),
children: _buildPermissionGroups(isDarkMode), child: _buildPermissionGroups(isDarkMode),
), ),
); );
}), }),
); );
} }
List<Widget> _buildPermissionGroups(bool isDarkMode) { Widget _buildPermissionGroups(bool isDarkMode) {
final groups = PermissionGroup.getPlatformGroups(); return FutureBuilder<List<PermissionGroup>>(
final List<Widget> widgets = []; future: PermissionGroup.getPlatformGroups(),
builder: (context, snapshot) {
for (int i = 0; i < groups.length; i++) { if (snapshot.connectionState == ConnectionState.waiting) {
final group = groups[i]; return const Center(child: CircularProgressIndicator());
}
// 过滤平台特定权限
if (_shouldShowGroup(group)) {
widgets.add(_buildPermissionSection(
group.titleKey,
group.icon,
group.permissions,
controller.permissionStatuses,
isDarkMode,
));
if (i < groups.length - 1) { if (snapshot.hasError) {
widgets.add(SizedBox(height: 20.h)); return Center(child: Text('加载权限组失败: ${snapshot.error}'));
} }
}
} final groups = snapshot.data ?? [];
final List<Widget> 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) { bool _shouldShowGroup(PermissionGroup group) {

Loading…
Cancel
Save