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

绳子在匕首中绑了多次

姚雅珺
2023-03-14

我在匕首中注入弦有问题

这是我的实现

@Singleton
@Component(
    modules = [AndroidInjectionModule::class,
        ActivityBuilder::class,
        ViewModelModule::class,
        NetModule::class,
        AppModule::class]
)
interface AppComponent : AndroidInjector<DaggerApplication> {

    fun inject(theDApplication: TFTScreenApplication)

    override fun inject(instance: DaggerApplication)

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): Builder

        @BindsInstance
        @Named(Constants.API_URL_KEY)
        fun apiUrl(apiUrl: String): Builder

        @BindsInstance
        @Named(Constants.SOCKET_URL_KEY)
        fun socketUrl(socketUrl: String): Builder

        fun build(): AppComponent
    }
}

然后在网络模块中

@Module
abstract class NetModule {

    @Binds
    @Named(Constants.API_URL_KEY)
    abstract fun provideApiUrl(apiUrl: String): String

    @Binds
    @Named(Constants.SOCKET_URL_KEY)
    abstract fun provideSocketUrl(socketUrl: String): String

    @Module
    companion object {

        @Provides
        @Reusable
        @JvmStatic
        fun providesOkHttpClient(): OkHttpClient {
            return OkHttpClient.Builder()
                .build()
        }

        @Provides
        @Reusable
        @JvmStatic
        fun providesGson(): Gson {
            val gsonBuilder = GsonBuilder()
            gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
            return gsonBuilder.create()
        }

        @Provides
        @Reusable
        @JvmStatic
        fun providesRetrofit(
            @Named(Constants.API_URL_KEY) apiUrl: String, gson: Gson
        ): Retrofit {
            return Retrofit.Builder()
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl(apiUrl)
                .build()
        }

        @Provides
        @Reusable
        @JvmStatic
        fun providesBackOffStrategy(): BackoffStrategy {
            return ExponentialWithJitterBackoffStrategy(5000, 5000)
        }

        @Provides
        @Reusable
        @JvmStatic
        fun providesLifeCycle(application: Application): Lifecycle {
            return AndroidLifecycle.ofApplicationForeground(application)
        }

        @Provides
        @Reusable
        @JvmStatic
        fun providesScarlet(
            @Named(Constants.SOCKET_URL_KEY) socketUrl: String, okHttpClient: OkHttpClient,
            backoffStrategy: BackoffStrategy,
            lifecycle: Lifecycle
        ): Scarlet {
            return Scarlet.Builder()
                .webSocketFactory(okHttpClient.newWebSocketFactory(socketUrl))
                .addMessageAdapterFactory(MoshiMessageAdapter.Factory())
                .addStreamAdapterFactory(RxJava2StreamAdapterFactory())
                .backoffStrategy(backoffStrategy)
                .lifecycle(lifecycle)
                .build()
        }

        @Provides
        @Reusable
        @JvmStatic
        fun providesCoinSocket(scarlet: Scarlet): SocketService {
            return scarlet.create(SocketService::class.java)
        }

        @Provides
        @Reusable
        @JvmStatic
        fun providesPISAPIs(retrofit: Retrofit): PISAPIs {
            return retrofit.create(PISAPIs::class.java)
        }
    }

错误是

错误:[匕首/重复绑定]java。String被多次绑定:公共抽象接口AppComponent扩展了dagger。AndroidAndroidInjector{^org.jetbrains.annotations.NotNull@Named(“API\u URL”)@BindsInstance com.example.tftscreen.common.di.component.AppComponent.Builder com.example.tftscreen.common.di.component.AppComponent.Builder.apiUrl(字符串)@org.jetbrains.annotations.NotNull@Named(“SOCKET\u URL”)@BindsInstance com。实例TFT屏幕。常见的di。组成部分AppComponent。生成器com。实例TFT屏幕。常见的di。组成部分AppComponent。建设者socketUrl(字符串)java。字符串在com中注入。实例TFT屏幕。常见的di。单元NetModule。provideSocketUrl(socketUrl)@javax。注射命名为(“SOCKET\u URL”)java。字符串在com中注入。实例TFT屏幕。常见的di。单元NetModule。providesScarlet(socketUrl,…)com。导火线猩红Scarlet在com处注射。实例TFT屏幕。常见的迪。单元NetModule。providesCoinSocket(scarlet)com。实例TFT屏幕。pis。SocketService在com中注入。实例TFT屏幕。pis。数据PISRemoteRepository(socketService,…)com。实例TFT屏幕。pis。数据PISRemoteRepository在com中注入。实例TFT屏幕。pis。PISViewModel(pisRemoteRepository)com。实例TFT屏幕。pis。PISViewModel在com中注入。实例TFT屏幕。常见的di。单元ViewModelModule。bindPISViewModel(pisViewModel)java。util。地图,javax。注射供应商

共有2个答案

施昊然
2023-03-14

在String之前使用@命名注释来识别它们。

杜楚
2023-03-14

当您在运行时需要将依赖项引入到对象图中时,BindsInstance最有用。

@Binds在您需要将接口绑定到实现时使用,dagger可以为您构建具体的实现(通过@Inject构造函数)

它看起来不像你的常数。SOCKET\u URL\u键

如果这些在编译时可用,并且您希望dagger提供这些,那么最简单的方法是将以下内容添加到您的模块中:

@Provides
@JvmStatic
@Named(Constants.API_URL_KEY)
fun providesApiUrlKey(): String {
  return "YOUR_API_KEY"      
}

并删除:

@BindsInstance
@Named(Constants.API_URL_KEY)
fun apiUrl(apiUrl: String): Builder

在任何一种情况下(在运行时或编译时可用),您都需要删除以下内容:

@Binds
@Named(Constants.API_URL_KEY)
abstract fun provideApiUrl(apiUrl: String): String

@Binds
@Named(Constants.SOCKET_URL_KEY)
abstract fun provideSocketUrl(socketUrl: String): String
 类似资料:
  • 基于本教程使用Dagger Hilt添加子组件需要 这就是如何创建子组件 我的问题是如何实现 因为它没有显示它是如何提供给UserManager类的 我正在尝试创建一个AppComponent来测试子组件如何与Dagger Hilt一起工作 并在应用中 我应该如何在中创建构建器,创建实现Provider的匿名类不正确吗?

  • 问题内容: 我可能错过了一些东西,但我认为像@Singleton这样的作用域用于定义“作用域生命周期”。 我在Android应用程序中使用了Dagger 2(但我认为问题根本与android相关)。 我有1个模块: 我有两个与范围不同的组件: 两者,并且,有一个构造函数。虽然MenuPresenter期望将其作为参数,但LoginPresenter却采用了: 但是每次我使用这些组件创建一个或时,都

  • Leetcode 题目描述 把一根绳子剪成多段,并且使得每段的长度乘积最大。 // html n = 2 return 1 (2 = 1 + 1) n = 10 return 36 (10 = 3 + 3 + 4) 解题思路 贪心 尽可能多剪长度为 3 的绳子,并且不允许有长度为 1 的绳子出现。如果出现了,就从已经切好长度为 3 的绳子中拿出一段与长度为 1 的绳子重新组合,把它们切成两段长

  • 我有一个字符串: 它需要缩短,所以看起来像这样: 所以基本上,它需要使用所有重复的字符,并写下它们重复的次数,而不是打印它们。我设法做到了一半: 但这只适用于重复的字符,而不是模式。我可以通过在字符串中找到ab模式来做到这一点,但这需要对每一个可能的字符串都是可行的。有人遇到过类似的事情吗?

  • 我不熟悉匕首2。我有两个活动,我想使用注入的ViewModel。这是我的ViewModuleFactory: 我的ViewModel模块: 用于映射的我的ViewModelKey: 我的活动模块: 我的AppModule: 我的AppComponent: 我的申请: 在活动中: 它正在注入时引发异常: 有人能帮我识别代码中的问题吗? ................................

  • Dagger 2即将面世,但可用的示例甚至无法立即编译,文档是Dagger 1的复制粘贴替换。 有没有人有一个在谷歌的Dagger 2上运行的正确应用程序的例子?