Android ViewModel中如何动态传递user.id与friend.id参数?
动态传递user.id和friend.id到WindViewModel的方案
原代码的问题在于userWindList是在ViewModel初始化时直接创建的,无法动态更新user.id和friend.id参数。要实现动态传递,核心思路是把user和friend做成可观察的状态,当它们变化时自动重建分页流,具体实现如下:
实现步骤与代码示例
class WindViewModel @Inject constructor( private val windRepository: WindRepository, private val database: Database, private val api: Api ) : BaseViewModel() { // 用MutableStateFlow保存动态变化的用户和好友状态 private val _currentUser = MutableStateFlow<User?>(null) private val _currentFriend = MutableStateFlow<Friend?>(null) // 合并两个状态流,任意一个变化时触发分页流重建 private val userFriendPair = combine(_currentUser, _currentFriend) { user, friend -> Pair(user, friend) } // 动态生成的分页列表Flow val userWindList = userFriendPair.flatMapLatest { (user, friend) -> // 确保user和friend都不为空时才创建有效分页 if (user == null || friend == null) { flowOf(PagingData.empty()) } else { Pager( config = pagingConfig, remoteMediator = WindRemoteMediator( "userWindList", user.id, friend.id, database, api ) ) { windRepository.pagingModelList(friend.id, "userWindList") }.flow.map { pagingData -> pagingData.map { it.json.toWind() } }.cachedIn(viewModelScope) } } // 外部调用此方法更新用户和好友,触发分页数据刷新 fun updateUserAndFriend(user: User, friend: Friend) { _currentUser.value = user _currentFriend.value = friend } }
关键说明
- 状态驱动更新:用
MutableStateFlow存储user和friend,外部通过updateUserAndFriend方法传入新的对象后,状态流会自动通知下游。 - 合并状态流:
combine函数将两个状态流合并,只要其中一个参数变化,就会触发分页流的重建。 - 自动取消旧流:
flatMapLatest会自动取消之前的分页请求,只保留最新的流,避免无效请求浪费资源。 - 空安全处理:增加判空逻辑,防止在参数未初始化时创建无效的分页实例。
使用方式
在Fragment/Activity或Composable中拿到ViewModel实例后,调用updateUserAndFriend传入最新的user和friend对象即可:
// 示例:在Fragment中更新参数 viewModel.updateUserAndFriend(currentUser, targetFriend)
内容的提问来源于stack exchange,提问作者gaohomway
相关产品推荐
相关产品推荐

