Hilt 在进行网络调用后提供依赖

问题描述 投票:0回答:2

我需要为 Storefront API 提供图形客户端,但我只能在进行网络调用后构建客户端。

@Provides
@Singleton
fun getGraphClient(context: Context, client: Client): GraphClient {
    return GraphClient.build(
        context = context,
        shopDomain = client.shopifyDomain,
        accessToken = client.storefrontAccessToken
    )
}

在进行网络调用后如何让客户端将其传递给 hilt 以返回图形客户端?

android dependency-injection dagger-2 dagger-hilt
2个回答
0
投票

我通过手动依赖注入解决了这个问题,如下所示:


@Module
@InstallIn(SingletonComponent::class)
object AppModule {

    var graphClient: GraphClient? = null

    fun provideGraphClient(context: Context, client: Client) {
        graphClient = GraphClient.build(
            context = context,
            shopDomain = client.shopifyDomain,
            accessToken = client.storefrontAccessToken
        )
    }
}

然后在 API 调用之后

AppModule.provideGraphClient(context, client)

并像这样注入任何存储库:

class SomeRepositoryImpl @Inject constructor(
    @ApplicationContext val applicationContext: Context,
    private val graphClient: GraphClient? = AppModule.graphClient
) : SomeRepository {

....

}

0
投票

你的解决方案根本不是希尔特方法。你可以在没有@Module接口的情况下做到这一点。您应该像以前一样提供 GraphClient 并按如下方式注入:

类 SomeRepositoryImpl @Inject 构造函数( @ApplicationContext val applicationContext:上下文, private Lateinit val graphClient:GraphClient? ) : 一些存储库 {

....

}

如果您不熟悉 kotlin“lateinit”,那么您会发现引用只有在第一次在某个地方使用时才会实例化。 我添加了 Lateinit 关键字并修改了您提到的一些代码片段。 请让我知道这是否有效,如果您觉得它没有帮助,请在评论中告诉我。我一定会解决你的刀柄问题。

由于您的帖子很旧,您可能已经知道更好的方法。但我只是不想让任何人让其他人感到困惑,因为你的解决方案不是真正的希尔特方式。所以我想我应该指导您找到专家在生产代码中所做的解决方案。

编码快乐!

© www.soinside.com 2019 - 2024. All rights reserved.