匕首注射不在kotlin工作

时间:2017-09-25 13:40:48

标签: android kotlin dagger-2

有人帮我指出为什么我的代码不起作用。我想弄明白,但我找不到问题 我尝试注入演示者,但我收到了错误:

lateinit property appComponent has not been initialized

似乎演示者没有注射 的AppModule

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

AppComponent

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

    fun inject(target: MainActivity)

}

应用

class App: Application() {

    companion object {
        lateinit var  appComponent: AppComponent
    }

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

    fun initDagger() = DaggerAppComponent.create()
}

这是我希望将演示者注入

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

}

这是MainActivityPresenter,它实现了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) {
    }

}

修改:我自己设法解决了这个问题: 对于所有的android初学者和我一样。当我们声明App扩展应用程序时。我们必须在清单中声明它

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

2 个答案:

答案 0 :(得分:1)

在MainActivity中,您可以替换代码:

@Inject
lateinit var presenter:  MainActivityContract.Presenter

代表

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

答案 1 :(得分:0)

您无法将静态变量定义为lateinit,并期望onCreate()对其进行初始化。尝试这样的事情:

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

取自这个项目:https://softwareengineering.stackexchange.com/questions/252243/naming-convention-final-fields-not-static