Kotling :: Android :: java.lang.ClassCastException: java.lang.Class не может быть приведен к androidx.lifecycle.ViewModel - PullRequest
0 голосов
/ 12 июня 2019

Я получаю исключение в первой строке кода ниже

viewModel.homeLiveData.observe(this, Observer { list ->

        list?.let {
            mList.addAll(list)
            adapter.notifyDataSetChanged()
        }
    })

java.lang.ClassCastException: java.lang.Class не может быть приведен к androidx.lifecycle.ViewModel

Весь код ниже

что не так с актерами? что-то не так, я создаю свою модель представления?

Моя базовая активность

  abstract class BaseActivity<V : ViewModel> : DaggerAppCompatActivity(), HasSupportFragmentInjector {

    @Inject
    lateinit var fragmentAndroidInjector: DispatchingAndroidInjector<Fragment>

    @Inject
    lateinit var viewModelFactory: ViewModelProvider.Factory

    @LayoutRes
    abstract fun layoutRes(): Int

    protected lateinit var viewModel : V

    protected abstract fun getViewModel() : Class<V>

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        val id = item.itemId
        if (id == android.R.id.home)
            onBackPressed()

        return super.onOptionsItemSelected(item)
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
        setContentView(layoutRes())
        viewModel = ViewModelProviders.of(this, viewModelFactory).get(getViewModel())
    }

    override fun supportFragmentInjector(): AndroidInjector<Fragment> = fragmentAndroidInjector
}

тогда моя деятельность

class MainActivity : BaseActivity<MainViewModel>() {


override fun layoutRes(): Int = R.layout.activity_main

override fun getViewModel(): Class<MainViewModel> = MainViewModel::class.java

private val mList = mutableListOf<Any>()

private lateinit var adapter: DataAdapter

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

   // setSupportActionBar(toolbar)

    recyclerView.apply {
        layoutManager = GridLayoutManager(applicationContext, 2)
        adapter = DataAdapter(context, mList)

    }

    viewModel.homeLiveData.observe(this, Observer { list ->

        list?.let {
            mList.addAll(list)
            adapter.notifyDataSetChanged()
        }
    })

    viewModel.getHomeItems()


}

а это моя ViewModel

class MainViewModel @Inject constructor() : ViewModel() {


val homeLiveData: MutableLiveData<List<HomeScreenModel>> = MutableLiveData()


fun getHomeItems() {

    Handler().post {

        val homeModleList = listOf(
            HomeScreenModel(R.drawable.ic_launcher_background, MyApplication.instance.getString(R.string.settings))
        )

        homeLiveData.setValue(homeModleList)
    }
}

} * * тысяча двадцать-один

1 Ответ

0 голосов
/ 12 июня 2019

По моему мнению, ваше свойство viewModel, к которому вы пытаетесь получить доступ в viewModel.homeLiveData, затенено абстрактной функцией getViewModel(), которую вы объявляете в BaseActivity. Это потому, что Kotlin считает, что getXyZ() является геттером для поля xyZ, и поэтому, когда вы обращаетесь к viewModel, компилятор думает, что вы хотите вызвать getViewModel, который имеет тип Class<V>. Я предлагаю переименовать либо функцию, либо свойство, и тогда оно должно работать.

...