关于 koin-patterns
koin-patterns 是一项介绍 Kotlin 中 Koin 依赖注入的技能,面向 Android 开发者。内容涵盖模块配置、生命周期作用域、ViewModel 注入、限定符和测试。
主要功能
- 01配置 Koin 模块
- 02定义单例与工厂依赖
- 03使用作用域与限定符
- 04在 Compose 中注入 ViewModel
- 05使用 Koin 进行测试
适用场景
- 01组织应用依赖
- 02提供生命周期作用域对象
- 03向 Compose 页面注入 ViewModel
- 04使用 Koin 模块测试代码
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ ahmed3elshaer/ everything-claude-code-mobile --skill koin-patterns安装后在 Claude Code 中输入/koin-patterns确认已加载。
详细介绍
Koin 依赖注入
使用 Koin 为 Kotlin 提供实用的依赖注入。
模块设置
// AppModule.kt
val appModule = module {
// Singletons
single<AppDatabase> { Room.databaseBuilder(...).build() }
single { get<AppDatabase>().userDao() }
// Factories (new instance each time)
factory { DateFormatter() }
}
// NetworkModule.kt
val networkModule = module {
single<HttpClient> {
HttpClient(OkHttp) {
install(ContentNegotiation) {
json(Json { ignoreUnknownKeys = true })
}
}
}
single<AuthApi> { AuthApiImpl(get()) }
single<UserApi> { UserApiImpl(get()) }
}
// FeatureModule.kt
val homeModule = module {
// Repository
single<HomeRepository> { HomeRepositoryImpl(get(), get()) }
// Use Cases
factory { GetItemsUseCase(get()) }
factory { GetItemUseCase(get()) }
// ViewModel
viewModel { HomeViewModel(get()) }
}
应用设置
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@MyApp)
modules(
appModule,
networkModule,
homeModule,
detailModule
)
}
}
}
ViewModel 注入
// In Compose
@Composable
fun HomeScreen(viewModel: HomeViewModel = koinViewModel()) {
val state by viewModel.state.collectAsStateWithLifecycle()
// ...
}
// With parameters
@Composable
fun DetailScreen(itemId: String) {
val viewModel: DetailViewModel = koinViewModel { parametersOf(itemId) }
// ...
}
// ViewModel definition with params
viewModel { params ->
DetailViewModel(
itemId = params.get(),
repository = get()
)
}
作用域
// Activity scope
val activityModule = module {
scope<MainActivity> {
scoped { NavigationController() }
}
}
// Usage
class MainActivity : AppCompatActivity(), KoinScopeComponent {
override val scope: Scope by activityScope()
val nav: NavigationController by inject()
}
限定符
val networkModule = module {
single(named("auth")) { createAuthClient() }
single(named("default")) { createDefaultClient() }
}
// Usage
class UserApi(
@Named("auth") private val client: HttpClient
)
测试
class HomeViewModelTest : KoinTest {
@get:Rule
val koinRule = KoinTestRule.create {
modules(testModule)
}
private val testModule = module {
single<HomeRepository> { mockk() }
viewModel { HomeViewModel(get()) }
}
private val viewModel: HomeViewModel by inject()
private val repository: HomeRepository by inject()
@Test
fun `loads items`() = runTest {
coEvery { repository.getItems() } returns Result.success(listOf())
// ...
}
}
请记住:Koin 注重实用性。保持模块组织有序,并使用作用域管理生命周期。
评论
支持 Markdown