我在匕首中注入弦有问题
这是我的实现
@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。注射供应商
在String之前使用@命名
注释来识别它们。
当您在运行时需要将依赖项引入到对象图中时,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上运行的正确应用程序的例子?