Instanciate ViewModel from Fragment with Kotlin



我正在尝试使用 Kotlin 的片段中使用 Android 架构组件创建 ViewModel 的实例,但出现下一个错误:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: campanoon.cronometrohiit, PID: 3871
java.lang.RuntimeException: Cannot create an instance of class campanoon.cronometrohiit.RoutinesViewModel 
at android.arch.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:153)

我的视图模型:

class RoutinesViewModel(application: Application) : ViewModel() {
private val routineDao = AppDatabase.getDatabase(application).routineDao()
fun generateSimpleList() : List<Routine> {
routineDao.insertRoutine(Routine(null,"Prueba 1", "00:10","00:30","30:00",3))
routineDao.insertRoutine(Routine(null,"Prueba 2", "00:15","00:30","15:00",2))
routineDao.insertRoutine(Routine(null,"Prueba 3", "00:20","00:30","20:00",5))
return routineDao.getRoutines()
}
}

我的片段:

class RoutinesFragment : Fragment() {
private lateinit var routinesViewModel : RoutinesViewModel

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val v : View = inflater.inflate(R.layout.fragment_routines, container, false)
routinesViewModel= ViewModelProviders.of(this).get(RoutinesViewModel::class.java)
return v
}

我不知道我做错了什么:(

如果您需要将参数传递给ViewModel的构造函数,则需要使用ViewModel.Factory

open class RoutinesViewModelFactory(private val application: Application) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(RoutinesViewModel::class.java)) {
return RoutinesViewModel(application) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
} 

例如,如果您使用dagger,则会在片段中注入RoutinesViewModelFactory实例

@Inject lateinit var routinesViewModelFactory: RoutinesViewModelFactory

然后通过调用检索ViewModel实例

routinesViewModel = ViewModelProviders.of(this, RoutinesViewModelFactory).get(RoutinesViewModel::class.java)

最新更新