navigation 切换compose 的时候 viewModel 会被销毁掉,原本的状态就不存在了。 可以尝试用Hilt保持 viewmodel的状态
一、引入Hilt
project build.gradle 引入 hilt plugins:
id 'com.google.dagger.hilt.android' version '2.44' apply(false)module build.gradle 引入 plugin 和依赖
plugins {
id 'kotlin-kapt'
id 'com.google.dagger.hilt.android'
}
.... ...
dependencies {
implementation "com.google.dagger:hilt-android:2.44"
kapt "com.google.dagger:hilt-compiler:2.44"
implementation "androidx.hilt:hilt-navigation-compose:1.0.0"
}
kapt {
correctErrorTypes true
}二、创建Hilt
创建Application
@HiltAndroidApp
class MyActivity : Application()在ComponentActivity 上添加@AndroidEntryPoint
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
... ...
}3. AndroidManifest.xml 添加name
<application
... ...
android:name=".MyActivity">
</application>三、 改写代码
state 单例
@Singleton
class MyState @Inject constructor() {
val result: MutableLiveData<String> = MutableLiveData("")
... ...
}注入状态,HiltViewModel 注释创建viewModel
@HiltViewModel
class MyViewModel @Inject constructor(private val state: MyState) : ViewModel() {
... ...
}使用hiltViewModel获取viewModel
@Composable
fun MyCompose(viewModel: MyViewModel = hiltViewModel()) {
... ...
}因为使用了Navigation切换页面,导致 直接使用ViewModel()会产生错误,因此需要引入一下hilt-navigation-compose
当使用navigation切换Compose时,ViewModel会被销毁导致状态丢失。通过引入Hilt,可以实现ViewModel状态的保持。首先在项目和模块build.gradle中添加Hilt插件和依赖,然后创建Hilt应用并注解ComponentActivity。接着,在AndroidManifest.xml中配置name,将state设为单例,并使用HiltViewModel注解创建和获取ViewModel,以解决Navigation切换引起的ViewModel错误。
1399

被折叠的 条评论
为什么被折叠?



