2017-07-28 13 views
4

私はKotlinとDagger 2を同時にコチリンにMindorks advanced MVP sampleの一部を変換しようと試みていますが、Dagger2コンパイルの問題を抱えています。私はここでクラスで泳いでいますが、とても近いです!不安定さに気をつけないで、私はコンパイルした後に各クラスを梳きたいと思う。何かが見つからない場合は、私に知らせてください。このエラーは、プレゼンタークラスがアクティビティに正しく挿入されていないために発生します。以下のようにエラーが読み込ま:MVPプレゼンターが正しく注入されていない

e: D:\_Dev\repo\app\build\tmp\kapt3\stubs\debug\com\xxx\di\component\ActivityComponent.java:8: error: com.xxx.login.LoginMVP.Presenter<com.xxx.login.LoginMVP.View,? extends com.xxx.login.LoginMVP.Interactor> cannot be provided without an @Provides- or @Produces-annotated method. 
e: 

e:  public abstract void inject(@org.jetbrains.annotations.NotNull() 
e:      ^
e:  com.xxx.login.LoginMVP.Presenter<com.xxx.login.LoginMVP.View,? extends com.xxx.login.LoginMVP.Interactor> is injected at 
e:   com.xxx.login.LoginActivity.presenter 
e:  com.xxx.login.LoginActivity is injected at 
e:   com.xxx.di.component.ActivityComponent.inject(activity) 
e: java.lang.IllegalStateException: failed to analyze: org.jetbrains.kotlin.kapt3.diagnostic.KaptError: Error while annotation processing 

EDIT:

abstract class BaseActivity : AppCompatActivity(), MvpView { 

    val activityComponent: ActivityComponent by lazy { 
     DaggerActivityComponent.builder() 
       .applicationComponent((application as App).applicationComponent) 
       .activityModule(ActivityModule(this)) 
       .build() 
    } 
} 

BasePresenter.kt

のAndroidメーカーの最新のカナリアビルドで構築された

Here is a repo with the failing code

BaseActivity.kt

open class BasePresenter<V : MvpView, out I: MvpInteractor> 
@Inject constructor(private val mvpInteractor: I) : MvpPresenter<V, I> { 

    private var mvpView: V? = null 

    override fun onAttach(mvpView: V) { 
     this.mvpView = mvpView 
    } 

    override fun onDetach() { 
     mvpView = null 
    } 

    override fun getMvpView(): V? { 
     return mvpView 
    } 

    override fun getInteractor(): I { 
     return mvpInteractor 
    } 

} 

MvpPresenter.kt(MvpViewとMvpInteractorは、基本的な空のインタフェースである)

interface MvpPresenter<V: MvpView, out I: MvpInteractor> { 

    fun onAttach(mvpView: V) 

    fun onDetach() 

    fun getMvpView(): V? 

    fun getInteractor(): I 
} 

App.kt

class App: Application() { 

    lateinit var applicationComponent: ApplicationComponent 

    override fun onCreate() { 
     super.onCreate() 
     applicationComponent = DaggerApplicationComponent.builder() 
       .applicationModule(ApplicationModule(this)).build() 

     applicationComponent.inject(this) 
    } 

    fun getComponent(): ApplicationComponent { 
     return applicationComponent 
    } 

    fun setComponent(applicationComponent: ApplicationComponent) { 
     this.applicationComponent = applicationComponent 
    } 
} 

ApplicationComponent.kt

@Singleton 
@Component(modules = arrayOf(ApplicationModule::class)) 
interface ApplicationComponent { 

    fun inject(app: App) 

    @ApplicationContext fun context(): Context 

    fun application(): Application 

    //Pref helper 
    //Api helper 
} 

ApplicationModule.kt

@Module 
class ApplicationModule(val application: Application) { 

    @Provides 
    @ApplicationContext 
    fun provideContext(): Context = application 

    @Provides 
    fun provideApplication(): Application = application 

    //Provide api helper 

    //Provide pref helper 

    //Provide api key etc. 
} 

ActivityModule.kt

@Module 
class ActivityModule(val activity: AppCompatActivity) { 

    @Provides 
    fun provideContext(): Context = activity 

    @Provides 
    fun provideActivity(): AppCompatActivity = activity 

    @Provides 
    fun provideLoginPresenter(presenter: LoginPresenter<LoginMVP.View, LoginMVP.Interactor>): 
      LoginMVP.Presenter<LoginMVP.View, LoginMVP.Interactor> { 
     return presenter 
    } 

    @Provides 
    fun provideLoginMvpInteractor(interactor: LoginInteractor): 
      LoginMVP.Interactor { 
     return interactor 
    } 

} 

ActivityComponent.kt

@PerActivity 
@Component(dependencies = arrayOf(ApplicationComponent::class), modules = arrayOf(ActivityModule::class)) 
interface ActivityComponent { 

    fun inject(activity: LoginActivity) 
} 

LoginActivity.kt

class LoginActivity : BaseActivity(), LoaderCallbacks<Cursor>, LoginMVP.View { 

    @Inject lateinit var presenter: LoginMVP.Presenter<LoginMVP.View, LoginMVP.Interactor> 

    private var authTask: UserLoginTask? = null 


    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_login) 

     activityComponent.inject(this) 

     email_sign_in_button.setOnClickListener { presenter.onServerLoginClick(email.text.toString(), password.text.toString()) } 

     presenter.onAttach(this) 
    } 
} 

LoginMVP.kt

interface LoginMVP { 

    interface Interactor : MvpInteractor { 

    } 

    @PerActivity 
    interface Presenter<V : LoginMVP.View, out I : LoginMVP.Interactor> 
     : MvpPresenter<V, I> { 

     fun onServerLoginClick(email: String, password: String) 

    } 

    interface View : MvpView { 
     fun openMainActivity() 
    } 
} 
+0

現在の状態をGithubにプッシュしてもよろしいですか?見てみたいですか? – FWeigl

+0

ありがとう@Ascorbin、私は今Repoリンクを追加しました。それは最新のカナリーAndroid Studioで構築されているので、うまくいけばそれは問題ではない。 –

答えて

3

それはありません完全な答えだがかなり近い。

問題はout修飾語です。この修飾子ではダガーは

com.xxx.login.LoginMVP.Presenter<com.xxx.login.LoginMVP.View,? extends com.xxx.login.LoginMVP.Interactor> 

を注入しようとしていますが(機能provideLoginPresenter中)のみ

com.xxx.login.LoginMVP.Presenter<com.xxx.login.LoginMVP.View, com.xxx.login.LoginMVP.Interactor> 

を提供しています。

outをすべて削除すると(PresenterBasePresenterLoginPresenter)、コンパイルと作業が開始されます。

Daggerが間違ったタイプを挿入しようとしたり、同じタイプであると理解できない理由がわかりません。注釈処理中にバグのように見えます。だから最も簡単な解決策 - 修飾子 とダガーを使用しないでください。

+0

さあ、ありがとう。私はちょうどASが私に言ったことをした、それは私に悲しみの約6時間を引き起こした:) –

関連する問題