Welcome to MLink Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
848 views
in Technique[技术] by (71.8m points)

android - Cannot create an instance of class ViewModel class

  • I am trying to follow MVVM pattern in my Android app but getting error while creating an instance of ViewModel.
  • Error: Cannot create an instance of class DemoViewModel class.

Here is my code:

DemoFragment.kt:

class DemoFragment : Fragment(R.layout.fragment_demo) {

    lateinit var mViewModel: DemoViewModel

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        mViewModel=ViewModelProvider(this).get(DemoViewModel::class.java)
        mViewModel.getSomeData()
    }
}

DemoViewModel.kt:

class DemoViewModel(val demoRepository: DemoRepository) : ViewModel() {

    fun getSomeData() {
        Log.d("DemoViewModel", "${demoRepository.getData()}")
    }
}

DemoRepository.kt:

interface DemoRepository {
    fun getData(): Boolean
}

class DemoImpl : DemoRepository {
    override fun getData() = false
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You need to use ViewModelFactory. Because there is "demoRepository" in your primary builder.

    class DemoViewModelFactory constructor(private val repository:DemoImpl): ViewModelProvider.Factory {

     override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return if (modelClass.isAssignableFrom(DemoViewModel::class.java!!)) {
            DemoViewModel(this.repository) as T
        } else {
            throw IllegalArgumentException("ViewModel Not Found")
        }
    }
}

Usage

viewModel = ViewModelProvider(this, DemoViewModelFactory(repositoryObject)).get(DemoViewModel::class.java)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to MLink Developer Q&A Community for programmer and developer-Open, Learning and Share

1.2m questions

2.1m answers

5 comments

56.5k users

...