Какую методологию используете в команде

Ответ

Мы используем MVVM (Model-View-ViewModel) как основу, так как она обеспечивает хорошее разделение ответственности и упрощает тестирование. Для UI слоя часто применяем Jetpack Compose или XML с Data Binding.

Пример:

// ViewModel
class UserViewModel : ViewModel() {  
    private val _user = MutableStateFlow<User?>(null)  
    val user: StateFlow<User?> = _user  

    fun fetchUser() {  
        viewModelScope.launch {  
            _user.value = repository.getUser()  
        }  
    }  
}  

// Composable  
@Composable  
fun UserScreen(viewModel: UserViewModel) {  
    val user by viewModel.user.collectAsState()  
    // UI logic  
}  

Дополнительно применяем Clean Architecture для масштабируемости и Kotlin Coroutines/Flow для асинхронности.

Ответ 18+ 🔞

Ёпта, ну смотри, как у нас тут обычно дела обстоят. Берём за основу MVVM (Model-View-ViewModel), потому что это, блядь, как золотой стандарт — всё по полочкам, логика отдельно, интерфейс отдельно, и тесты писать не ебись конём. Для UI сейчас, конечно, Jetpack Compose в тренде, но если проект старый или команда привыкла — можно и на XML с Data Binding остаться, хуй с ним.

Вот, смотри, простой пример, чтоб понятно было, о чём речь:

// ViewModel — это где вся магия и бизнес-логика
class UserViewModel : ViewModel() {  
    private val _user = MutableStateFlow<User?>(null)  
    val user: StateFlow<User?> = _user  // На это вьюха подписывается

    fun fetchUser() {  
        viewModelScope.launch {  
            _user.value = repository.getUser()  // Тяну данные, не грузя главный поток
        }  
    }  
}  

// А это уже Composable — наша вьюха, которая рисует интерфейс
@Composable  
fun UserScreen(viewModel: UserViewModel) {  
    val user by viewModel.user.collectAsState()  // Слушаем поток данных
    // И тут уже вся UI-логика, что куда выводить
}  

А чтобы вообще не было мудацких проблем с поддержкой, когда проект вырастет до овердохуища, сверху ещё натягиваем Clean Architecture. Это чтобы слои, как матрёшки, друг в друге сидели и не лезли куда не надо. Ну и для асинхронщины — Kotlin Coroutines/Flow, само собой, ибо без них сейчас нихуя не сделаешь, всё должно летать.