如何从Firebase获取用户评分数据并创建UserRating类对象,处理空数据
解决Firebase Firestore获取评分数据并转换为UserRating实例的问题
1. 修正查询方法,完成数据转换与空值处理
你的查询代码仅构建了查询条件,未执行实际数据获取操作。按以下方式修改方法,即可实现将Firestore快照转换为UserRating实例,并处理数据不存在的场景:
final userRating = FirebaseFirestore.instance.collection('user rating'); // 指定返回类型为Future<UserRating?>,明确可能返回实例或null Future<UserRating?> getUserRatingPerJob({ required String ratingJobId, required String ratingUserIdGivingRating, }) async { try { // 执行查询并获取结果快照 final querySnapshot = await userRating .where(ratingJobIdColumn, isEqualTo: ratingJobId) .where(ratingUserIdGivingRatingColumn, isEqualTo: ratingUserIdGivingRating) .get(); // 判断是否存在匹配文档 if (querySnapshot.docs.isNotEmpty) { // 取首个匹配文档(按业务逻辑,jobId+评分者ID应唯一) return UserRating.fromSnapshot(querySnapshot.docs.first); } else { // 无对应评分数据时返回null return null; } } catch (e) { // 捕获Firestore操作异常,按需处理(如打印日志) print('获取评分数据失败: $e'); return null; } }
2. 调用示例
通过判断返回值是否为null,分别处理数据存在/不存在的逻辑:
void fetchUserRating() async { final rating = await getUserRatingPerJob( ratingJobId: '目标任务ID', ratingUserIdGivingRating: '评分者用户ID', ); if (rating != null) { // 数据存在,处理UserRating实例 print('评分星级:${rating.ratingUser},评论内容:${rating.ratingComment}'); } else { // 数据不存在,执行对应逻辑(如提示用户暂无评分) print('该用户未对该任务提交评分'); } }
3. 额外优化建议
- 若业务场景中
ratingJobId与ratingUserIdGivingRating的组合可能对应多个文档,可将返回类型改为Future<List<UserRating>>,遍历快照生成实例列表:Future<List<UserRating>> getUserRatingsPerJob({ required String ratingJobId, required String ratingUserIdGivingRating, }) async { final querySnapshot = await userRating .where(ratingJobIdColumn, isEqualTo: ratingJobId) .where(ratingUserIdGivingRatingColumn, isEqualTo: ratingUserIdGivingRating) .get(); return querySnapshot.docs.map((doc) => UserRating.fromSnapshot(doc)).toList(); } - 确保
ratingJobIdColumn等常量字符串与Firestore集合中的字段名完全一致,避免因字段名不匹配导致数据获取失败。
内容的提问来源于stack exchange,提问作者user17281101
相关产品推荐
相关产品推荐

