🥥 Cokoin
Librería de inyección para Compose (Multiplataforma y Jetpack), envoltorio de Koin. Utiliza funciones @Composable
para configurar KoinContext.
Instalación
La librería está alojada en Maven Central. Añada los siguientes paquetes a su módulo build.gradle.kts o build.gradle:
dependencies {
implementation("dev.burnoo:cokoin:1.0.0")
implementation("dev.burnoo:cokoin-android-viewmodel:1.0.0") // for Androidx ViewModel
implementation("dev.burnoo:cokoin-android-navigation:1.0.0") // for Compose Navigation // REMOVE "org.koin:koin-androidx-compose:X.Y.Z" if you were using it
}
Uso
La biblioteca utiliza Application y Modules de Koin. La documentación de Koin se puede encontrar aquí: https://insert-koin.io/.
La biblioteca principal contiene la función @Composable Koin, que se utiliza para configurar la aplicación Koin. Se puede usar con @Preview.
val appModule = module {
factory { "Hello, DI!" }
}@Preview
@Composable
fun App() {
Koin(appDeclaration = { modules(appModule) }) {
val text = get()
Text(text)
}
}
Alcances
Los alcances se crean envolviendo composables en @Composable KoinScope:
data class A(val value: String)val scopedModule = module {
scope {
scoped { A("scopeA") }
}
scope {
scoped { A("scopeB") }
}
}
@Preview
@Composable
fun Test() {
Koin(appDeclaration = { modules(scopedModule) }) {
Column {
KoinScope(getScope = { createScope() }) {
Text(get().value)
}
KoinScope(getScope = { createScope() }) {
Text(get().value)
}
}
}
}
ViewModel
#### dev.burnoo:cokoin-android-viewmodel:x.y.z
Llama a getViewModel para obtener un ViewModel dentro de @Composable:
class MainViewModel : ViewModel() {
val data = "Hello, DI!"
}private val viewModelModule = module {
viewModel { MainViewModel() }
}
@Composable
fun ViewModelSample() {
Koin(appDeclaration = { modules(viewModelModule) }) {
val viewModel = getViewModel()
Text(viewModel.data)
}
}
getViewModel
soporta los parámetros de inyección de Koin
y SaveStateHandle. Ejemplos avanzados pueden encontrarse
aquí.Navegación en Compose
#### dev.burnoo:cokoin-android-navigation:x.y.z
Primero reemplaza NavHost con KoinNavHost:
@Composable
fun Sample() {
val navController = rememberNavController()
Koin(appDeclaration = { modules(viewModelModule) }) {
KoinNavHost(navController, startDestination = "1") {
composable("1") {
Screen1()
}
}
}
}Luego, use getNavController y getNavViewModel dentro de la pantalla composable.
@Composable
fun Screen1() {
val navController = getNavController()
Button(onClick = { navController.navigate("2") }) {
val navViewModel = getNavViewModel()
//...
}
}
Si no desea envolver la navegación con KoinNavHost,
puede lograr resultados similares con getViewModel usando el parámetro viewModelStoreOwner:
@Composable
fun Screen1(navController: NavController) {
Button(onClick = { navController.navigate("2") }) {
val viewModel = getViewModel(
viewModelStoreOwner = navController.getBackStackEntry("root")
)
//...
}
}
Licencia
Copyright 2021 Bruno WieczorekLicensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--- Tranlated By Open Ai Tx | Last indexed: 2026-03-15 ---