Level 9
The Full Network Stack (Retrofit + Repository)
Clean Architecture Data Layer
The "Clean Architecture" way to fetch data.
📚 Explanation
Clean Architecture separates concerns: API (Retrofit interface), Repository (data source abstraction), and ViewModel (business logic). Retrofit uses suspend functions for coroutines. `stateIn` converts a Flow to a StateFlow, sharing the subscription across collectors.
Note: Code execution is not available for Android/Kotlin in the browser. Use Android Studio to run and test the app.
// The Interface (API)import retrofit2.http.GETinterface UserService {@GET("users/me")suspend fun getUser(): UserDto // Suspend function for Coroutines}// The Repository (Data Source)import javax.inject.Injectclass UserRepository @Inject constructor(private val api: UserService) {// Expose a Flow, or a suspend functionfun getUserStream(): Flow<User> = flow {emit(api.getUser().toDomain())}}// The Consumption (ViewModel)@HiltViewModelclass MainViewModel @Inject constructor(private val repository: UserRepository) : ViewModel() {val userState = repository.getUserStream().stateIn(scope = viewModelScope,started = SharingStarted.WhileSubscribed(5000),initialValue = User.Empty)}