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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:50:24