是否实例化AndroidViewModel而不传递应用程序上下文?

是否实例化AndroidViewModel而不传递应用程序上下文?,android,android-architecture-components,android-viewmodel,Android,Android Architecture Components,Android Viewmodel,我目前正在安卓房间里翻找一个视图示例应用程序,完整的源代码可用。在本项目中,定义了类型为AndroidViewModel的: class WordViewModel(application: Application) : AndroidViewModel(application) 请注意构造函数如何要求传入应用程序实例。 然而,当我检查时,WordViewModel被检索,而不传递 应用程序实例: // Get a new or existing ViewModel from the View

我目前正在安卓房间里翻找一个视图示例应用程序,完整的源代码可用。在本项目中,定义了类型为
AndroidViewModel
的:

class WordViewModel(application: Application) : AndroidViewModel(application)
请注意构造函数如何要求传入
应用程序
实例。 然而,当我检查时,
WordViewModel
被检索,而不传递
应用程序
实例:

// Get a new or existing ViewModel from the ViewModelProvider.
mWordViewModel = new ViewModelProvider(this).get(WordViewModel.class);

这是怎么可能的呢?如果不传入
应用程序
实例,也不使用自定义工厂,如何检索
WordViewModel
。AndroidX Activity 1.2.0的
组件活动
(因此
AppCompativity
)实现了
HasDefaultViewModelProviderFactory
,默认情况下,它从活动/片段返回一个
ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication())
,允许您从该
AndroidViewModelFactory
获取应用程序,而无需显式传递它

然后,该工厂使用
\u(应用程序)
构造函数通过反射实例化ViewModel

通常最好使用
SavedStateViewModelFactory
,以便能够以类似的方式接收
SavedStateHandle
(应用程序,SavedStateHandle))

因此,要解决此问题,您需要在代码中明确添加最新版本的
核心ktx
活动ktx
片段ktx

依赖项

def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
kapt "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

implementation "androidx.fragment:fragment-ktx:1.2.4"
应用程序类

class App : Application() {
    //Code
}
AndroidViewModel类

class TestVM (app : android.app.Application) : AndroidViewModel(app){
    // Cast app to the application class
    val myApplication : App = app as App
}
零碎

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val viewModel = ViewModelProvider(this).get(TestVM::class.java)
}

更多信息请参见类似问题:您是否也可以看一看类似的问题?这里我不会将上下文传递给视图模型。这意味着ViewModelStoreOwner。公共ViewModelProvider(@NonNull ViewModelStoreOwner){…}。那么为什么要将答案降级为@igorganapolsky呢。向后滚动。