如何在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
相关产品推荐
相关产品推荐

