android - 创建 Hilt viewModel 时出错

标签 android kotlin android-jetpack-compose dagger-hilt

我试图将一个简单的 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()
并将其设置在 list 中。
我创建了一个 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
    }
}

然后设置@HiltAndroidApp在我的MainActivity并创建了 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 开发非常缺乏经验。
有谁知道是什么问题?

最佳答案

正如我所看到的,很少有东西放错地方,这会导致这样的错误。
例如:

  • 你没有在这里注入(inject)上下文 class TaskViewModel(context: Context)如果您需要 viewmodel 中的上下文那么你可以使用AndroidViewModel .
  • 您正在创建 BaseApplicationAppModule但你没有使用它(也许在其他地方使用)。

  • 您可以通过以下步骤创建这样的 View 模型:
  • 创建 BaseApplication并在 list 中注册,您已经完成了。
  • 创建 AndroidViewModel如下:
    @HiltViewModel
    class TaskViewModel @Inject constructor(
     application: BaseApplication
    ) : AndroidViewModel(application) {
    
     fun test() {
         getApplication<BaseApplication>().getString(R.string.app_name)
     }
    
    }  
    

  • 这里注意使用@Inject constructor这将采用 BaseApplication来自 AppModule 的类(class).
  • 在您的 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"
    

    关于android - 创建 Hilt viewModel 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67319542/

    相关文章:

    spring-boot - 使用Gradle(Kotlin)应用程序部署Spring Boot-找不到jar

    android - 如何 fillMaxSize() Box() inside row - Compose

    android - 从android插入坐标到mysql

    android - .so(共享库)文件中的符号名称是如何生成的?

    android - 我需要做什么才能为仅影响 TextView 的 Activity 制作样式?

    kotlin - 如何在 Kotlin 中将串联转换为模板

    Android:尝试使用数据绑定(bind)设置 CardView 的布局权重

    android - 如何在 Jetpack Compose 中使用图像占位符进行预览

    android - 获取用户在 Jetpack Compose Android 中的当前位置

    android - 使用引导类加载器找不到类;没有可用的堆栈跟踪