如何在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
相关产品推荐
相关产品推荐

