Browse Source

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

添加动态获取蓝牙权限的功能,根据平台和Android版本返回不同的权限列表。将权限组加载改为异步方式,并使用FutureBuilder优化UI加载体验。移除不必要的ListView嵌套,改为SingleChildScrollView提升性能。
newdev_shunjiawei
lxm 1 year ago
parent
commit
bc18f0bf4f
  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: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<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 [
// 通讯权限组 - 仅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(

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

@ -46,39 +46,52 @@ class PermissionsView extends GetView<PermissionsController> {
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<Widget> _buildPermissionGroups(bool isDarkMode) {
final groups = PermissionGroup.getPlatformGroups();
final List<Widget> 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<List<PermissionGroup>>(
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<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) {

Loading…
Cancel
Save