Koin和Kotlin:不能使用T作为化参数

时间:2019-08-31 22:21:11

标签: android generics kotlin

我需要在通用类型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。+

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
}}