1、需要用到以下插件
bash
# 设备信息
device_info_plus: ^9.1.2
uuid: ^4.5.2
flutter_secure_storage: ^9.2.4
2、封装
dart
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:uuid/uuid.dart';
/// 设备唯一 ID 服务
///
/// 使用方式:
/// ```dart
/// // 1. 在 Global.init() 中初始化
/// await DeviceId.init();
///
/// // 2. 在任何地方获取设备 ID
/// String deviceId = DeviceId.get();
/// ```
///
/// 特点:
/// - 使用 FlutterSecureStorage 存储,iOS 存储在 Keychain,Android 存储在 Keystore
/// - 即使卸载重装 App,设备 ID 依然保持不变
/// - 使用 UUID v4 生成,保证全球唯一性
class DeviceId {
// 单例实现
static final DeviceId _instance = DeviceId._internal();
factory DeviceId() => _instance;
DeviceId._internal();
// Flutter 安全存储,用于 Keychain/Keystore
static const FlutterSecureStorage _storage = FlutterSecureStorage();
// UUID 生成器
static const _uuidGen = Uuid();
// 设备唯一 ID 的存储 key
static const _keyDeviceId = 'ayi_device_unique_id';
// 缓存的设备 ID
static String? _deviceId;
/// 初始化设备 ID
///
/// 应在 App 启动时调用一次
static Future<void> init() async {
await _loadOrGenerateDeviceId();
}
/// 加载或生成设备 ID
static Future<void> _loadOrGenerateDeviceId() async {
// 1. 先尝试从安全存储读取
_deviceId = await _storage.read(key: _keyDeviceId);
// 2. 如果读不到(首次安装或被清除)
if (_deviceId == null || _deviceId!.isEmpty) {
// 3. 生成新的 UUID v4
_deviceId = _uuidGen.v4();
// 4. 保存到安全存储(Keychain/Keystore)
// 即使卸载重装,数据依然存在
await _storage.write(key: _keyDeviceId, value: _deviceId);
}
}
/// 获取设备唯一 ID
///
/// 返回示例:'550e8400-e29b-41d4-a716-446655440000'
///
/// 注意:使用前必须先调用 `DeviceId.init()`
static String get() {
if (_deviceId == null || _deviceId!.isEmpty) {
throw StateError(
'DeviceId 未初始化!请在 Global.init() 中调用 DeviceId.init()',
);
}
return _deviceId!;
}
/// 重置设备 ID(谨慎使用)
///
/// 生成新的设备 ID 并保存
/// 通常用于测试或用户主动解绑设备的场景
static Future<void> reset() async {
// 生成新的 UUID
_deviceId = _uuidGen.v4();
// 保存到安全存储
await _storage.write(key: _keyDeviceId, value: _deviceId);
}
/// 清除设备 ID(谨慎使用)
///
/// 从安全存储中删除设备 ID
/// 下次调用 `init()` 时会生成新的 ID
static Future<void> clear() async {
await _storage.delete(key: _keyDeviceId);
_deviceId = null;
}
}
3、页面中使用
dart
String deviceId = DeviceId.get();