【问题标题】:Cannot be Provided Without an @Provides-annotated Method没有 @Provides-annotated 方法就无法提供
【发布时间】:2016-08-25 18:53:30
【问题描述】:

还有许多其他类似的问题,但没有一个答案适用于我的代码。我无法弄清楚我做错了什么。

首先我有一个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 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()
    }

    // ...

}

然后我有一个在ActivityComponent 中使用的ActivityModule(它具有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@InjectArticleService 中创建了一个新的ActivityComponent

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() 函数注释正确:

如果没有 @Provides- 或 @Produces-annotated 方法。

【问题讨论】:

    标签: android kotlin dagger-2


    【解决方案1】:

    您缺少要继承到 Activity 范围组件的配置方法。要么使用子组件而不是组件依赖,要么在应用程序组件中定义提供方法。

     @ApplicationScope @Component(modules = arrayOf(ContextModule::class, RealmModule::class, NetworkModule::class))
     interface ApplicationComponent {
          ArticleService articleService();
     }
    

    【讨论】:

      猜你喜欢
      • 2018-08-04
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2022-11-28
      • 2019-06-21
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      相关资源
      最近更新 更多