我为什么用"lateinit property injector has not been initialized"暗恋?



学习dagger2,通过指南进行。

我在我的应用程序(扩展应用程序(上创建injector

class App : Application() {
    lateinit var injector: ApplicationComponent
    override fun onCreate() {
        super.onCreate()
        injector = DaggerApplicationComponent
            .builder()
            .applicationModule(ApplicationModule(getInstance()))
            .build()
        if (BuildConfig.DEBUG) {
            Timber.plant(Timber.DebugTree())
        }
        JodaTimeAndroid.init(this)
    }
    companion object {
        private var instance: App? = null
        fun getInstance(): App {
            if (instance == null) {
                instance = App()
            }
            return instance as App
        }
    }
}

之后,我写了活动:

@Inject
lateinit var mainPresenter: MainPresenter
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
        App.getInstance().injector.inject(this)
        mainPresenter.init(this)
        mainPresenter.getData()
    }

压碎。我错了?

ApplicationComponent:

@Singleton
@Component(modules = [ApplicationModule::class])
interface ApplicationComponent {
    fun inject(mainActivity: MainActivity)
    val db: TestDatabase
}

我的ApplicationModule很大,我想在学习时在一个模块上做很多事情。在这里是:

@Module
class ApplicationModule(private val app: App) {
    private var db: EmployeeDatabase = Room
        .databaseBuilder(
            app,
            TestDatabase::class.java,
            TestDatabase.DATABASE_NAME.plus(".db")
        )
        .fallbackToDestructiveMigration()
        .allowMainThreadQueries()
        .build()

    @Provides
    @Singleton
    fun provideApplication(): App {
        return app
    }
    @Provides
    @Singleton
    fun provideMainViewPresenter(): MainPresenter = MainPresenter(db)
    @Singleton
    @Provides
    internal fun providesRoomDatabase(): EmployeeDatabase {
        return db
    }
}

mainpresenter:

class MainPresenter @Inject constructor(private var db: TestDatabase) {
    private var mainActivity: MainView? = null
    private val apiService = ApiService.create()
    fun init(mainView: MainView) {
        mainActivity = mainView
    }
    fun getData() {
        ...some database logic
    }
    fun onDestroy() {
        mainActivity = null
    }
}
override fun onCreate() {
    super.onCreate()
    instance = this

,您也应该仅用instance!!替换getInstance(),因为您不应该尝试创建自己的App实例。

相关内容