【发布时间】:2021-04-04 15:12:53
【问题描述】:
我正在使用 Hilt 将 ViewModel 注入片段中。但是在屏幕旋转时,会调用ViewModel.onCleared()。这是预期的行为吗?我一直认为ViewModel 可以在屏幕旋转中幸存下来。
因此,ViewModel 被重新创建,我通过比较屏幕旋转时的 ViewModel 哈希码验证了这一点。
这是我的片段代码:
@AndroidEntryPoint
class DashboardFragment : BaseFragment() {
private val dashboardViewModel: DashboardViewModel by viewModels()
private var _binding: FragmentDashboardBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = DataBindingUtil.inflate(
inflater, R.layout.fragment_dashboard, container, false
)
binding.viewModel = dashboardViewModel
binding.lifecycleOwner = viewLifecycleOwner
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.adapter = adapter
setObservers()
}
override fun onDestroyView() {
_binding = null
super.onDestroyView()
}
}
ViewModel 看起来像这样:
@HiltViewModel
class DashboardViewModel @Inject constructor() : ViewModel() {
init {
//Some code
}
override fun onCleared() {
super.onCleared()
Timber.e("cleared")
}
}
【问题讨论】:
-
"这是预期的行为吗?" -- 如果没有minimal reproducible example,我们无法告诉您该行为是否符合预期。例如,如果您手动替换片段作为配置更改的一部分,您将获得一个新的视图模型实例与新片段一起使用。
-
@CommonsWare 我已经添加了代码 sn-p。请看一看。我不是手动替换片段。事实上,我还没有写任何东西来处理配置更改。
-
在 onDestroyView 中注释掉内部绑定引用的无效会发生什么?
-
@BonanzaDriver 仍然是相同的行为。 onCleared() 调用。
-
您能否附上您的
DashboardViewModel代码?或者至少是带有注释等的类声明。
标签: android viewmodel dagger-hilt