Flutter:设备唯一id生成,存储,

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();
相关推荐
程序员Ctrl喵1 天前
异步编程:Event Loop 与 Isolate 的深层博弈
开发语言·flutter
前端不太难1 天前
Flutter 如何设计可长期维护的模块边界?
flutter
小蜜蜂嗡嗡1 天前
flutter列表中实现置顶动画
flutter
始持1 天前
第十二讲 风格与主题统一
前端·flutter
始持1 天前
第十一讲 界面导航与路由管理
flutter·vibecoding
始持1 天前
第十三讲 异步操作与异步构建
前端·flutter
新镜1 天前
【Flutter】 视频视频源横向、竖向问题
flutter
黄林晴1 天前
Compose Multiplatform 1.10 发布:统一 Preview、Navigation 3、Hot Reload 三箭齐发
android·flutter
Swift社区1 天前
Flutter 应该按功能拆,还是按技术层拆?
flutter
肠胃炎1 天前
树形选择器组件封装
前端·flutter