我正在尝试在Fragment中初始化 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
}
答案 0 :(得分:2)
在没有工厂的情况下通过ViewModelProviders初始化ViewModel时,这意味着您只能实例化没有构造函数参数的ViewModel。像这样:
viewmodel = ViewModelProviders.of(this).get(SettingsViewModel::class.java)
请注意,由于您没有调用构造函数,因此无法将参数传递给.class调用
由于ViewModel具有构造函数参数,因此您需要实现ViewModelProvider.Factory以便能够使用给定的参数检索其实例。
以下是对Android开发人员的引用:https://developer.android.com/reference/android/arch/lifecycle/ViewModelProvider
这里是指可以使您了解如何实施工厂的文章:https://medium.com/@marco_cattaneo/android-viewmodel-and-factoryprovider-good-way-to-manage-it-with-dagger-2-d9e20a07084c
答案 1 :(得分:0)
就我而言,我忘记添加
AndroidInjection.inject(this);
在我这样的活动中:
@Override
public void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);