情况是这样的:
我正在使用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
2条答案
按热度按时间4uqofj5v1#
我认为当
ViewModel
被初始化时,hilt会检查依赖关系图/树,因为它有一个参数也需要依赖关系,即CaptureRepository
,所以hilt也会查找它,但因为您使用的是@Bind
,afaik,这些依赖关系也应该定义@Inject
注解。我能够重现您的问题,并设法修复它,通过指定注入到您的存储库实现
另一种解决方法是让DI模块有一个伴随对象,并定义hilt如何
provide
依赖项,而无需在存储库impl中指定@Inject
。vs3odd8k2#
许多小时后我发现了一个解决办法:我必须在Activity中使用
@AndroidEntryPoint
注解。问题是,由于我对Compose、Hilt和Navigation都是新手,所以我不知道应该使用什么结构:我希望使用单个Activity,而不是使用Fragments进行导航,我希望使用Composables。
AndroidDocsforNavigation提供了我想要的结构的示例;我设置的一切都是一样的,但唯一缺少的是注解。我认为它是不必要的,因为我不需要将依赖关系直接注入到Activity中,但最终这是bug的根源,这是一个困难的问题,因为应用程序崩溃时没有显示任何错误