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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:45:47