是否实例化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呢。向后滚动。