2017-09-25 2 views
-1

Quelqu'un m'aide à souligner pourquoi mon code ne fonctionne pas. J'essaie de comprendre, mais je ne peux pas trouver le problème je tente d'injecter le présentateur, mais je suis l'erreur:L'injection de dague ne fonctionne pas dans kotlin

lateinit property appComponent has not been initialized 

Il semble que le présentateur a été pas injecté AppModule

@Module 
class AppModule { 
    @Provides @Singleton 
    fun provideMainPresenter(): MainActivityContract.Presenter = MainActivityPresenter() 
} 

AppComponent

@Singleton 
@Component(modules = arrayOf(AppModule::class)) 
interface AppComponent { 

    fun inject(target: MainActivity) 

} 

App

class App: Application() { 

    companion object { 
     lateinit var appComponent: AppComponent 
    } 

    override fun onCreate() { 
     super.onCreate() 
     appComponent = initDagger() 
    } 

    fun initDagger() = DaggerAppComponent.create() 
} 

C'est le MainActivity où je veux injecter présentateur

class MainActivity : AppCompatActivity(), MainActivityContract.View, AnkoLogger { 

    @Inject 
    lateinit var presenter: MainActivityContract.Presenter 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_main) 
     App.appComponent.inject(this) 
     presenter.attachView(this) 
    } 

} 

C'est MainActivityPresenter qui implémente MainActivityContract.Presenter

class MainActivityPresenter: MainActivityContract.Presenter { 
    var view: MainActivityContract.View? = null 

    override fun attachView(view: MainActivityContract.View) { 
     this.view = view 
    } 

    override fun detachView() { 
     view = null 
    } 

    override fun performToast(text: String) { 
    } 

} 

Edit: Je réussi à résoudre moi-même: Pour tous débutant Android comme je suis. Lorsque nous déclarons App étend application. Nous devons le déclarer dans le manifeste ainsi

<application 
     android:name=".App" 
/> 
+0

quel type d'erreur ? – Blackbelt

+0

pourquoi ne fonctionne pas? s'il vous plaît ajouter la trace de pile d'erreur ou quelque chose ... –

+0

Mettre à jour ma question. Retrofit ne peut pas fournir le présentateur –

Répondre

0

Vous ne pouvez pas définir une variable statique comme lateinit et attendez onCreate() pour l'initialiser. Essayez quelque chose comme ceci:

class GlobalApplication : Application() { 
    companion object { 
     lateinit var globalApp: GlobalApplication 
    } 

    internal var mApplicationComponent: ApplicationComponent? = null 
     get 

    override fun onCreate() { 
     super.onCreate() 
     globalApp = this 

     //Init Timber 
     if (BuildConfig.DEBUG) { 
      Timber.plant(Timber.DebugTree()) 
     } 

     //Init application component 
     mApplicationComponent = DaggerApplicationComponent.builder() 
       .applicationModule(ApplicationModule(this)) 
       .build() 

     mApplicationComponent?.inject(this) 

     //Ignore URI exposure 
     val builder = StrictMode.VmPolicy.Builder() 
     StrictMode.setVmPolicy(builder.build()) 
    } 
} 

Tiré de ce projet: https://github.com/Obaied/Sohan/blob/master/app/src/main/java/com/obaied/sohan/GlobalApplication.kt

1

Dans le MainActivity, vous pouvez remplacer le code:

@Inject 
lateinit var presenter: MainActivityContract.Presenter 

pour

@field:[Inject] 
lateinit var presenter: MainActivityContract.Presenter 
+0

Pouvez-vous expliquer pourquoi? J'ai vu beaucoup d'autres utilisant @Inject –

+0

Cela ne fonctionne pas –