1

我正在学习 Hilt,但遇到了一个错误,即我的 ViewModel 没有被实例化。我使用委托来实例化我的 ViewModel。已关注有关此问题的堆栈溢出答案以及 https://medium.com/mobile-app-development-publication/injecting-viewmodel-with-dagger-hilt-54ca2e433865

无法弄清楚我在做什么错。任何帮助将不胜感激。

任务片段.kt

@AndroidEntryPoint
class TaskFragment : Fragment(R.layout.fragment_tasks) {

private val viewModel : TasksViewModel by viewModels()

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

    val binding = FragmentTasksBinding.bind(view)

任务视图模型.kt

@HiltViewModel
class TasksViewModel @Inject constructor(
private val taskDao: TaskDao)
 : ViewModel() {

应用模块.kt

@Module
@InstallIn(SingletonComponent::class)
object AppModule {

@Singleton
@Provides
fun providesDatabase(
    app : Application,
    callback : TaskDatabase.Callback
) = Room.databaseBuilder(app,
        TaskDatabase::class.java,
        "task_database"
    ).fallbackToDestructiveMigration()
    .addCallback(callback)
    .build()

@Provides
fun providesTaskDao(db : TaskDatabase) = db.taskDao()

build.gradle(:app)

// Fragment
implementation "androidx.fragment:fragment-ktx:$fragmentVersion"

// Hilt
implementation "com.google.dagger:hilt-android:2.28.3-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.28.3-alpha"
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
kapt "androidx.hilt:hilt-compiler:1.0.0-alpha03"

build.gradle(项目)

classpath "com.google.dagger:hilt-android-gradle-plugin:2.28.3-alpha"

应用类

@HiltAndroidApp
class TaskPlannerApplication : Application(){
}

MainActivity.kt

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
 }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.MainActivity">

<androidx.fragment.app.FragmentContainerView
    android:id="@+id/nav_host_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:defaultNavHost="true"
    app:navGraph="@navigation/nav_graph"/>

   </androidx.constraintlayout.widget.ConstraintLayout>

收到以下错误

2021-10-28 16:33:38.387 24375-24375/com.example.taskplanner E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.taskplanner, PID: 24375
java.lang.RuntimeException: Cannot create an instance of class com.example.taskplanner.ui.tasks.TasksViewModel
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:188)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:238)
    at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:112)
    at androidx.hilt.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:81)
    at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:69)
    at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:84)
    at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:108)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:171)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:139)
    at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:44)
    at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:31)
    at com.example.taskplanner.ui.tasks.TaskFragment.getViewModel(TaskFragment.kt:15)
    at com.example.taskplanner.ui.tasks.TaskFragment.onViewCreated(TaskFragment.kt:32)
    at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3019)
    at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:551)
    at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
    at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1374)
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2841)
    at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:2777)
    at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3020)
    at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:551)
    at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
    at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1374)
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2841)
    at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2784)
    at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:262)
    at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:478)
    at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1455)
    at android.app.Activity.performStart(Activity.java:8076)
    at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3664)
    at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
    at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2214)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loopOnce(Looper.java:201)
    at android.os.Looper.loop(Looper.java:288)
    at android.app.ActivityThread.main(ActivityThread.java:7842)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
    2021-10-28 16:33:38.387 24375-24375/com.example.taskplanner E/AndroidRuntime: Caused by: 
    java.lang.InstantiationException: 
    java.lang.Class<com.example.taskplanner.ui.tasks.TasksViewModel> has no zero argument 
    constructor
    at java.lang.Class.newInstance(Native Method)
    at 
    androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:186)
        ... 44 more
4

0 回答 0