我需要为 Storefront API 提供图形客户端,但我只能在进行网络调用后构建客户端。
@Provides
@Singleton
fun getGraphClient(context: Context, client: Client): GraphClient {
return GraphClient.build(
context = context,
shopDomain = client.shopifyDomain,
accessToken = client.storefrontAccessToken
)
}
在进行网络调用后如何让客户端将其传递给 hilt 以返回图形客户端?
我通过手动依赖注入解决了这个问题,如下所示:
@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 {
....
}
你的解决方案根本不是希尔特方法。你可以在没有@Module接口的情况下做到这一点。您应该像以前一样提供 GraphClient 并按如下方式注入:
类 SomeRepositoryImpl @Inject 构造函数( @ApplicationContext val applicationContext:上下文, private Lateinit val graphClient:GraphClient? ) : 一些存储库 {
....
}
如果您不熟悉 kotlin“lateinit”,那么您会发现引用只有在第一次在某个地方使用时才会实例化。 我添加了 Lateinit 关键字并修改了您提到的一些代码片段。 请让我知道这是否有效,如果您觉得它没有帮助,请在评论中告诉我。我一定会解决你的刀柄问题。
由于您的帖子很旧,您可能已经知道更好的方法。但我只是不想让任何人让其他人感到困惑,因为你的解决方案不是真正的希尔特方式。所以我想我应该指导您找到专家在生产代码中所做的解决方案。
编码快乐!