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

Flutter中Firestore首次创建嵌套集合后如何向同一workout追加新练习

问题核心原因

你当前的代码每次调用都会新建独立workout的根源是:collection("workouts").doc() 这里没有传入指定的文档ID,Firestore每次都会自动生成新的随机ID,自然无法把后续练习写入同一个workout。


解决步骤

  • 第一步:首次创建训练时,保存对应workout的文档ID
    你可以把ID存在当前页面的变量里,或者用状态管理(Provider、Riverpod等)、本地持久化存储(SharedPreferences等)存储,保证本次训练周期内可以读取到即可:
// 在当前页面/全局状态中定义变量存储当前正在进行的训练ID
String? currentWorkoutId;

// 首次开启训练、新建workout时调用
Future<void> initNewWorkout() async {
  if (currentUser == null) return;
  // 生成新的workout文档,拿到自动生成的ID
  final workoutDoc = FirebaseFirestore.instance
      .collection('users')
      .doc(currentUser!.uid)
      .collection("workouts")
      .doc();
  currentWorkoutId = workoutDoc.id;
  // 可自行补充workout维度的基础信息,比如训练开始时间、训练部位等
  await workoutDoc.set({
    "startTime": DateTime.now(),
  });
}
  • 第二步:修改保存训练组的方法,复用已有的workout ID
_saveExerciseSetForUser() async {
  // 未登录/没有正在进行的训练时直接返回
  if (currentUser == null || currentWorkoutId == null) return;
  await FirebaseFirestore.instance
      .collection('users')
      .doc(currentUser!.uid)
      .collection("workouts")
      .doc(currentWorkoutId) // 传入已保存的ID,不再生成新的workout
      .collection("exercises")
      .doc(exerciseId)
      .collection("sets")
      .doc()
      .set({
    "setNo.": setCount,
    "weight": weightController.text,
    "reps": repsController.text,
    "toFailure": false
  });
}
  • 额外补充说明
    如果需要支持APP杀掉后仍能继续上次未完成的训练,可以把currentWorkoutId存在本地持久化存储中,训练主动结束后再清空这个ID即可,避免后续训练错误写入旧的workout文档。

内容的提问来源于stack exchange,提问作者who-aditya-nawandar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:45:01