Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 片段中包含应用程序上下文和额外参数的ViewModel_Android_Kotlin_Android Architecture Components_Android Viewmodel_Android Architecture - Fatal编程技术网

Android 片段中包含应用程序上下文和额外参数的ViewModel

Android 片段中包含应用程序上下文和额外参数的ViewModel,android,kotlin,android-architecture-components,android-viewmodel,android-architecture,Android,Kotlin,Android Architecture Components,Android Viewmodel,Android Architecture,我们知道,为了访问应用程序需要查找资源字符串或系统服务的上下文,我们使用AndroidViewModel扩展了ViewModel,同时向ViewModel传递额外参数需要一个扩展ViewModelProvider.NewInstanceFactory()的工厂。我的问题是,当您使用AndroidViewModel时,在构建视图模型时不需要将Application作为参数传递,但当使用工厂时,您需要传递应用程序上下文以及额外的参数 当只使用AndroidViewModel时,getActivity

我们知道,为了访问
应用程序
需要查找资源字符串或系统服务的上下文,我们使用
AndroidViewModel
扩展了ViewModel,同时向ViewModel传递额外参数需要一个扩展
ViewModelProvider.NewInstanceFactory()
的工厂。我的问题是,当您使用
AndroidViewModel
时,在构建视图模型时不需要将
Application
作为参数传递,但当使用工厂时,您需要传递应用程序上下文以及额外的参数

当只使用
AndroidViewModel
时,getActivity().getApplication()是否在内部完成? 在片段中显式地将
getActivity().getApplication()
传递给ViewModel工厂可以吗

样品

仅需要应用程序上下文的ViewModel

class AssetViewModel(application: Application) : AndroidViewModel(application) {

}
上面的ViewModel可以像默认的方式一样在片段中构造

val assetViewModel = ViewModelProvider(this).get(AssetViewModel::class.java)
然而,在工厂里,你会这样做

class NewsVideoViewModelFactory(private val application: Application, private val baseUrl: String) : ViewModelProvider.NewInstanceFactory() {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        @Suppress("UNCHECKED_CAST")
        return NewsVideoViewModel(application, baseUrl) as T
    }

}

class NewsVideoViewModel(application: Application, baseUrl: String) : AndroidViewModel(application){

   

}

这是否正确且不违反使用ViewModel的概念或最佳实践?

在java中,当您通过
AndroidViewModel
创建ViewModel时,必须传递应用程序参数,因此对于问题:

getActivity() 使用AndroidViewModel

您已将应用程序上下文显式传递给
AndroidViewModel
。在该类中有一个方法
getApplication()
,用于接收传递的参数。第二条:

在中显式传递getActivity().getApplication()可以吗 片段到您的ViewModel工厂

绝对没问题

val viewModel = ViewModelProvider(this, NewsVideoViewModelFactory(requireActivity().application, baseUrl)).get(
            NewsVideoViewModel::class.java)