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

我无法使用希尔特注入片段视图模型

丰赞
2023-03-14

我试图使用hilt将viewmodel注入片段,为此我创建了两个模块,一个用于我的网络组件,另一个用于角色的viewmodel。

网络模块安装在单例组件中,我需要将字符模块安装在FragmentComponent中,以通过“by view模型()”获取视图模型

我的活动和片段用“@AndroidEntryPoint”注释,我的应用程序用“@HiltAndroidApp”注释。我的模块是:

@Module
@InstallIn(SingletonComponent::class)
class NetworkModule {

    @Singleton
    @Provides
    fun provideLoggingInterceptor(): HttpLoggingInterceptor {
        val loggingInterceptor = HttpLoggingInterceptor()
        loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
        return loggingInterceptor
    }

    @Singleton
    @Provides
    fun provideAuthorizationInterceptor(): AuthorizationInterceptor =
        AuthorizationInterceptor()

    @Singleton
    @Provides
    fun provideInterceptors(
        loggingInterceptor: HttpLoggingInterceptor,
        authorizationInterceptor: AuthorizationInterceptor
    ): HttpInterceptors = HttpInterceptors(
        listOf(
            loggingInterceptor,
            authorizationInterceptor
        )
    )

    @Singleton
    @Provides
    fun provideTimeouts(): HttpTimeouts = HttpTimeouts()

    @Singleton
    @Provides
    fun provideHttpClient(
        timeouts: HttpTimeouts,
        interceptors: HttpInterceptors
    ): HttpBuilderFactory = HttpClientBuilderFactory(timeouts, interceptors)

    @Singleton
    @Provides
    fun provideGsonConverter(): GsonFactory = GsonBuilderFactory()

    @Singleton
    @Provides
    fun provideHttpServiceProvider(
        httpBuilderFactory: HttpBuilderFactory,
        gsonFactory: GsonFactory
    ): HttpProvider = HttpServiceProvider(httpBuilderFactory, gsonFactory)
}
@Module
@InstallIn(FragmentComponent::class)
class CharacterListModule {

    @Singleton
    @Provides
    fun provideCharacterMapper(): Mapper<CharacterDataContainer, PaginatedCharacters> =
        PaginatedCharactersMapper()

    @Singleton
    @Provides
    fun provideCharacterServices(
        httpServiceProvider: HttpProvider
    ): CharacterServices = httpServiceProvider.createService(CharacterServices::class.java)

    @Singleton
    @Provides
    fun provideCharacterListRemoteSource(
        characterServices: CharacterServices,
        characterMapper: Mapper<CharacterDataContainer, PaginatedCharacters>
    ): CharacterListSource = CharacterListRemoteSourceImpl(
        characterServices,
        characterMapper
    )

    @Singleton
    @Provides
    fun provideCharacterListRepository(
        characterListRemoteSource: CharacterListSource
    ): CharacterListRepository = CharacterListRepositoryImpl(
        characterListRemoteSource
    )

    @Singleton
    @Provides
    fun provideCoroutineDispatcher() = Dispatchers.IO

    @Singleton
    @Provides
    fun provideCharacterListUseCase(
        coroutineDispatcher: CoroutineDispatcher,
        characterListRepository: CharacterListRepository
    ) = CharacterListUseCase(
        coroutineDispatcher,
        characterListRepository
    )

    @Singleton
    @Provides
    fun provideCharacterUIMapper(): Mapper<Character, CharacterUI> = CharacterUIMapper()
}

我的视图模型是:

@HiltViewModel
class CharacterListViewModel @Inject constructor(
    private val characterListUseCase: CharacterListUseCase,
    private val characterUIMapper: Mapper<Character, CharacterUI>
) : ViewModel() {

此外,当我在这两种情况下都使用SingletonComponent时,应用程序运行良好,但是当尝试使用FragmentComponent失败时:

最后我的依赖是:

    object Hilt {

        internal object Versions {
            const val hilt = "2.33-beta"
            const val hiltViewModel = "1.0.0-alpha01"
        }

        const val hilt = "com.google.dagger:hilt-android:${Versions.hilt}"
        const val hiltCompiler = "com.google.dagger:hilt-android-compiler:${Versions.hilt}"
        const val hiltViewModel = "androidx.hilt:hilt-lifecycle-viewmodel:${Versions.hiltViewModel}"
        const val hiltViewModelCompiler = "androidx.hilt:hilt-compiler:${Versions.hiltViewModel}"
    }

共有1个答案

袁桐
2023-03-14

顾名思义,“FragmentComponent”(s)只有在碎片存在的时候才会存在。您不能将片段范围的内容注入视图模型,因为视图模型的生命周期超过了其片段生命周期。将“FragmentScoped”更改为“SingletonScoped”。

在使用示波器之前,请先阅读官方文档。99%的时候,使用“SingletonComponent”就足够了

 类似资料:
  • 我正在使用Dagger-Hilt在我的Android项目中进行依赖注入,现在我遇到了这样的情况,我有一个基本的抽象片段 在这里,我有一个依赖项,即。我正在尝试做的是将注入到BaseViewModel中,以便在及其所有子项中可用。 < li >我尝试的第一种方法是使用构造函数注入,并将其注入到子节点,然后使用构造函数将其传递给超级节点。 这种方法工作得很好,但是我不需要将依赖关系从传递到类,我需要将

  • 我正在使用更新动作栏中的标题 共享视图模型 主要活动观察者 使用下面的代码似乎会在< code>Fragment中创建新的实例(在调试器中检查): 但似乎是这样的 文章参考 这是应该这样做还是我做错了什么? 谢谢你!

  • 如何注入抽象类我有一个抽象类 我尝试使用< code>@Module和< code>@Binds注释来初始化该类的对象。但这并不能创建并抛出一个错误。 但这给出了错误。我犯了什么错误?请您告诉我如何为抽象类创建。我们如何注入抽象类?从文档中,它说。有时,不能注入构造函数。发生这种情况可能有多种原因。例如,不能构造函数注入接口。也不能构造函数注入不属于的类型,例如外部库中的类。在这些情况下,您可以使

  • 我使用在之间切换,但是我可以使用在简单XML布局之间切换吗? 这是ViewPager的页面,用于在片段之间滑动: 这是我的提示片段: 如何修改代码以使用视图而不是片段?

  • 我试图在另一个片段中显示一个谷歌地图片段,但是我不能操纵地图,我已经把我看到的所有步骤都留档了,但是我不能操纵我的地图。 XML代码: 类片段代码: 主要活动类别代码: } 在调用getMapAsync()后,编辑以下堆栈跟踪: 空指针错误: 12-18 19:51:50.056 11265-11265/ar.com.taxiexpress.taxiexpressE/AndroidRuntime:

  • 我有一个抽屉布局片段(在主活动中),它显示了一个可扩展的列表,当我点击扩展项目的子项时,会出现一个弹出窗口。这个具有自定义布局的弹出窗口包含文本视图、列表视图和2个按钮。 我给列表视图提供了id:,并在onCreateView函数中从视图组返回空值,如下所示: 并使类扩展的片段不是列表片段 我执行了前面的3个步骤,以避免出现“Content has view with id attribute'a