没有 @Provides-annotated 方法就无法提供
Cannot be Provided Without an @Provides-annotated Method
还有很多其他类似的问题,但是 none 的答案适用于我的代码。我不知道我做错了什么。
首先我有一个 NetworkModule
用作 ApplicationComponent
:
的模块
@Module
open class NetworkModule {
companion object {
private val BASE = "http://www.example.com/"
}
@Provides @ApplicationScope
fun provideClient(): OkHttpClient = OkHttpClient()
@Provides @ApplicationScope
fun provideMoshi(): Moshi {
return Moshi.Builder().add(InstantAdapter).add(UriAdapter).build()
}
@Provides @ApplicationScope
fun provideRetrofit(client: OkHttpClient, moshi: Moshi): Retrofit {
return Retrofit.Builder().client(client).baseUrl(BASE)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(MoshiConverterFactory.create(moshi))
.build()
}
@Provides @ApplicationScope
fun provideArticleService(retrofit: Retrofit): ArticleService {
return retrofit.create(ArticleService::class.java)
}
}
@ApplicationScope @Component(modules = arrayOf(ContextModule::class, RealmModule::class, NetworkModule::class))
interface ApplicationComponent {}
那么 ApplicationComponent
就建在我的 Application
class:
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
AndroidThreeTen.init(this)
plantLog()
drawDagger()
}
private fun drawDagger() {
Injector.initializeApplicationComponent(this)
}
// ...
}
object Injector {
lateinit var applicationComponent: ApplicationComponent
private set
fun initializeApplicationComponent(context: Context) {
applicationComponent = DaggerApplicationComponent.builder()
.contextModule(ContextModule(context))
.networkModule(NetworkModule())
.realmModule(RealmModule())
.build()
}
// ...
}
然后我有一个 ActivityModule
用于 ActivityComponent
(它有 ApplicationComponent
作为依赖项):
@Module
open class ActivityModule(private val activity: AppCompatActivity) {
@Provides @ActivityScope @ActivityContext
fun provideContext(): Context = activity
@Provides @ActivityScope
fun provideFragmentManager(): FragmentManager = activity.supportFragmentManager
}
@ActivityScope @Component(dependencies = arrayOf(ApplicationComponent::class), modules = arrayOf(ActivityModule::class))
interface ActivityComponent {
fun inject(activity: MainActivity)
}
最后,我在 MainActivity
和 @Inject
中创建了一个新的 ActivityComponent
ArticleService
:
class MainActivity : AppCompatActivity() {
@Inject lateinit var service: ArticleService
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
DaggerActivityComponent.builder()
.applicationComponent(Injector.applicationComponent)
.activityModule(ActivityModule(this))
.build().inject(this)
service.getNewsArticles()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.subscribe(
{ response -> onNext(response) },
{ error -> onError(error) })
}
// ...
}
但是当我尝试构建时出现以下错误,即使我相信 NetworkModule
中的 provideArticleService()
函数注释正确:
ArticleService cannot be provided without an @Provides- or
@Produces-annotated method.
您缺少继承到 Activity 作用域组件的提供方法。要么使用子组件而不是组件依赖性,要么在应用程序组件中定义提供方法。
@ApplicationScope @Component(modules = arrayOf(ContextModule::class, RealmModule::class, NetworkModule::class))
interface ApplicationComponent {
ArticleService articleService();
}
还有很多其他类似的问题,但是 none 的答案适用于我的代码。我不知道我做错了什么。
首先我有一个 NetworkModule
用作 ApplicationComponent
:
@Module
open class NetworkModule {
companion object {
private val BASE = "http://www.example.com/"
}
@Provides @ApplicationScope
fun provideClient(): OkHttpClient = OkHttpClient()
@Provides @ApplicationScope
fun provideMoshi(): Moshi {
return Moshi.Builder().add(InstantAdapter).add(UriAdapter).build()
}
@Provides @ApplicationScope
fun provideRetrofit(client: OkHttpClient, moshi: Moshi): Retrofit {
return Retrofit.Builder().client(client).baseUrl(BASE)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(MoshiConverterFactory.create(moshi))
.build()
}
@Provides @ApplicationScope
fun provideArticleService(retrofit: Retrofit): ArticleService {
return retrofit.create(ArticleService::class.java)
}
}
@ApplicationScope @Component(modules = arrayOf(ContextModule::class, RealmModule::class, NetworkModule::class))
interface ApplicationComponent {}
那么 ApplicationComponent
就建在我的 Application
class:
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
AndroidThreeTen.init(this)
plantLog()
drawDagger()
}
private fun drawDagger() {
Injector.initializeApplicationComponent(this)
}
// ...
}
object Injector {
lateinit var applicationComponent: ApplicationComponent
private set
fun initializeApplicationComponent(context: Context) {
applicationComponent = DaggerApplicationComponent.builder()
.contextModule(ContextModule(context))
.networkModule(NetworkModule())
.realmModule(RealmModule())
.build()
}
// ...
}
然后我有一个 ActivityModule
用于 ActivityComponent
(它有 ApplicationComponent
作为依赖项):
@Module
open class ActivityModule(private val activity: AppCompatActivity) {
@Provides @ActivityScope @ActivityContext
fun provideContext(): Context = activity
@Provides @ActivityScope
fun provideFragmentManager(): FragmentManager = activity.supportFragmentManager
}
@ActivityScope @Component(dependencies = arrayOf(ApplicationComponent::class), modules = arrayOf(ActivityModule::class))
interface ActivityComponent {
fun inject(activity: MainActivity)
}
最后,我在 MainActivity
和 @Inject
中创建了一个新的 ActivityComponent
ArticleService
:
class MainActivity : AppCompatActivity() {
@Inject lateinit var service: ArticleService
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
DaggerActivityComponent.builder()
.applicationComponent(Injector.applicationComponent)
.activityModule(ActivityModule(this))
.build().inject(this)
service.getNewsArticles()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.subscribe(
{ response -> onNext(response) },
{ error -> onError(error) })
}
// ...
}
但是当我尝试构建时出现以下错误,即使我相信 NetworkModule
中的 provideArticleService()
函数注释正确:
ArticleService cannot be provided without an @Provides- or @Produces-annotated method.
您缺少继承到 Activity 作用域组件的提供方法。要么使用子组件而不是组件依赖性,要么在应用程序组件中定义提供方法。
@ApplicationScope @Component(modules = arrayOf(ContextModule::class, RealmModule::class, NetworkModule::class))
interface ApplicationComponent {
ArticleService articleService();
}