KMP项目中ViewModel无法调用SaveStateHandle.toRoute求助
问题原因及解决办法
1. 缺少类型安全导航的必要依赖
你现在只添加了基础的navigation-compose依赖,但toRoute是类型安全导航专属的扩展函数,得补上对应的依赖。在libs.version.toml里补充这段配置:
# 补充类型安全导航依赖 navigation-compose-ktx = { module = "androidx.navigation:navigation-compose-ktx", version.ref = "navigationCompose" }
之后在模块的build.gradle.kts中引用这个依赖即可。
2. 未导入对应的扩展函数
就算依赖配置正确,也得在ViewModel文件的顶部导入这个扩展函数:
import androidx.navigation.toRoute
不导入的话,IDE根本识别不了toRoute方法。
3. Kodein注入ViewModel时未正确传递SavedStateHandle
用Kodein注入ViewModel时,要保证ViewModel的构造函数能拿到SavedStateHandle,同时Kodein的绑定配置要正确。举个绑定示例:
val appModule = DI.Module("appModule") { viewModel { MyViewModel(instance(), instance()) } // 第二个instance()就是注入SavedStateHandle,Kodein会自动为ViewModel提供该实例 }
对应的ViewModel构造函数必须声明SavedStateHandle参数:
class MyViewModel( private val someDependency: SomeDependency, private val savedStateHandle: SavedStateHandle ) : ViewModel() { // 在这里就能调用savedStateHandle.toRoute<你的路由类型>() }
4. 路由类型定义不符合要求
toRoute需要指定对应的路由密封类/数据类,你得按照类型安全导航的规范先定义好路由,比如:
sealed class Screen(val route: String) { data class DetailScreen(val id: String) : Screen("detail/{id}") }
同时要在导航图中正确关联这些路由。
内容的提问来源于stack exchange,提问作者Saw Yan Naing
相关产品推荐
相关产品推荐

