我需要在通用类型T中使用tha类viewmodel()(来自Koin),但会向我返回错误:
不能将T用作化类型参数。改用Class。
缺少setValue(BaseViewModelActivity,KProperty <*>,T),类型为Lazy的委托上的方法
到目前为止我一直在尝试的内容和当前代码:
class ActivityDetailActivity : BaseViewModelActivity<ActivityDetailViewModel>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_detail, ActivityDetailViewModel::class.java)
}
}
open class BaseViewModel : ViewModel() { }
abstract class BaseViewModelActivity<T: BaseViewModel> : BaseActivity() {
protected var viewModel: T by viewModel()
protected open fun setContentView(layoutResID: Int, vm: Class<T>) {
super.setContentView(layoutResID)
setViewModel(vm)
}
private fun setViewModel(vm: Class<T>) {
viewModel = ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(vm)
viewModel.navigateTo.observeNonNull(this) {
super.navigateTo(it)
}
}
}
Koin版本是最后一个:2。+
答案 0 :(得分:0)
更改
protected var viewModel: T by viewModel()
到
protected lateinit var viewModel: T
在这种情况下,您不能使用viewModels委托,因为它需要一个经过类型化的参数,但是T是无法进行类型化的类类型参数。
相反,您可以将viewModel初始化为setViewModel中的适当类型。
答案 1 :(得分:0)
我如何设置BaseViewmodel和BaseActivity
abstract class BaseActivity<Binding : ViewDataBinding, ViewModel : BaseViewModel> : AppCompatActivity() {
protected lateinit var bindObject: Binding
protected abstract val mViewModel: ViewModel
abstract fun getLayoutResId(): Int
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(getLayoutResId())
performViewModelBinding()
}
}
像这样的BaseViewModel
open class BaseViewModel : ViewModel(), KoinComponent {}
我正在这样使用它
class SplashActivity : BaseActivity<ActivitySplashBinding, SplashViewModel>() {
override val mViewModel: SplashViewModel by currentScope.inject()
override fun getLayoutResId(): Int {
return R.layout.activity_splash
}}