Android:Hilt没有使用模块,这可能是应用程序崩溃而不显示任何信息的原因

ivqmmu1c  于 2022-12-02  发布在  Android
关注(0)|答案(2)|浏览(169)

情况是这样的:
我正在使用Compose、Hilt、Navigation和ViewModel。我正在尝试通过Hilt在可组合屏幕中获取ViewModel的示例:
第一个
我通过在模块中定义CaptureRepository来获取它的示例:

@Module
@InstallIn(ViewModelComponent::class)
abstract class CaptureModule {

    @Binds
    abstract fun bindCaptureLocalDataSource(
        captureLocalDataSourceImpl: CaptureLocalDataSourceImpl
    ): CaptureLocalDataSource

    @Binds
    abstract fun bindCaptureRepository(
        captureRepositoryImpl: CaptureRepositoryImpl
    ): CaptureRepository
}

问题在于,CaptureModule在Android Studio中显示时好像没有使用示例。
我可以毫无问题地构建和运行应用程序,但是当它应该显示HomeScreen时,它崩溃了。让我感到压力很大,很难找到解决方案的是,Run 选项卡和 Logcat 中都没有错误。
如果我从HomeViewModel的构造函数中删除updateCaptureUseCase,则应用程序将正常工作,并且能够无错误地访问HomeScreen。由于updateCaptureUseCase依赖于CaptureRepository,并且它在CaptureModule中定义,但此模块未显示使用示例,因此我怀疑错误来自Hilt和ViewModel

4uqofj5v

4uqofj5v1#

我认为当ViewModel被初始化时,hilt会检查依赖关系图/树,因为它有一个参数也需要依赖关系,即CaptureRepository,所以hilt也会查找它,但因为您使用的是@Bind,afaik,这些依赖关系也应该定义@Inject注解。
我能够重现您的问题,并设法修复它,通过指定注入到您的存储库实现

class CaptureRepositoryImpl @Inject constructor(): CaptureRepository

另一种解决方法是让DI模块有一个伴随对象,并定义hilt如何provide依赖项,而无需在存储库impl中指定@Inject

@Module
@InstallIn(ViewModelComponent::class)
abstract class CaptureModule {
   
    ...
    companion object {

        @Provides
         fun provideHomePresenter(): CaptureRepository {
            return CaptureRepositoryImpl()
        }
    }
}
vs3odd8k

vs3odd8k2#

许多小时后我发现了一个解决办法:我必须在Activity中使用@AndroidEntryPoint注解。
问题是,由于我对Compose、Hilt和Navigation都是新手,所以我不知道应该使用什么结构:我希望使用单个Activity,而不是使用Fragments进行导航,我希望使用Composables。
AndroidDocsforNavigation提供了我想要的结构的示例;我设置的一切都是一样的,但唯一缺少的是注解。我认为它是不必要的,因为我不需要将依赖关系直接注入到Activity中,但最终这是bug的根源,这是一个困难的问题,因为应用程序崩溃时没有显示任何错误

相关问题