Sobes.tech
Junior

Разкажи за патърна MVVM.

sobes.tech AI

Отговор от AI

Модел-Преглед-Модел на преглед (MVVM) е архитектурен шаблон, който разделя потребителския интерфейс (View) от бизнес логиката (Model) чрез посредник - Модел на прегледа (ViewModel).

  • Model: Представлява данните и бизнес логиката на приложението. Не съдържа специфична за UI логика.
  • View: Показва данните от ViewModel и изпраща действия на потребителя (например натискания на бутони) към ViewModel. Не съдържа бизнес логика, само логика за представяне.
  • ViewModel: действа като свързващо звено. Предоставя данни от Model за View във формат, подходящ за показване, и обработва заявки от View, като актуализира Model. Съдържа логика за представяне, но не манипулира директно View. Често използва LiveData или StateFlow за реактивни актуализации.

Предимства:

  • Разделяне на отговорностите: Подобрява четливостта и поддръжката на кода.
  • Тестируемост: ViewModel е лесен за тестване в изолация, тъй като не зависи от Android API.
  • Поддръжка на жизнения цикъл: ViewModel оцелява при промени в конфигурацията (например завъртане на екрана) и избягва повторно получаване на данни.
  • Подобрена модулност.

Примерна структура:

// Модел (репозитори пример)
class UserRepository {
    fun getUsers(): List<User> {
        // ... логика за получаване на потребители ...
        return listOf(User("Alice"), User("Bob"))
    }
}

// ViewModel
class UserViewModel(private val repository: UserRepository) : ViewModel() {
    private val _users = MutableLiveData<List<User>>()
    val users: LiveData<List<User>> = _users

    init {
        loadUsers()
    }

    private fun loadUsers() {
        _users.value = repository.getUsers()
    }
}

// Преглед (Fragment/Activity)
class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels() // Използване на делегат от Android KTX

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewModel.users.observe(viewLifecycleOwner) { userList ->
            // Актуализиране на UI (например, адаптер RecyclerView)
            updateUI(userList)
        }
    }

    private fun updateUI(userList: List<User>) {
        // Логика за актуализиране на TextView, RecyclerView и др.
    }
}