Lilly
09/16/2024, 10:50 AMandroidLogger
, androidContext
and `modules`:
setContent {
KoinApplication(application = {
// Log Koin into Android logger
androidLogger()
// Reference Android context
androidContext(this@MainActivity)
// Load modules
modules(
module {
// Provide lifecycle for lifecycle aware components
single<Lifecycle> { this@MainActivity.lifecycle }
},
)
}) {
MyTheme {
Root.EntryPoint(defaultRoute = Root.ScannerRoute)
}
}
}
and the documentation does not reflect the changes of the release. application = {}
must now return a KoinApplication. How is it done correctly?arnaud.giuliani
09/16/2024, 12:48 PMfun koinConfiguration() = koinApplication {
printLogger(Level.DEBUG)
modules(appModule)
}
@Composable
fun App() {
KoinApplication(::koinConfiguration){
...
}
}
Muaz KADAN
09/16/2024, 12:48 PMKoinApplication(application = {
koinApplication {
modules(appModule, ...)
}
}) {
MyTheme {
arnaud.giuliani
09/16/2024, 12:51 PMMuaz KADAN
09/16/2024, 12:57 PMarnaud.giuliani
09/16/2024, 1:02 PMMuaz KADAN
09/16/2024, 1:06 PMarnaud.giuliani
09/16/2024, 1:13 PMMuaz KADAN
09/16/2024, 1:15 PMarnaud.giuliani
09/16/2024, 1:38 PMarnaud.giuliani
09/16/2024, 1:38 PMMuaz KADAN
09/16/2024, 1:44 PMMuaz KADAN
09/16/2024, 2:13 PMarnaud.giuliani
09/17/2024, 7:14 AMMuaz KADAN
09/17/2024, 7:14 AMarnaud.giuliani
09/17/2024, 7:44 AMMuaz KADAN
09/17/2024, 8:00 AMarnaud.giuliani
09/17/2024, 9:12 AMMuaz KADAN
09/17/2024, 9:13 AM@Composable
fun App() {
MyKoinApplication(application = {
modules(personModule)
}) {
val person = koinInject<Person>()
println("Person: ${person.hashCode()}")
Scaffold {
val person2 = koinInject<Person>()
println("Person2: ${person2.hashCode()}")
}
}
}
@OptIn(KoinInternalApi::class)
@Composable
@Throws(KoinApplicationAlreadyStartedException::class)
fun MyKoinApplication(
application: KoinAppDeclaration,
content: @Composable () -> Unit,
) {
val koin = rememberKoinApplication(koinApplication = koinApplication(application))
CompositionLocalProvider(
LocalKoinApplication provides koin,
LocalKoinScope provides koin.scopeRegistry.rootScope,
content = content
)
}
Muaz KADAN
09/17/2024, 9:14 AMMuaz KADAN
09/17/2024, 9:16 AM@OptIn(KoinInternalApi::class)
@Composable
@Throws(KoinApplicationAlreadyStartedException::class)
fun MyKoinApplication(
application: KoinAppDeclaration,
content: @Composable () -> Unit,
) {
val koinApplication = remember { koinApplication(application) }
val koin = rememberKoinApplication(koinApplication = koinApplication)
CompositionLocalProvider(
LocalKoinApplication provides koin,
LocalKoinScope provides koin.scopeRegistry.rootScope,
content = content
)
}
Muaz KADAN
09/17/2024, 9:18 AMkey1
parameter of remember in rememberKoinApplication
@OptIn(KoinInternalApi::class)
@Composable
inline fun rememberKoinApplication(koinApplication: KoinApplication): Koin {
val wrapper = remember {
CompositionKoinApplicationLoader(koinApplication)
}
return wrapper.koinApplication.koin
}
arnaud.giuliani
09/17/2024, 9:28 AMarnaud.giuliani
09/17/2024, 9:29 AMarnaud.giuliani
09/17/2024, 9:29 AMCopy codeval koin = rememberKoinApplication(koinApplication = koinApplication(application))
arnaud.giuliani
09/17/2024, 9:30 AMMuaz KADAN
09/17/2024, 9:45 AMCompositionKoinApplicationLoader
The start()
function is called twice on iOS but not on Android