Flutter中Provider与sqflite集成时首次登录数据同步问题
解决方案
步骤1:修改数据库插入方法的返回值
调整_dbhelper中的insertUserDetails方法,将API返回的UserDetails转换为UserTable对象执行插入后,直接返回该插入完成的UserTable实例,避免后续额外查库:
// _dbhelper类内的插入方法修改示例 Future<UserTable> insertUserDetails(UserDetails userDetails) async { final db = await database; // 自行实现字段映射逻辑,将UserDetails转为UserTable UserTable userTable = UserTable( userId: userDetails.id, // 其他字段按照你的业务映射规则补全 ); // 执行插入,自增id可以回写至UserTable对象 int insertRowId = await db.insert('user_table', userTable.toJson()); userTable.id = insertRowId; return userTable; }
步骤2:插入完成后主动同步到Provider
在调用插入方法的位置,拿到插入返回的UserTable数据后,直接调用Provider的更新方法即可:
Future _insertuserDetails(UserDetails? userDetails, BuildContext context) async{ if(userDetails != null){ UserTable insertedData = await _dbhelper!.insertUserDetails(userDetails); // 插入成功后同步到Provider if(context.mounted){ Provider.of<UserProvider>(context, listen: false).setuserProvider(insertedData); } } }
特殊场景兼容:如果插入逻辑所在位置无法获取有效context,可在初始化Provider时将实例存储到全局变量,直接调用全局实例的
setuserProvider方法即可。
可选降级方案
如果你不想修改现有数据库插入方法的结构,也可以在插入完成后重新查询一次用户表,再把查询结果同步到Provider,只是多了一次查库开销:
Future _insertuserDetails(UserDetails? userDetails, BuildContext context) async{ if(userDetails != null){ await _dbhelper!.insertUserDetails(userDetails); // 插入完成后重新查库拿最新数据 List<UserTable> userList = await _dbHelper.getAllUserData(); if(context.mounted && userList.isNotEmpty){ Provider.of<UserProvider>(context, listen: false).setuserProvider(userList[0]); } } }
修改完成后,插入数据的同时就会触发Provider的notifyListeners,所有监听用户状态的组件都会自动更新,不需要重启应用。
内容的提问来源于stack exchange,提问作者Febin Johnson
相关产品推荐
相关产品推荐

