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

使用ViewModel仍遇配置变更时Activity重启问题求助

问题分析与解决方案

首先明确:配置变更时Activity重启是Android的默认系统行为,ViewModel的核心作用是在Activity重启后保留数据/状态,而非阻止Activity重启。你观察到的Activity重启是正常现象,但如果配置变更后计数从0重新开始,那才是需要修复的问题,这和你的Flow实现方式直接相关。

代码问题根源

你的myFlow是冷Flow——每次调用并收集这个Flow时,都会重新执行flow构建块内的逻辑(从0开始循环发射数值)。虽然ViewModel实例会在Activity重启后被保留,但因为每次收集的都是全新的冷Flow,导致计数被重置,看起来像是ViewModel没起作用。

修复步骤

1. 将冷Flow转换为热Flow(StateFlow)

修改ViewModel代码,把冷Flow转为StateFlow,确保多次收集时能延续当前状态:

@HiltViewModel
class ListScreenModel @Inject constructor(): ViewModel() {
    val myStateFlow = flow {
        (0..100).forEach {
            emit(it)
            kotlinx.coroutines.delay(1000)
        }
    }.stateIn(
        scope = viewModelScope,
        started = SharingStarted.WhileSubscribed(5000),
        initialValue = 0
    )
}

或者用更直观的MutableStateFlow实现:

@HiltViewModel
class ListScreenModel @Inject constructor(): ViewModel() {
    private val _myStateFlow = MutableStateFlow(0)
    val myStateFlow = _myStateFlow.asStateFlow()

    init {
        viewModelScope.launch {
            (1..100).forEach {
                _myStateFlow.value = it
                kotlinx.coroutines.delay(1000)
            }
        }
    }
}

2. 更新Composable收集逻辑

@Composable
fun ListValue() {
    val viewmodel = hiltViewModel<ListScreenModel>()
    val num = viewmodel.myStateFlow.collectAsState().value

    Text(
        text = num.toString(),
        fontSize = 29.sp
    )
}

3. 确认Hilt基础配置正确

Hilt要正常管理ViewModel,必须确保:

  • 自定义Application类添加@HiltAndroidApp注解:
@HiltAndroidApp
class MyApplication : Application() {
}
  • AndroidManifest.xml中指定该Application:
<application
    android:name=".MyApplication"
    <!-- 其他配置项 -->
    >
</application>

总结

Activity重启是Android默认机制,ViewModel的作用是留存状态而非阻止重启。改成热Flow后,配置变更时计数会从当前值继续,同时ViewModel实例会被正确复用,解决你感知到的“状态重置”问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:54:23