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

如何在Kotlin Compose中手动向SharedViewModel传递参数?

自定义ViewModel工厂实现参数传递

因为你不想依赖Hilt/Koin,我们可以通过自定义继承自AbstractSavedStateViewModelFactory的工厂类,来同时传递SavedStateHandle、FirebaseFirestore和FirebaseAuth参数,具体步骤如下:

1. 编写自定义ViewModel工厂

这个工厂类会负责创建SharedViewModel,同时处理SavedStateHandle的生命周期管理:

class SharedViewModelFactory(
    private val database: FirebaseFirestore?,
    private val auth: FirebaseAuth?,
    owner: SavedStateRegistryOwner,
    defaultArgs: Bundle? = null
) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
    @Suppress("UNCHECKED_CAST")
    override fun <T : ViewModel> create(
        key: String,
        modelClass: Class<T>,
        handle: SavedStateHandle
    ): T {
        if (modelClass.isAssignableFrom(SharedViewModel::class.java)) {
            return SharedViewModel(handle, database, auth) as T
        }
        throw IllegalArgumentException("不支持的ViewModel类型")
    }
}

2. 在MainActivity中创建并使用ViewModel

在Compose环境下,你可以在Activity的onCreate中获取Firebase实例,创建工厂后,通过viewModel()函数传入工厂来获取ViewModel:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 获取Firebase全局单例实例
        val firestore = FirebaseFirestore.getInstance()
        val firebaseAuth = FirebaseAuth.getInstance()

        setContent {
            YourAppTheme {
                // 创建工厂实例,传入Firebase对象、Activity本身(作为SavedStateRegistryOwner)和 savedInstanceState
                val viewModelFactory = SharedViewModelFactory(firestore, firebaseAuth, this, savedInstanceState)
                // 获取SharedViewModel实例
                val sharedViewModel: SharedViewModel = viewModel(factory = viewModelFactory)

                // 你的Compose界面逻辑,直接使用viewModel
                HomeScreen(viewModel = sharedViewModel)
            }
        }
    }
}

关键说明

  • AbstractSavedStateViewModelFactory是官方提供的类,专门用于需要SavedStateHandle的ViewModel,它会自动处理SavedStateHandle的创建与生命周期绑定,不需要手动实例化SavedStateHandle。
  • Firebase的getInstance()返回的是全局单例,无需重复创建,直接传入工厂即可。
  • 如果在子Compose组件中需要使用同一个SharedViewModel,直接调用viewModel(factory = viewModelFactory)即可,它会自动从Activity的ViewModelStore中获取已创建的实例。

内容的提问来源于stack exchange,提问作者GrassWarlock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:50:11