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

ste*_*wpf 4 android android-viewmodel android-architecture-components

我目前正在研究Android Room with a View示例应用程序,这里提供完整的源代码。在这个项目中,定义了一个WordViewModel类型AndroidViewModel

class WordViewModel(application: Application) : AndroidViewModel(application)
Run Code Online (Sandbox Code Playgroud)

请注意构造函数如何要求Application传入一个实例。然而,当我检查 时MainActivityWordViewModel检索了 而不传入 Application实例:

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

这怎么可能,如何在WordViewModel不传入Application实例和不使用自定义工厂的情况下检索?

Epi*_*rce 5

AndroidX-Activity 1.2.0 的ComponentActivity(因此AppCompatActivity)实现HasDefaultViewModelProviderFactoryViewModelProvider.AndroidViewModelFactory.getInstance(getApplication())默认情况下从您的活动/片段返回,允许您从中获取应用程序,AndroidViewModelFactory而无需显式传递它。

然后,该工厂使用__(application)构造函数通过反射实例化您的 ViewModel 。

不过SavedStateViewModelFactory,为了能够以SavedStateHandle类似的方式接收 a通常是一个更好的主意( ___(application, savedStateHandle))。

因此,要解决这个问题,就需要加起来最新的版本core-ktxactivity-ktxfragment-ktx明确在你的代码。