Kotlin愛好会 Vol.4 2018/09/20 #love_kotlin
©2018 Wantedly, Inc.,0*/͔Θ͍͍Αɺ,0*/,PUMJOѪձWPM3ZP4BLBHVDIJ !XBLXBL2018.9.20 -
View Slide
©2018 Wantedly, Inc.Ryo Sakaguchi• Wantedly People• Android• Kotlin/Sake/Beer/Guitar…• Twitter/GitHub: @wakwak3125
©2018 Wantedly, Inc.Koin 1.0.0 Page Title Page Subtitle
©2018 Wantedly, Inc.1. Lightweight2. No Proxy/No Code Generation/(No)Reflection3. Simple DSL4. Multi Platform• Kotlin/Java Android(with AAC ViewModel support)• Standalone application• Spark• KtorAbout Koin
©2018 Wantedly, Inc.How to use?Let’s convert from the DI declaration of google/dagger to Koin
©2018 Wantedly, Inc.Dagger
©2018 Wantedly, Inc.google/Dagger@Moduleclass DaggerModule {@Providesfun provideBeer(): IBeer = Beer("BREWDOG, PUNK IPA")@Providesfun provideSake(): ISake = Sake("ُઘ")@Providesfun provideGuitar(): IGuitar = Guitar("Fender, Stratocaster")@Provides@Singletonfun provideWakWak(beer: IBeer,sake: ISake,guitar: IGuitar): WakWak = WakWak(beer, sake, guitar)}Module
©2018 Wantedly, Inc.google/Dagger@Component(modules = [DaggerModule::class])interface AppComponent {fun inject(activity: MainActivity)}Component
©2018 Wantedly, Inc.google/Daggerclass KoinDaggerApp : Application() {lateinit var component: AppComponentprivate setoverride fun onCreate() {super.onCreate()component = DaggerAppComponent.create()}}Your Application class
©2018 Wantedly, Inc.google/Daggerclass MainActivity : AppCompatActivity() {@Injectlateinit var daggerWakWak: WakWakoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)(application as KoinDaggerApp).component.inject(this)text1.text = daggerWakWak.getMyFavorites()}}Your Activity or Fragment
©2018 Wantedly, Inc.KOIN
©2018 Wantedly, Inc.KOINclass KoinDaggerApp : Application() {override fun onCreate() {super.onCreate()startKoin(this, listOf(appModule))}private val appModule = module {factory { Guitar("Fender, Telecaster") as IGuitar }factory { Beer("αοϙϩࠇϥϕϧ") as IBeer }factory { Sake("ਲՆ") as ISake }single { WakWak(get(), get(), get()) }}}Your Application class
©2018 Wantedly, Inc.class KoinDaggerApp : Application() {override fun onCreate() {super.onCreate()startKoin(this, listOf(appModule))}private val appModule = module {factory { Guitar("Fender, Telecaster") as IGuitar }factory { Beer("αοϙϩࠇϥϕϧ") as IBeer }factory { Sake("ਲՆ") as ISake }single { WakWak(get(), get(), get()) }}}KOIN Your Application class
©2018 Wantedly, Inc.class MainActivity : AppCompatActivity() {private val koinWakWak by inject()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)text2.text = koinWakWak.getMyFavorites()}}Your Activity or FragmentKOIN
©2018 Wantedly, Inc.More complex examplesSub module, Combined module, Namespace
©2018 Wantedly, Inc.class KoinDaggerApp : Application() {inner class Message(val message: String)override fun onCreate() {super.onCreate()startKoin(this, listOf(appModule))}private val appModule = module {module("A") { // Submodulefactory { Beer("αοϙϩࠇϥϕϧ") }factory { Sake("ਲՆ") }factory { Guitar("Fender, Telecaster") }module("user") {single { WakWak(get(), get(), get()) }}}}KOIN Submodule
©2018 Wantedly, Inc.class KoinDaggerApp : Application() {inner class Message(val message: String)override fun onCreate() {super.onCreate()startKoin(this, listOf(messageModule, appModule))}private val messageModule = module {factory { Message("Hello :)") }}private val appModule = module {module("A") {ɹɹ //…module("user") {single { WakWak(get(), get(), get()) }}}}}KOIN Combined module
©2018 Wantedly, Inc.KOIN Namespaceclass MainActivity : AppCompatActivity() {private val aWakWak by inject(name = "A.user.WakWak")private val bWakWak by inject(name = "B.user.WakWak")private val hello by inject(name = "Hello.Message")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)text1.text = aWakWak.getMyFavorites()text2.text = bWakWak.getMyFavorites()• A.user.WakWak = ModuleName.ModuleName.ClassName• Hello.Message = ModuleName.ClassName
©2018 Wantedly, Inc.InsertKoinIO/koin
©2018 Wantedly, Inc.͓ΘΓ