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 无法在Kotlin中创建类ViewModel的实例_Android_Kotlin_Constructor_Viewmodel - Fatal编程技术网

Android 无法在Kotlin中创建类ViewModel的实例

Android 无法在Kotlin中创建类ViewModel的实例,android,kotlin,constructor,viewmodel,Android,Kotlin,Constructor,Viewmodel,我试图在片段中初始化viewmodel,但每次我想在viewmodel构造函数中传递接口时,它都会抛出错误无法创建类viewmodel的实例 另外,我在kotlin kapt或任何生命周期注释方面没有任何问题 这是我的ViewModel课程 class SettingsViewModel ( var settingsView: SettingsView ) : ViewModel(){ } 这是我想初始化viewmodel的片段 class SettingsFragmen

我试图在片段中初始化viewmodel,但每次我想在viewmodel构造函数中传递接口时,它都会抛出错误无法创建类viewmodel的实例 另外,我在kotlin kapt或任何生命周期注释方面没有任何问题

这是我的ViewModel课程

class SettingsViewModel (
       var settingsView: SettingsView
    ) : ViewModel(){ }
这是我想初始化viewmodel的片段

class SettingsFragment : Fragment(), SettingsView {

     var viewmodel :SettingsViewModel? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment

         viewmodel = ViewModelProviders.of(this).get(SettingsViewModel(this)::class.java)

        val binding =
            DataBindingUtil.inflate<FragmentSettingsBinding>(inflater, R.layout.fragment_settings, container, false)
                .apply{}


        return binding.root
    }
class SettingsFragment:Fragment(),SettingsView{
var viewmodel:设置viewmodel?=null
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
}
覆盖创建视图(
充气器:布局充气器,容器:视图组?,
savedInstanceState:捆绑?
):查看{
//为该碎片膨胀布局
viewmodel=ViewModelProviders.of(this.get)(setingsviewmodel(this)::class.java)
缬氨酸结合=
DataBindingUtil.充气(充气机,R.layout.fragment\u设置,容器,错误)
.apply{}
返回binding.root
}

在没有工厂的情况下通过ViewModelProviders初始化ViewModel时,这意味着您只能实例化没有构造函数参数的ViewModel。如下所示:

viewmodel = ViewModelProviders.of(this).get(SettingsViewModel::class.java)
请注意,您不能将参数传递给.class调用,因为您没有调用构造函数

由于ViewModel具有构造函数参数,您需要实现ViewModelProvider.Factory,以便能够使用给定参数检索其实例

以下是对android开发人员的参考:


这里引用的一篇文章可以让您深入了解如何实现工厂:

在我的例子中,我忘了添加

AndroidInjection.inject(this); 
在我这样的活动中:

 @Override
    public void onCreate(Bundle savedInstanceState) {
        AndroidInjection.inject(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

不要在viewmodel类中传入视图。还要更新您的类,如“类设置viewmodel:viewmodel().ViewModel的唯一职责是管理UI的数据。它不应该访问您的视图层次结构或保留对活动或片段的引用。永远不要在ViewModel类中传递任何视图。这是否也适用于接收应用程序参数的
AndroidViewModel
?它已被弃用。请使用新的更新。