2017-09-25 7 views
-1

Jemand hilft mir, darauf hinzuweisen, warum mein Code nicht funktioniert. Ich versuche, herauszufinden, aber ich kann nicht das Problem herauszufinden Ich versuche Moderator zu injizieren, aber ich habe den Fehler:Dolch-Injektion funktioniert nicht in Kotlin

lateinit property appComponent has not been initialized 

Es scheint, dass der Moderator AppModule

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

AppComponent nicht injiziert wurde

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

    fun inject(target: MainActivity) 

} 

App

Dies ist der MainActivity, wo ich Moderator wollen injizieren

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

} 

Dies ist MainActivityPresenter die MainActivityContract.Presenter implementiert

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: ich es geschafft, es selbst zu lösen: Für alle Android Anfänger wie ich bin. Wenn wir App deklarieren, wird die Anwendung erweitert. Wir müssen es in manifest erklären auch

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

welche Art von Fehler ? – Blackbelt

+0

warum funktioniert nicht? Bitte fügen Sie die Fehler-Stack-Trace oder so etwas hinzu ... –

+0

Aktualisieren Sie meine Frage. Retrofit konnte keinen Moderator bereitstellen –

Antwort

0

Sie keine statische Variable als lateinit definieren können und erwarten onCreate() es zu initialisieren. so etwas wie dieses versuchen:

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

aus diesem Projekt wurde: https://github.com/Obaied/Sohan/blob/master/app/src/main/java/com/obaied/sohan/GlobalApplication.kt

1

Im MainActivity, können Sie den Code ersetzen:

@Inject 
lateinit var presenter: MainActivityContract.Presenter 

für

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

Können Sie bitte erklären warum? Ich habe viele andere gesehen mit @Inject –

+0

Es funktioniert nicht –

Verwandte Themen