You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中用Hive关联用户ID存储并读取游戏数据?

解决方案

针对你的数独项目需求,要实现用户与游戏数据的关联存储,基于Hive可以按以下步骤操作:

1. 调整GameDataModel,增加用户关联字段

给GameDataModel添加uid字段,用于绑定对应的用户ID,确保每条游戏数据都能归属到具体用户;同时将需要更新的字段改为非final,方便后续修改:

@HiveType(typeId: 0)
class GameDataModel extends HiveObject {
  @HiveField(0)
  String star;

  @HiveField(1)
  String avatar;

  @HiveField(2)
  String saveGame;

  @HiveField(3)
  final int uid; // 新增用户ID关联字段

  GameDataModel({
    required this.star,
    required this.avatar,
    required this.saveGame,
    required this.uid,
  });
}

2. 确保Hive初始化与Box管理

在项目入口(如main.dart)中完成Hive初始化、模型适配器注册,并打开对应存储Box:

void main() async {
  await Hive.initFlutter();
  Hive.registerAdapter(GameDataModelAdapter());
  Hive.registerAdapter(LoginModelAdapter());
  
  // 打开登录信息和游戏数据的存储容器
  await Hive.openBox<LoginModel>('login_box');
  await Hive.openBox<GameDataModel>('game_data_box');
  
  runApp(const MyApp());
}

3. 登录后记录当前用户UID

用户登录成功后,将当前用户的uid存入内存(比如全局变量或状态管理类),方便后续游戏操作快速调用:

// 示例:用全局变量存储当前登录用户UID
int? currentUserId;

// 登录逻辑示例
void login(String username, String password) {
  final loginBox = Hive.box<LoginModel>('login_box');
  final user = loginBox.values.firstWhere(
    (u) => u.username == username && u.password == password,
    orElse: () => throw Exception('用户不存在'),
  );
  currentUserId = user.uid; // 记录当前用户ID
}

注意:注册用户时要给LoginModel的uid赋值唯一值,比如用DateTime.now().millisecondsSinceEpoch或uuid库生成。

4. 存储/更新游戏数据(关卡完成后存星星)

当用户完成关卡后,根据当前UID查询并更新对应游戏数据:

void updateGameData(String newStarCount, String? newAvatar, String? newSaveGame) async {
  final gameDataBox = Hive.box<GameDataModel>('game_data_box');
  if (currentUserId == null) return;

  // 查询当前用户已有游戏数据,无数据则创建默认实例
  GameDataModel userGameData = gameDataBox.values.firstWhere(
    (data) => data.uid == currentUserId,
    orElse: () => GameDataModel(
      star: newStarCount,
      avatar: newAvatar ?? '默认头像路径',
      saveGame: newSaveGame ?? '',
      uid: currentUserId!,
    ),
  );

  // 更新字段
  userGameData.star = newStarCount;
  if (newAvatar != null) userGameData.avatar = newAvatar;
  if (newSaveGame != null) userGameData.saveGame = newSaveGame;
  
  // 保存到本地
  await userGameData.save();
}

// 关卡完成时调用示例
void onLevelCompleted(String addedStars) {
  // 从已加载数据中获取当前星星数,计算新数量
  final currentStar = loadUserGameData()?.star ?? '0';
  final newStarCount = (int.parse(currentStar) + int.parse(addedStars)).toString();
  updateGameData(newStarCount, null, null);
}

5. 加载用户游戏数据

用户登录或重启应用后,根据当前UID加载对应游戏数据并同步到UI:

GameDataModel? loadUserGameData() {
  final gameDataBox = Hive.box<GameDataModel>('game_data_box');
  if (currentUserId == null) return null;

  try {
    return gameDataBox.values.firstWhere(
      (data) => data.uid == currentUserId,
    );
  } catch (e) {
    // 用户无游戏数据时返回默认实例
    return GameDataModel(
      star: '0',
      avatar: '默认头像路径',
      saveGame: '',
      uid: currentUserId!,
    );
  }
}

// 登录成功后加载数据到UI
void afterLogin() {
  final userGameData = loadUserGameData();
  if (userGameData != null) {
    // 同步数据到界面:显示星星数、头像、加载存档
    updateUIWithGameData(userGameData);
  }
}

内容的提问来源于stack exchange,提问作者Adeen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:35:34