Skip to content

Commit

Permalink
Merge pull request #2039 from InsertKoinIO/fix_koinstartup
Browse files Browse the repository at this point in the history
Arrange KoinStartup proposal for safer access
  • Loading branch information
arnaudgiuliani authored Oct 30, 2024
2 parents f830de1 + 8daec73 commit a2df2bc
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 32 deletions.
35 changes: 26 additions & 9 deletions docs/reference/koin-android/start.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,19 +72,16 @@ startKoin {
}
```

## Start Koin with Androidx Startup (4.0)
## Start Koin with Androidx Startup (4.0.1)

By using Gradle packge `koin-androidx-startup`, we can use `onKoinStartup` function durectly in `init` block of your Application class:
By using Gradle packge `koin-androidx-startup`, we can use `KoinStartup` interface to declare your Koin configuration your Application class:

```kotlin
class MainApplication : Application() {

init {
// Use AndroidX Startup for Koin
onKoinStartup {
androidContext(this@MainApplication)
modules(allModules)
}
override fun onKoinStartup(): KoinAppDeclaration = {
androidContext(this@MainApplication)
modules(appModule)
}

override fun onCreate() {
Expand All @@ -96,5 +93,25 @@ class MainApplication : Application() {
This replaces the `startKoin` function that is usally used in `onCreate`.

:::info
Gain over from `onKoinStartup` to regular `startKoin` can go over 30% of time gained, for startup time.
Gain over from `KoinStartup` to regular `startKoin` can go over 30% of time gained, for startup time.
:::

## Startup Dependency with Koin

You can make your `Initializer` depend on `KoinInitializer` if you need Koin to be setup, and allow to inject dependencies:

```kotlin
class CrashTrackerInitializer : Initializer<Unit>, KoinComponent {

private val crashTrackerService: CrashTrackerService by inject()

override fun create(context: Context) {
crashTrackerService.configure(context)
}

override fun dependencies(): List<Class<out Initializer<*>>> {
return listOf(KoinInitializer::class.java)
}

}
```
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,22 @@ import org.koin.android.ext.koin.androidFileProperties
import org.koin.android.ext.koin.androidLogger
import org.koin.androidx.fragment.koin.fragmentFactory
import org.koin.androidx.workmanager.koin.workManagerFactory
import org.koin.androix.startup.KoinStartup.onKoinStartup
import org.koin.core.context.startKoin
import org.koin.androix.startup.KoinStartup
import org.koin.core.logger.Level
import org.koin.dsl.KoinAppDeclaration
import org.koin.sample.sandbox.di.allModules



class MainApplication : Application() {
class MainApplication : Application(), KoinStartup {

init {
onKoinStartup {
androidLogger(Level.DEBUG)
androidContext(this@MainApplication)
androidFileProperties()
fragmentFactory()
workManagerFactory()

modules(allModules)
}
override fun onKoinStartup() : KoinAppDeclaration = {
androidLogger(Level.DEBUG)
androidContext(this@MainApplication)
androidFileProperties()
fragmentFactory()
workManagerFactory()
modules(allModules)
}

companion object {
Expand Down
2 changes: 1 addition & 1 deletion examples/gradle/versions.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@ ext {
android_min_version = 14
android_target_version = 34
android_build_tools_version = '34.0.0'
android_gradle_version = '8.2.0'
android_gradle_version = '8.7.0'
}
2 changes: 1 addition & 1 deletion examples/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ class KoinInitializer : Initializer<Koin> {

@OptIn(KoinExperimentalAPI::class)
override fun create(context: Context): Koin {
return KoinStartup.koinAppDeclaration?.let {
startKoin(it).koin
} ?: error("KoinInitializer can't start Koin configuration. Please use KoinStartup.onKoinStartup() function to register your Koin application.")
return if (context is KoinStartup){
startKoin(context.onKoinStartup()).koin
} else error("Can't start Koin configuration on current Context. Please use KoinStartup interface to define your Koin configuration with.")
}

override fun dependencies(): List<Class<out Initializer<*>>> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,12 @@ import org.koin.dsl.KoinAppDeclaration
* @author Arnaud Giuliani
*/
@KoinExperimentalAPI
object KoinStartup {
internal var koinAppDeclaration : KoinAppDeclaration? = null
interface KoinStartup {

/**
* startKoin with AndroidX startup Initializer
* @see startKoin function
*/
@KoinApplicationDslMarker
fun onKoinStartup(koinAppDeclaration : KoinAppDeclaration){
this.koinAppDeclaration = koinAppDeclaration
}
fun onKoinStartup() : KoinAppDeclaration
}

0 comments on commit a2df2bc

Please sign in to comment.