Upgrade to Pro — share decks privately, control downloads, hide ads and more …

How to use Dagger2 and Koin

How to use Dagger2 and Koin

2019_정현지_droidknights
Dagger2 vs Koin 어떻게 쓰는 걸까요?

Hyeonji Jeong

April 05, 2019
Tweet

More Decks by Hyeonji Jeong

Other Decks in Programming

Transcript

  1. য়ט੄ݾର ↟%*ۆޖ঺ੌө  ↟%BHHFSۆޖ঺ੌө  ↟,PJOۆޖ঺ੌө  ↟%BHHFS৬,PJO ੢੼җױ੼਷ޖ঺ੌө 

    ↟੉ۧѱࢎਊ೧ࠁ੗ ↟%BHHFS,PJO੸ਊ೧ࠁӝ ↟ޖ঺੉਋ܻ೐۽ં౟ী؊য਎ܾө  ↟%*ܳҕࠗೞҊ੉ۧѱ੸ਊೞݶ਋ܻо঳חѪ਷ޖ঺ੌө  ↟݃ޖܻ
  2. %*ۆޖ঺ੌө %FQFOEFODZ class Coffee { val material = Material() fun

    makeLatte() { material.milk() material.espresso() } } class Material { fun milk() {} fun espresso() {} }
  3. -BUUFё୓ OFX4ZSVQ   OFX.JML   OFX&TQSFTTP  

    OFX*DF     %*ۆޖ঺ੌө "NFSJDBOPё୓ OFX4ZSVQ   OFX&TQSFTTP   OFX*DF    
  4. %BHHFSۆޖ঺ੌө ৘ઁ class Milk class Espresso class Coffee(var espresso: Espresso)

    class Latte @Inject constructor( var coffee: Coffee, var milk: Milk) { fun makeLatteDrink() {} }
  5. %BHHFSۆޖ঺ੌө ৘ઁ @Module public class DrinkModule { @Provides Milk ProvideMilk(){

    return Milk () } @Provides Espresso ProvideEspresso(){ return Espresso () } @Provides Coffee ProvideCoffee( var espresso: Espresso){ return Coffee (espresso) } }
  6. %BHHFSۆޖ঺ੌө ৘ઁ class MainActivity : AppCompatActivity(){ override fun onCreate(savedInstanceState: Bundle?)

    { super.onCreate(savedInstanceState) val latteComponent = DaggerDrinkComponent.builder() .drinkModule(DrinkModule()) .build() latteComponent.inject(this) latteComponent.drink() }
  7.  NPEVMF  GBDUPSZ  TJOHMF BMTPBMJBTFEBTCFBO   CJOE

     HFU  TDPQF ,PJO೙ࣻѐ֛ ,PJO੉ۆޖ঺ੌө
  8. ,PJO੉ۆޖ঺ੌө ৘ઁ class Milk class Espresso class Coffee(var espresso: Espresso)

    class Latte(var coffee: Coffee, var milk: Milk) { fun makeLatteDrink() {} }
  9. ,PJO੉ۆޖ঺ੌө ৘ઁ class MainApplication: Application() { override fun onCreate(savedInstanceState: Bundle?)

    { super.onCreate(savedInstanceState) //start koin startKoin(this, listOf(myModules)) } } val myModules = module { single { Milk() } single { Espresso() } single { Coffee(get()) } single { Latte(get(), get())} }
  10. ,PJO੉ۆޖ঺ੌө ৘ઁ inline fun <reified T> get( qualifier: Qualifier? =

    null, scope: Scope = this, noinline parameters: ParametersDefinition? = null ): T { return getKoin().get(T::class, qualifier, scope, parameters) ?: error("$this is not registered - Koin is null") }
  11. ,PJO੉ۆޖ঺ੌө ৘ઁ inline fun <reified T> get( qualifier: Qualifier? =

    null, scope: Scope = this, noinline parameters: ParametersDefinition? = null ): T { return getKoin().get(T::class, qualifier, scope, parameters) ?: error("$this is not registered - Koin is null") }
  12. ,PJO੉ۆޖ঺ੌө ৘ઁ class MainActivity : AppCompatActivity(){ val latte: Latte by

    inject() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val latte: Latte = get() }  
  13. ੉ۧѱࢎਊ೧ࠁ੗%BHHFS @Singleton class GithubUserApiClient constructor( provideOkHttpClient: OkHttpClient) { var baseUrl

    = "https://api.github.com" val userDataService: GithubUserApiService init { val retrofit = Retrofit.Builder() .baseUrl(baseUrl) .client(provideOkHttpClient) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build() userDataService = retrofit.create(GithubUserApiService::class.java) } }
  14. ੉ۧѱࢎਊ೧ࠁ੗%BHHFS @Module class ApiClientModule { @Provides fun provideOkHttpClient(): OkHttpClient {

    val logging = HttpLoggingInterceptor() logging.level = HttpLoggingInterceptor.Level.BASIC return OkHttpClient.Builder() .addInterceptor(logging) .build() } @Provides fun provideGithubUserApiClient(): GithubUserApiClient { return GithubUserApiClient(provideOkHttpClient()) } }
  15. ੉ۧѱࢎਊ೧ࠁ੗%BHHFS @Module(includes = [ApiClientModule::class]) class GithubUserListModule(val view: MainPresenter.View) { @Provides

    fun provideMainPresenter( presenter: MainPresenterImpl) : MainPresenter { return presenter } @Provides fun provideMainView(): MainPresenter.View { return view } }
  16. ੉ۧѱࢎਊ೧ࠁ੗%BHHFS class MainPresenterImpl @Inject constructor( val view: MainPresenter.View, val client:

    GithubUserApiClient) : MainPresenter { @SuppressLint("CheckResult") override fun getGithubUserList(q: String) { client.userDataService.getUserData(q, "repositories", "desc") .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({view.onDataLoaded(it)},{view.onDataFailed()},{}) } }
  17. ੉ۧѱࢎਊ೧ࠁ੗%BHHFS class MainActivity : AppCompatActivity(), MainPresenter.View { @Inject lateinit var

    presenter: MainPresenter override fun searchGithubUser(searchWord: String) { if (searchWord.isNullOrBlank()) { toast("Ѩ࢝ػ ੉޷૑о হणפ׮") userFragment.userAdapter.apply { items.clear() notifyDataSetChanged() } } else { presenter.getGithubUserList(searchWord) } } ... }
  18. ੉ۧѱࢎਊ೧ࠁ੗%BHHFS override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSupportActionBar(toolbar) //initialize

    AppComponent var component = DaggerGithubUserListComponent.builder() .githubUserListModule(GithubUserListModule(this)) .build() component.inject(this) .. }
  19. ੉ۧѱࢎਊ೧ࠁ੗%BHHFS @Module(includes = [ApiClientModule::class]) class GithubUserListModule(val view: MainPresenter.View) { @Provides

    fun provideMainPresenter( presenter: MainPresenterImpl) : MainPresenter { return presenter } @Provides fun provideMainView(): MainPresenter.View { return view } }
  20. ੉ۧѱࢎਊ೧ࠁ੗,PJO val apiModule: Module = module { single { val

    loggingInterceptor = HttpLoggingInterceptor() if (BuildConfig.DEBUG) { loggingInterceptor.level = HttpLoggingInterceptor.Level.BASIC } else { loggingInterceptor.level = HttpLoggingInterceptor.Level.NONE } Retrofit.Builder() .baseUrl("https://api.github.com") .client(OkHttpClient.Builder().addInterceptor(loggingInterceptor).build()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build() .create(GithubUserApiService::class.java) } } val appModules = listOf(apiModule, userlistModule)
  21. ੉ۧѱࢎਊ೧ࠁ੗,PJO class MainApplication :Application() { override fun onCreate() { super.onCreate()

    startKoin { // Android context androidContext(this@MainApplication) // modules modules(appModules) } } }
  22. ੉ۧѱࢎਊ೧ࠁ੗,PJO lass MainActivity : AppCompatActivity(), UserDataList { private val presenter:

    MainPresenter<UserData> by inject() override fun searchGithubUser(searchWord: String) { if (searchWord.isNullOrBlank()) { presenter.getGithubUserList("a") userFragment.userAdapter.apply { items.clear() notifyDataSetChanged() } } else { presenter.getGithubUserList(searchWord) } } ... }