Android Programjaim

Android, Flutter/Dart, Kotlin, Java, Unity, HarmonyOS

Android + Koin + Kotlin

2020. január 08. 10:04 - lacas8282

A Koinrol fogok beszelni kicsit. Fel eve kb android nativoztam utoljara, azota dartsolok/flutterezek kemenyen.

A Koin-t meg nem igazan hasznaltam, de most egy pillantast kellett vennem ra egy project erejeig (amit at kene irnom)

Ezert most felfedeztem, es lassuk mi is ez, mit kell tudni rola.

https://insert-koin.io/

A bemutatkozo oldal azt irja, ez egy pragmatikus dependency injection fremvork Kotlinosok szamara.

Kotlinban lett irva, nincs kod generalas, es ez egy DSL. Mi az a DSL? Ha rakeresunk a neten:

DSL: Domain Specific Language: domain specifikus nyelv. Tehat valami teruletre/reszfeladatra irt nyelv.

Dependency-k koze bemasoljuk a:

compile 'org.koin:koin-android:$koin_version


-t majd synceljuk.

A HelloRepository-s sample-t fogom leirni, ami az oldalukon is talalhato. De sokat kepzett android developerek kitalalhatjak a kodbol is, mivel viszonylag egyszeru, es kb 4-5 szot hasznal a definialasra.

Csinaljunk egy HelloRepo interface-t, es hozza egy implementaciot.

interface HelloRepository {
    fun giveHello(): String
}

class HelloRepositoryImpl() : HelloRepository {
    override fun giveHello() = "Hello Koin"
}


Csinaljunk egy presenter osztalyt hozza:

class HelloPresenter(val repo: HelloRepository) {

    fun sayHello() = "${repo.giveHello()} from $this"
}


Irjunk egy Koin modult erre:

val appModule = module {

    // single instance of HelloRepository
    single<HelloRepository> { HelloRepositoryImpl() }

    // Simple Presenter Factory
    factory { HelloPresenter(get()) }
}



Itt a HelloPresentert factory-kent definialjuk, hogy mindig mikor az Activity-nk egy uj presentert akar, ujat keszitsen

a Single kulcsszo nyilvanvaloan a Singletonra utal, egykere, stb.

Start Koin

Kell az appunkba egy Application class, ha meg nincsen.

class MyApplication : Application(){
    override fun onCreate() {
        super.onCreate()
        // Start Koin
        startKoin{
            androidLogger()
            androidContext(this@MyApplication)
            modules(appModule)
        }
    }
}


a MyApplication classunk kiterjeszti az Application osztalyt, es az onCreate-jebe beledobjuk  a startKoin-t, amibe deklaraljuk a modulokat (is).

Injektaljuk a dependenciakat (fecskendezzuk be a fuggosegeket :P)

A Prezentalo osztalyt bele kell injektalni ugye az Activity-nkbe.

class HelloActivity : AppCompatActivity() {

    // Lazy injected HelloPresenter
    val helloPresenter: HelloPresenter by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        //...
    }
}


refaktoraltam az osztalyok neveit a jobb erthetoseg kedveert, altalaban az osszetartozo nevekkel latjuk el (prefixben) az egyazon dolgokra utalo cuccokat. A peldaban meg nem igy volt...

Tehat egyszeruen a by delegate kulcsszoval injektaljuk be az osztalyt az Activitybe.

Ez a by delegate funkcio teszi lehetove, hogy a Koin osztaly peldanyokat 'elerjuk'.

Mi az a get()?

A get() funkcio itt azert van, hogy direktben tudjuk a peldanyt meghivni (csak a kotlin annyira okos, hogy latni fogja mit kell odaraknia:))

 Ui.: Video a Koin alkotojaval, Arnaud-al:

komment
Címkék: android koin kotlin
süti beállítások módosítása