A lightweight Kotlin Multiplatform library for observing network connectivity on Android and iOS.
- 🌐 Real-time network state monitoring
- 📱 Supports Android and iOS
- 🔄 Reactive API via Kotlin
Flow - 🧪 Testable via
INetworkMonitorinterface - ⚡ Instant
Connectedreaction, debouncedDisconnectedto filter brief spikes
# gradle/libs.versions.toml
[versions]
kmp-network-monitor = "1.0.1"
[libraries]
kmp-network-monitor = { module = "io.github.froyder:kmp-network-monitor", version.ref = "kmp-network-monitor" }// build.gradle.kts
commonMain.dependencies {
implementation(libs.kmp.network.monitor)
}Initialize the library once in your Application.onCreate() or MainActivity.onCreate():
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
NetworkMonitorInitializer.initialize(this)
}No setup required — the library works out of the box on iOS.
NetworkMonitorProvider is a singleton that provides a shared, debounced StateFlow.
Use this in your UI layer:
// In a Composable
val connectionState by NetworkMonitorProvider.connectionState.collectAsState()
when (connectionState) {
is ConnectionState.Connected -> Text("Online")
is ConnectionState.Disconnected -> Text("Offline")
is ConnectionState.Unknown -> Text("Checking...")
}For cases where you need to verify connectivity before an operation:
private suspend fun checkConnection() {
val state = NetworkMonitorProvider.connectionState.first { it !is ConnectionState.Unknown }
if (state is ConnectionState.Disconnected) {
throw Exception("No internet connection")
}
}For manual control or ViewModel usage with dependency injection:
class MyViewModel(
private val networkMonitor: INetworkMonitor = NetworkMonitor()
) : ViewModel() {
init {
viewModelScope.launch {
networkMonitor.connectionState.collect { state ->
when (state) {
is ConnectionState.Connected -> println("Online")
is ConnectionState.Disconnected -> println("Offline")
is ConnectionState.Unknown -> println("Checking...")
}
}
}
}
}Inject INetworkMonitor into your classes and use FakeNetworkMonitor in tests:
// Production
class MyViewModel(
private val networkMonitor: INetworkMonitor = NetworkMonitor()
)
// Test
val fake = FakeNetworkMonitor(initialState = ConnectionState.Connected)
fake.emit(ConnectionState.Disconnected) // simulate network loss| State | Description |
|---|---|
Connected |
Device has an active, validated internet connection |
Disconnected |
Device has no internet connection |
Unknown |
Connection state has not yet been determined |
| Platform | Minimum version |
|---|---|
| Android | API 26 (Android 8.0) |
| iOS | iOS 12.0 |
Copyright 2026 Ilia Khomutskikh
Licensed under the Apache License, Version 2.0
- Improved README: added one-shot connection check example, fixed Testing section code sample, added Changelog
- Initial release