创建 Hilt viewModel 时出错

Getting error from creating a Hilt viewModel

我试图将一个简单的 viewModel 交给一个可组合的,但每次都会收到这个错误,我不知道它是什么意思:

java.lang.IllegalStateException: Given component holder class com.example.app.MainActivity does not implement interface dagger.hilt.internal.GeneratedComponent or interface dagger.hilt.internal.GeneratedComponentManager

我的Gradle:

    implementation("androidx.hilt:hilt-navigation:1.0.0-beta01")
    implementation("androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03")

我创建了一个 BaseApplication 文件

import android.app.Application
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class BaseApplication: Application()

并在Manifest中设置。

我创建了一个 AppModule 文件:

import android.content.Context
import com.veloce.montageservice.BaseApplication
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

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

    @Singleton
    @Provides
    fun provideApplication(@ApplicationContext app: Context): BaseApplication {
        return app as BaseApplication
    }
}

然后在我的 MainActivity 中设置 @HiltAndroidApp 并创建一个 viewModel 像这样:

@HiltViewModel
class TaskViewModel: ViewModel() {

//code

}

viewModel 在我的 MainActivity 导航中被调用:

 val navController = rememberNavController()
 NavHost(
     navController = navController,
     startDestination = Screens.LoginScreen.route
 ) {
 composable(Screens.ActiveMontageScreen.route) { navBackStackEntry ->
     activeTask?.let {
         val factory =
             HiltViewModelFactory(LocalContext.current, navBackStackEntry)
         val viewModel: TaskViewModel = viewModel("taskViewModel", factory)
         ActiveMontageScreen(
             viewModel = viewModel,
             task = it,
             navigation = navController,
             context = LocalContext.current
         ) {
             removeActiveTask()
         }
     }
 }
}

我真的看不出有什么问题,但我对 Hilt 和 Android 开发还很陌生。 有谁知道问题出在哪里?

据我所知,很少有东西放错了地方,导致了这样的错误。

例如:

  1. 您没有在此处注入上下文 class TaskViewModel(context: Context) 如果您需要 viewmodel 中的上下文,那么您可以使用 AndroidViewModel.

  2. 您正在 AppModule 中创建 BaseApplication 但您没有使用它(可能在其他地方使用)。

您可以通过以下步骤创建这样的视图模型:

  1. 创建 BaseApplication 并在您已经完成的清单中注册。

  2. 创建一个 AndroidViewModel 如下:

    @HiltViewModel
    class TaskViewModel @Inject constructor(
     application: BaseApplication
    ) : AndroidViewModel(application) {
    
     fun test() {
         getApplication<BaseApplication>().getString(R.string.app_name)
     }
    
    }  
    

这里注意 @Inject constructor 的使用,它将从 AppModule.

中获取 BaseApplication class
  1. 在你的 MainActivity 中初始化 viewmodel 像这样:

    @AndroidEntryPoint
    class MainActivity : AppCompatActivity() {
    
     private val viewModel: TaskViewModel by viewModels()
    
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_main)
    
         viewModel.test()
     }
    
    }
    

如果您未能解决任何与刀柄相关的问题,请确保您在 build.gradle

中具有这些依赖项
//Dagger - Hilt
    implementation "com.google.dagger:hilt-android:2.33-beta"
    kapt "com.google.dagger:hilt-android-compiler:2.33-beta"
    implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
    kapt "androidx.hilt:hilt-compiler:1.0.0-beta01"

所以对于你的视图模型,你需要根据你的版本依赖添加注解@Inject 或@ViewModelInject 并像这样创建它

class TaskViewModel @Inject constructor(context: Context) : ViewModel() {
    //code
}

并且在你的activity片段中以这种方式实例化

val taskViewModel: TaskViewModel by viewmodels() 

请检查这些选项:

1- 您必须具有这些依赖项:

//Hilt
def hilt_version = "2.38.1"
implementation("com.google.dagger:hilt-android:$hilt_version")
kapt("com.google.dagger:hilt-android-compiler:$hilt_version")
kapt("androidx.hilt:hilt-compiler:1.0.0")
implementation("androidx.hilt:hilt-navigation-compose:1.0.0-alpha03")
implementation("androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03")

2- 您必须已将此注释添加到您的 activity

@AndroidEntryPoint
class MainActivity : ComponentActivity()

3- 你一定是像这样在你的屏幕中注入了你的 viewModel

@Composable
fun MainScreen(
   viewModel: MainScreenViewModel = hiltViewModel()
)

更新

implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
kapt 'androidx.hilt:hilt-compiler:1.0.0'