简体   繁体   English

无法创建 ViewModel class 的实例

[英]Can Not create Instance of ViewModel class

I am working with MVVM architecture and I don't get it why am I having this error?我正在使用 MVVM 架构,但我不明白为什么会出现此错误? My other classes have the same structure and they are working perfectly fine.我的其他课程具有相同的结构,并且运行良好。 Below i have shared the code for both my Fragment Class and the ViewModel Class along with the error下面我分享了我的 Fragment Class 和 ViewModel Class 的代码以及错误

Error错误

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: Sending signal. I/Process:发送信号。 PID: 5380 SIG: 9 Disconnected from the target VM, address: 'localhost:8600', transport: 'socket' PID:5380 SIG:9 与目标 VM 断开连接,地址:'localhost:8600',传输:'socket'

Fragment Class片段 Class

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查看型号 Class

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()!!
}

You need to check if the getUserData is not null.您需要检查 getUserData 是否不是 null。 in init block在初始化块中

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

check if the getUserData() is returning null here or not.检查getUserData()是否在此处返回 null。 Which is null most probably and that's why it's failing最有可能是 null 这就是它失败的原因

I think you should try Koin to inject and create instance of ViewModel.我认为您应该尝试Koin来注入和创建 ViewModel 的实例。 Its easy to use and syntax is brief.它易于使用且语法简洁。 https://insert-koin.io/ . 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()
}

I think your DashboardViewModel class should extending from ViewModel() not AndroidViewModel()我认为您的 DashboardViewModel class 应该从 ViewModel() 而不是 AndroidViewModel() 扩展

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM