无法创建ViewModel类的实例

时间:2020-06-14 07:56:34

标签: android android-studio kotlin mvvm viewmodel

我正在使用MVVM架构,但我不明白为什么会出现此错误?我的其他班级具有相同的结构,并且工作得很好。在下面,我共享了我的Fragment类和ViewModel类的代码以及错误

错误

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.beyond.sellandtrack, PID: 5380
java.lang.RuntimeException: Cannot create an instance of class com.beyond.sellandtrack.screens.dashboard.DashboardViewModel
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:275)
    at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:106)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
    at com.beyond.sellandtrack.screens.dashboard.DashboardFragment.onCreateView(DashboardFragment.kt:33)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
    at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
    at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
    at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
    at android.os.Handler.handleCallback(Handler.java:809)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:166)
    at android.app.ActivityThread.main(ActivityThread.java:7555)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.newInstance0(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:267)
    at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:106) 
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185) 
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150) 
    at com.beyond.sellandtrack.screens.dashboard.DashboardFragment.onCreateView(DashboardFragment.kt:33) 
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698) 
    at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320) 
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187) 
    at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224) 
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997) 
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953) 
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849) 
    at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413) 
    at android.os.Handler.handleCallback(Handler.java:809) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:166) 
    at android.app.ActivityThread.main(ActivityThread.java:7555) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963) 
 Caused by: kotlin.KotlinNullPointerException
    at com.beyond.sellandtrack.screens.dashboard.DashboardViewModel.<init>(DashboardViewModel.kt:20)
    at java.lang.reflect.Constructor.newInstance0(Native Method) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:334) 
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:267) 
    at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:106) 
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185) 
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150) 
    at com.beyond.sellandtrack.screens.dashboard.DashboardFragment.onCreateView(DashboardFragment.kt:33) 
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698) 
    at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320) 
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187) 
    at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224) 
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997) 
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953) 
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849) 
    at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413) 
    at android.os.Handler.handleCallback(Handler.java:809) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:166) 
    at android.app.ActivityThread.main(ActivityThread.java:7555) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963) 

I / Process:正在发送信号。 PID:5380 SIG:9 与目标VM断开连接,地址:“ localhost:8600”,传输:“ socket”

片段类

class DashboardFragment : Fragment() {
    private lateinit var dashboardViewModel: DashboardViewModel
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val binding = DataBindingUtil.inflate<FragmentDashboardBinding>(
            inflater,R.layout.fragment_dashboard,container,false
        )

    dashboardViewModel= ViewModelProvider(this).get(DashboardViewModel::class.java)

ViewModel类

class DashboardViewModel(application: Application) : AndroidViewModel(application) {
lateinit var user: User
private var auth : FirebaseAuth = FirebaseAuth.getInstance()
private var repository: Repository = Repository()

init {
    user =  repository.getUserData()!!
}

3 个答案:

答案 0 :(得分:1)

您需要检查getUserData是否不为null。在初始化块中

init {
    user =  repository.getUserData()!! //you are forcefully marking this as non null
}

检查 getUserData()是否在此处返回null。很有可能是null,这就是为什么它失败了

答案 1 :(得分:0)

我认为您的DashboardViewModel类应该从ViewModel()而不是AndroidViewModel()扩展

实现“ androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0”

import androidx.lifecycle.ViewModel
class DashboardViewModel : ViewModel()

答案 2 :(得分:0)

我认为您应该尝试Koin注入并创建ViewModel实例。 它易于使用且语法简短。 https://insert-koin.io/

// Injected by constructor
class MyViewModel(val repo : MyRepository) : ViewModel()

// declared ViewModel using the viewModel keyword
val myModule : Module = module {
  viewModel { MyViewModel(get()) } 
  single { MyRepository() }
}

// Just get it
class MyActivity() : AppCompatActivity() {

  // lazy inject MyViewModel
  val myViewModel : MyViewModel by viewModel()
}