Java 什么时候应该创建片段视图模型?

Java 什么时候应该创建片段视图模型?,java,android,kotlin,Java,Android,Kotlin,我总是在片段的onCreate方法中创建视图模型。我还看到其他一些开发人员在onCreateView方法中创建视图模型。然而,今天我使用Android Studio模板为“片段与ViewModel”创建了视图模型,视图模型是在onActivityCreated方法中创建的。哪种方法是正确的?如果Android Studio模板在创建的活动中执行此操作,那么肯定是有原因的。有人能在这里阐明正确的方法吗 如果Android Studio模板在onActivityCreated中这样做,那么肯定有原因

我总是在片段的
onCreate
方法中创建视图模型。我还看到其他一些开发人员在
onCreateView
方法中创建视图模型。然而,今天我使用Android Studio模板为“片段与ViewModel”创建了视图模型,视图模型是在
onActivityCreated
方法中创建的。哪种方法是正确的?如果Android Studio模板在创建的活动中执行此操作,那么肯定是有原因的。有人能在这里阐明正确的方法吗

如果Android Studio模板在onActivityCreated中这样做,那么肯定有原因

我猜模板的创建者错过了备忘录

我总是用片段的onCreate方法创建视图模型。我还看到其他一些开发人员使用onCreateView方法创建视图模型

理论上,您应该在
onCreate
中创建它,但由于NavHostFragment与常规片段共享相同的
onCreate
分派,因此在使用带有SavedStateHandle的NavGraph范围的视图模型时,您必须依赖
onCreateView
onViewCreated

因此,使用viewModels创建的
onViewCreated
进行延迟初始化是最安全的选择

如果Android Studio模板在onActivityCreated中这样做,那么肯定有原因

我猜模板的创建者错过了备忘录

我总是用片段的onCreate方法创建视图模型。我还看到其他一些开发人员使用onCreateView方法创建视图模型

理论上,您应该在
onCreate
中创建它,但由于NavHostFragment与常规片段共享相同的
onCreate
分派,因此在使用带有SavedStateHandle的NavGraph范围的视图模型时,您必须依赖
onCreateView
onViewCreated


因此,使用由viewModels创建的
onViewCreated
中进行惰性初始化是最安全的选择。

只要在
onCreate
中/之后进行初始化,并且您引用相同的
ViewModelStore
以防止生成重复项,这实际上并不重要。在任何生命周期方法中获取ViewModel都是安全的,在变速箱中一路起动。但是,观察数据的时间和方式很重要,因为您可能会遇到生命周期问题。@zsmb13您不能在
onAttach
中使用SavedStateHandle初始化ViewModel,只能在
onCreate
中初始化;并且,如果SavedStateHandle的作用域为NavGraph,则不能在“after
onCreate
之前初始化ViewModel这就是
onCreateView
。只要在
onCreate
中/之后完成,并且您引用相同的
ViewModelStore
,以防止产生重复项,那么这并不重要。在任何生命周期方法中获取ViewModel都是安全的,从
onAttach
开始。但是,观察数据的时间和方式很重要,因为您可能会遇到生命周期问题。@zsmb13您不能在
onAttach
中使用SavedStateHandle初始化ViewModel,只能在
onCreate
中初始化;在“after
onCreate
”之前,即
onCreateView
,如果SavedStateHandle的作用域为NavGraph,则无法初始化ViewModel。