当前位置: 首页 > 知识库问答 >
问题:

Dagger Hilt错误注入ActivityContext

漆雕疏珂
2023-03-14

我正在用dagger-hilt注入一个依赖于ViewModel中的@ActivityContext的类,该模块安装在ActivityComponent中,作用域为activity,每当我尝试编译时,它都会向我抛出一个错误。供您参考,我还有其他模块,其中ActivityRetainedComponent和SingletonComponent注入了@ApplicationContext。

现在我想弄清楚这个错误是什么意思。

error: [Dagger/MissingBinding] com.rober.fileshortcut_whereismyfile.utils.PermissionsUtils cannot be provided without an @Inject constructor or an @Provides-annotated method.
  public abstract static class SingletonC implements App_GeneratedInjector,
                         ^
      com.rober.fileshortcut_whereismyfile.utils.PermissionsUtils is injected at
          com.rober.fileshortcut_whereismyfile.ui.fragments.filefragment.FileViewModel(�, permissionsUtils, �)
      com.rober.fileshortcut_whereismyfile.ui.fragments.filefragment.FileViewModel is injected at
          com.rober.fileshortcut_whereismyfile.ui.fragments.filefragment.FileViewModel_HiltModules.BindsModule.binds(vm)
      @dagger.hilt.android.internal.lifecycle.HiltViewModelMap java.util.Map<java.lang.String,javax.inject.Provider<androidx.lifecycle.ViewModel>> is requested at
          dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [com.rober.fileshortcut_whereismyfile.App_HiltComponents.SingletonC ? com.rober.fileshortcut_whereismyfile.App_HiltComponents.ActivityRetainedC ? com.rober.fileshortcut_whereismyfile.App_HiltComponents.ViewModelC]

代码在这里(我不认为这里有什么问题)

@Module
@InstallIn(ActivityComponent::class)
object PermissionModule {

    @ExperimentalCoroutinesApi
    @Provides
    @ActivityScoped
    fun providePermissionsHelper(
        @ActivityContext context: Context,
    ) = PermissionsUtils(context)
}
@HiltViewModel
@ExperimentalCoroutinesApi
class FileViewModel @Inject constructor(
    private val class1: Class1,
    private val class2: Class2,
    private val class3: Class3,
    private val permissionsUtils: PermissionsUtils //Here's the one I'm injecting
)

编辑2:我得出的结论是不可能的,因为您是在ViewModel中安装的,并且与ViewModel一起工作的组件singleton/activityreported/ViewModel,所以没有办法在ViewModel中注入activitycontext,因为它需要组件@activitycomponent,而这是ViewModelComponent下面的一个级别。

来源:https://dagger.dev/hilt/components#fn:1

共有1个答案

相化
2023-03-14

因此,没有办法在ViewModel中注入ActivityContext,因为它需要组件@ActivityComponent,而这是ViewModelComponent下面的一个级别。

你搞定了。

从生命周期的角度考虑dagger/hilt组件(和作用域)。在Android中,viewmodel的生命周期比包含activityfragment的生命周期长。这就是这门课的重点,只是名字不太好。将其视为RetainedInstanceAnObjectThatSurvivesActivityConfigurationChanges可能会有所帮助。是的,它们不像viewmodel那么吸引人。

Hilt的组件层次结构使您更难创建内存泄漏。所有这些都发生在编译时,与基于运行时的解决方案相比,这会提供更快的反馈。比你的用户通过崩溃发现要好得多!

 类似资料:
  • 我有一些执行数据库操作API。每当我将代码上传到checkmarx时,我会得到以下错误,并将其标记为高漏洞错误,有人能帮助我吗? 应用程序的CreateDatabaseAndMapToDomain方法使用executeQuery执行SQL查询,位于daas-springboot-checkmarxintegration\src\main\java\com\it\daas\apis\service\

  • 我有两个组件:AppComponent和ApiComponent。我想在ApiComponent和注入了ApiComponent的对象中使用由AppComponent提供的依赖项。因此,我将ApiComponent视为AppComponent的子组件。我已经声明为中的依赖项,使用指令: 以下是我的AppComponent: 我的API模块的相关部分如下所示: 我在IntentService 1的o

  • 这是我的gradle档案: 在添加了Atmospher-Jursey之后,我得到了以下错误:

  • 问题内容: 我从客户端获取 SUBSCRIPTION_JSON ,将其转换为String,然后使用gson库将其设置为Model Object。在Fortify安全性上运行代码时,它在以下代码上给我Json注入错误,并显示以下消息: 这是错误: SubscriptionAction.java ActionHelper.java SUBSCRIPTION_JSON- > 问题答案: 在将其设置为Mo

  • 我正在尝试将 HttpServlet 请求注入到我的泽西岛资源类中。我得到错误“”。我使用的是 Java 8。 据我所知,我正在做一个完全普通的球衣应用程序。以下是全部代码: 它阻塞了@Context HttpServletRequest部分。如果我将HttpServletRequest设置为一个字段,它将自动失败,请求为空。 以下是依赖关系。jersey.version为2.27: 这是完整的堆

  • 有一个非常有趣的错误,我不知道如何解决。在我注册为新用户并单击submit按钮后,我得到以下错误块: 注意:在第153行的public_html/mystore/系统/库/mail.php中遇到非格式良好的数值注意:在第153行的public_html/mystore/系统/库/mail.php中遇到非格式良好的数值警告:无法修改标头信息-标头已发送由(输出开始于public_html/mysto