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

不能为匕首注射提供上下文

唐彬炳
2023-03-14

我是新手,我想在我的课上注入上下文和网络(使用改型)。

这是我到目前为止的代码:

   @Module
// Safe here as we are dealing with a Dagger 2 module
@Suppress("unused")
object NetworkModule {
    @Provides
    @Reusable
    @JvmStatic
    internal fun provideMainApi(retrofit: Retrofit): MainApi {
        return retrofit.create(MainApi::class.java)
    }

    @Provides
    @Reusable
    @JvmStatic
    internal fun provideRetrofitInterface(): Retrofit {
        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY
        val client = OkHttpClient.Builder().addInterceptor(interceptor).build()

        return Retrofit.Builder()
            .baseUrl(Constants.baseUrl)
            .addConverterFactory(MoshiConverterFactory.create())
            .addCallAdapterFactory(CoroutineCallAdapterFactory())
            .client(client)
            .build()
    }
}

@Module
class AppModule(private val app: Application) {
    @Provides
    @Singleton
    fun provideApplication() = app
}

这是我的组件:

    @Singleton
@dagger.Component(modules = arrayOf(AppModule::class, NetworkModule::class))
interface AppComponent {

    ///for injecting retrofit network
    fun injectMain(mainRepository: MainRepository)

    @dagger.Component.Builder
    interface Builder {
        fun build(): AppComponent

        fun networkModule(networkModule: NetworkModule): Builder
        fun appModule(appModule: AppModule):Builder
    }

}
    open class BaseRepository {
    private val injector: AppComponent = DaggerAppComponent
        .builder()
        .networkModule(NetworkModule)
        .build()

    init {
        inject()
    }

    private fun inject() {
        when (this) {
            is MainRepository -> injector.injectMain(this)
        }
    }

}

但是我如何在应用程序类中使用注入器,这是没有意义的

共有1个答案

芮念
2023-03-14

如果我是你,我会通过这个项目,看看那里的一切是如何完成的。

https://github.com/google/iosched

这里解释了这个项目的内容:

此外,您可以检查匕首分支ot这个项目:

https://github.com/android/architecture-示例

这一切都是由何塞·阿尔塞雷卡和其他一些人完成的。这些是谷歌关于Android的指导方针,你的大部分问题都会有答案。

class Repostory @Inject constructor(
private val dependency1: Dependency1 
) {}

class Activity {
@Inject lateinit var dependency2: Dependency2
}
 类似资料:
  • 承认,匕首是强硬的,我正试图注射改型。我注入了Context和SharedPreferences,它工作得很好,但改型破坏了这一切。它可以识别DaggerRetrofitComponent类,但不能找到DaggerAppComponent。

  • 这很好,但是如果我使用全局组件甚至子组件中的一个模块,那么应该传入上下文。因此,这意味着如果我用匕首注入演示器,它将被绑定到ApplicationContext。这使得作为JUnit进行测试变得困难。Android代码不应该在演示器中。 所以我想问的是,最好的做法是只在活动、片段、广播接收器和服务中使用匕首吗?就mvp架构而言,这就是。另一个解决方案是设计另一个dagger组件,但不是与appco

  • 我使用Flink(最新的git)从Kafka流到卡桑德拉。为了简化单元测试,我通过dagger添加了依赖注入。 ObjectGraph似乎正确地设置了自己,但是“内部对象”被Flink标记为“不可序列化”。如果我直接包括这些对象,它们会起作用--那么有什么区别呢? 通过Dagger Lazy 实例化的对象也不会序列化。 线程“main”org.apache.flink.api.common.inv

  • 嗨,我试图找出如何做一个干净的第三方注入。我想把奥托巴士适当地注入我的服务和活动中。我看到你可以在构造函数上使用inject,但是由于我没有任何Android构造函数,我想知道我如何才能inject我的总线。 Iv创建了一个模块,该模块提供了总线的新实例。Iv还创建了一个组件,该组件具有总线对象的接口。 但是我如何才能得到这个注入,我应该在哪里启动我的图表? 我想做的就是: 我看了这个例子(htt

  • 我正在MVVM和Dagger 2中制作小型Android应用程序。但是我不知道如何正确使用Dagger 2,以防我有一个活动和两个片段。这两个片段都是ViewModels的所有者。我已经将ViewModelProvider注入了片段,但我仍然对这个解决方案感到困惑。也许有人会改进我的代码? 活动: 第一个片段: 第二个片段: 在这种情况下,两个片段都可以工作,但我只能在其中一个片段中注入ViewM

  • 我不熟悉匕首和莫基托。我尝试在单元测试中使用Dagger模块中定义的构造函数,以便使用默认值创建对象。 这是模块: @模块类自动关闭倒计时模块{ 这就是我在单元测试中模拟AutoCloseCountDown类的方法: @RunWith(MockitoJUnitRunner.class)公共类AutoCloseCountDownTimerTest{ 如何实现自动关闭的CountDownTimer将在