Почему я раздавлен "Латинит собственности инжектор не был инициализирован"? - PullRequest
0 голосов
/ 14 мая 2019

Learning Dagger 2, сделайте это с помощью руководства.

Я создаю 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
    }
}

1 Ответ

0 голосов
/ 15 мая 2019
override fun onCreate() {
    super.onCreate()
    instance = this

А также вы должны заменить getInstance() просто instance!!, потому что вы не должны пытаться создать свой собственный App экземпляр.

...