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

关于在Dagger 2模块中为OkHttpClient提供HttpLoggingInterceptor实例的两个问题

太叔昊苍
2023-03-14

我正在用Kotlin和Dagger 2开发一个Android项目。我有一个NetworkModule,它应该提供一个单一的Retrofit实例。其中我定义了所有这些提供者函数。

下面的所有代码片段都在网络模块中:

@Module
object NetworkModule {
   ...
}

我的第一个问题:

我想为OkHttpClient提供一个HttpLoggingInterceptor的单例。这是我尝试的:

@Provides
internal fun provideLoggingInterceptor(): Interceptor {
    // compiler error: Unresolved reference 'setLevel', unresolved reference 'Level'
    return HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
}

但我遇到了一个编译错误:未解析引用“setLevel”Unresolved引用“Level”,如何消除它?

我的第二个问题:

我将OkHttpClient提供程序函数定义为:

@Provides
internal fun provideOkHttpClient(loggingInterceptor: Interceptor): OkHttpClient {
        return OkHttpClient.Builder()
                        .addInterceptor(loggingInterceptor)
                        ...
                        .build()
}

我如何才能使它只addInterceptor(loggingInterceptor)当它在调试模型,而在发布模式下不添加HttpLoggingInterceptor在上述提供程序函数?

共有2个答案

公西星海
2023-03-14

要仅在 DEBUG 版本中设置记录器,您有两个选择

  1. 使用基于Build.DEBUG的NONE级别

https://stackoverflow.com/a/23844716/1542667

HttpLoggingInterceptor l = ...;

if (!BuildConfig.DEBUG) {
    l.level(HttpLoggingInterceptor.Level.NONE);
}

https://medium . com/@ birajdpatel/avoid-nullable-dependencies-in-dagger 2-with-binds optional of-c 3 ad 8 a 8 FD e2c

寇甫
2023-03-14

对于您的第一个问题,您确定您有正确的依赖项吗?

或者,既然你在科特林,就这样试试:

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

对于你的第二个问题:

我如何才能使它只有addInterceptor(loggingInterceptor)时,它是在调试模型,而在发布模式不添加HttpLoggingInterceptor在上述提供程序功能?

@Provides
@JvmStatic
@Singleton
fun provideOkHttpClient(interceptor: Interceptor): OkHttpClient{
 val okhttpBuilder = OkHttpClient.Builder() //and every other method after it except build() would return a Builder (Builder pattern)
 if(BuildConfig.DEBUG){
  okHttpBuilder.addInterceptor(interceptor)
 }
 return okHttpBuilder.build()
}

请注意@JvmStatic@Singleton注释,因为您正在使用Singleton。一个用于JVM,另一个用于作用域。

 类似资料:
  • 问题内容: 可以说我有: 我有一个 ApplicationModule ,它需要为 Rec 和 Circle 提供实例: 和 ApplicationComponent : 以这种方式使用代码-无法编译。错误说 错误:(33,20)错误:形状被绑定多次。 对我来说,这是不可行的,因为该组件正试图找到一个实例,并且它找到了两个实例,因此它不知道要返回哪个实例。 我的问题是-我该如何处理? 问题答案:

  • 然而,在有些情况下的应用程序有一个library或子项目也使用DBFlow来管理其数据库时候。这是一个重要的方案,因为它可以让你在用多个应用程序中重复使的数据库。此前,DBFlow不支持这种用例,并试图这样做的时候会失败。 为了解决这个问题,你必须确保数据库的module被加载。幸运的是,这是一个非常简单的过程。 for KAPT: 通过传递,再把它添加到创建 模块。 最后,指示DBFlow加载包

  • 我创建了提供应用程序上下文的模块,我希望在模型层获得上下文。 我在Presenter层注入上下文,它使用,但是当我移到模型层时,Dagger在变量上注入一个值。 注入 主模块

  • 问题内容: 我想要两个相同模型的外键: 我收到如下错误: 字段“ example1”的访问器与相关字段“ Example.test_set”冲突。在“ example1”的定义中添加一个related_name参数。 问题答案: 尝试使用:

  • 问题内容: 嗨,在一个测试套件上,我看来我有2个同一个提供程序的活动实例,一个实例用于实现,另一个实例用于实际实现。 我的结论基于以下事实:在测试中,我尝试用jest.fn调用替换方法,但仍然在我正在测试的服务上,该方法仍指向原始实现。 更奇怪的是,我能够模拟执行完全相同过程的另一个服务,好像取决于这些服务的注入方式(它们来自容器图中的位置)是否起作用。 我将尝试分享一些片段,但是,当然,只有一个

  • 问题内容: 从AngularJS 1.0.7 升级到 1.2.0rc1 时收到此错误。 问题答案: ngRoute模块不再是核心文件的一部分。如果继续使用$ routeProvider,则现在需要在HTML中包括: API参考 您还必须为您的应用程序添加依赖项: 相反,如果您打算使用或类似方法,则只需 从模块中删除依赖项,然后将其替换为相关的选择提供者(例如)。然后,您将使用依赖项: