Jetpack Compose+Firebase MVVM关联模型访问方案咨询
MVVM架构下Task与TaskList的数据访问最佳实践
你遇到的冗余问题核心是ViewModel职责边界模糊+数据层模型设计不符合Firebase特性,不需要在你列的两个方案里二选一,按下面的方式调整即可:
第一步:调整数据层模型设计
首先删掉TaskListModel里内嵌的全量TaskModel集合字段,这个设计本身就存在硬伤:
- Firestore单文档有1MB大小限制,单个任务列表下任务量上来之后会直接触发文档写入/读取失败
- 每次查询任务列表都会拉取所有关联任务的全量字段,会造成不必要的流量损耗和列表加载卡顿
调整后两个数据类的职责如下: TaskListModel:仅存储任务清单本身的元数据,包含字段:清单uuid、清单名称、创建时间、主题色、可选的任务计数字段(总任务数/未完成任务数,不需要存任务详情)TaskModel:单独存储在tasks根集合下,除了任务本身的内容、状态、截止时间等字段外,增加taskListId外键字段,关联所属的任务清单。
第二步:明确两个ViewModel的职责边界
两个ViewModel完全不存在冗余,各自负责对应维度的业务逻辑即可:
TaskListViewModel:面向任务清单列表页/清单管理场景,依赖TaskListRepository实现以下逻辑:- 查询全量任务清单的元数据列表
- 新增、删除、修改任务清单本身的属性(比如修改清单名称、更换主题色)
- 通过Firebase的
count()聚合查询,实时更新每个清单卡片上展示的任务计数,不需要拉取全量任务详情
TaskViewModel:面向单个清单详情页/单任务编辑场景,依赖TaskRepository实现以下逻辑:- 接收导航传入的
taskListId参数,查询对应清单下的全量TaskModel集合 - 接收导航传入的
taskId参数,查询单个任务的详情数据 - 实现任务的新增、删除、状态修改、排序、筛选等逻辑
- 接收导航传入的
页面数据访问规则
- 展示所有任务清单卡片的首页:仅注入
TaskListViewModel获取数据,不需要接触任务详情数据 - 单个任务清单的详情页(展示该清单下所有任务):导航时传入目标清单的uuid,页面仅注入
TaskViewModel,通过传入的uuid拉取对应任务数据 - 单任务编辑/详情页:导航时传入目标任务id,同样注入
TaskViewModel获取单任务数据
原有两个方案的问题说明
方案1(通过TaskListViewModel访问所有任务数据)的问题:除了前面提到的数据层性能隐患外,把所有任务操作逻辑堆在TaskListViewModel中,会导致该类随着业务迭代快速膨胀,违反单一职责原则,后续维护成本极高。
方案2(通过TaskViewModel按uuid查询任务)本身逻辑是对的,你觉得会让TaskListViewModel的任务集合字段冗余、TaskViewModel失去价值,本质是之前错误地在TaskListModel中内嵌了全量任务集合,删掉这个冗余字段后,两个ViewModel各司其职,完全不存在逻辑重叠。
如果后续需要实现全局维度的任务统计(比如全平台未完成任务总数、今日待办数),单独抽离共享的UseCase实现即可,不需要把相关逻辑耦合到任意一个ViewModel中,避免重复代码。
内容的提问来源于stack exchange,提问作者Adrian Peters
相关产品推荐
相关产品推荐

