2016-08-25 15 views
1

他にも多くの類似の質問がありましたが、答えは私のコードには適用できませんでした。私は何が間違っているのか分かりません。@注釈付きメソッドなしでは提供できません

@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) 
    } 

    // ... 

} 

まず私はApplicationComponentためのモジュールとして使用されているNetworkModuleを持っています

object Injector { 

    lateinit var applicationComponent: ApplicationComponent 
     private set 

    fun initializeApplicationComponent(context: Context) { 
     applicationComponent = DaggerApplicationComponent.builder() 
       .contextModule(ContextModule(context)) 
       .networkModule(NetworkModule()) 
       .realmModule(RealmModule()) 
       .build() 
    } 

    // ... 

} 

そしてIはActivityComponentで使用さActivityModule(依存関係としてApplicationComponentを有する)を有する:最後に、私はMainActivity@Inject新しいActivityComponent

@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) 

} 

を作成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) }) 
    } 

    // ... 

} 

しかし、私は私がNetworkModuleprovideArticleService()機能が正しく注釈されていると考えているにもかかわらず、次のエラーを取得構築しよう:

ArticleServiceは@作成し、アノテーション付きメソッドの@ Provides-なしまたは 提供することができません。

答えて

2

アクティビティスコープコンポーネントに継承するプロビジョニングメソッドがありません。コンポーネント依存関係の代わりにサブコンポーネントを使用するか、アプリケーション・コンポーネント内にプロビジョニング・メソッドを定義します。

@ApplicationScope @Component(modules = arrayOf(ContextModule::class, RealmModule::class, NetworkModule::class)) 
interface ApplicationComponent { 
     ArticleService articleService(); 
} 
関連する問題