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