Чӣ гуна шумо мустақилона муносибати меъмории MVVM-ро татбиқ мекунед?
sobes.tech AI
Ҷавоб аз AI
MVVM (Model-View-ViewModel) шаблони архитектура аст, ки UI, логикаи намоиш ва логикаи бизнесро ҷудо мекунад.
Компонентҳои асосӣ:
- Model: Намояндаи маълумот ва логикаи бизнес. Аз UI мустақил аст.
- View: қабати UI. Маълумотро аз ViewModel намоиш медиҳад ва амалҳои корбар (ҳодисаҳо) ба ViewModel мефиристад. Логикаи бизнесро дар бар намегирад.
- ViewModel: Логикаи намоишро дорад, маълумотро аз Model барои намоиш дар View омода мекунад ва амалҳои корбарро коркард мекунад. Ба View мустақиман пайваст намешавад, тавассути маълумоти назоратшаванда (Observable streams) иртибот мекунад.
Иҷрои мустақил:
-
Эҷоди Model: Objectҳои оддӣ POJO ё Kotlin data классҳо барои намояндагии маълумот, репозиториҳо барои дастрасӣ ба манбаъҳои маълумот (шабака, БД).
// Намунаи Model data class User(val id: Int, val name: String, val email: String) class UserRepository { fun getUser(userId: Int): User { // Логикаи гирифтани корбар аз манбаъ return User(userId, "Test User $userId", "test$userId@example.com") } } -
Эҷоди ViewModel: Класс, ки аз
ViewModelаз Android Architecture Components (ё реализацияи худ бо Lifecycle awareness) мерос мегирад. МаълумотҳоиLiveDataё KotlinStateFlow/SharedFlow-ро нигоҳ медорад. Методҳо барои коркарди амалҳои корбар ва навсозии маълумот дорад.// Намунаи ViewModel class UserViewModel(private val userRepository: UserRepository) : androidx.lifecycle.ViewModel() { private val _user = MutableLiveData<User>() val user: LiveData<User> = _user fun loadUser(userId: Int) { // Дар барномаи воқеӣ - боркунии асинхрон val loadedUser = userRepository.getUser(userId) _user.value = loadedUser // Навсозии LiveData } fun updateUser(newUser: User) { // Логикаи навсозии корбар _user.value = newUser } } -
Иҷрои View: Activity ё Fragment. Бо ViewModel пайваст мешавад, ба маълумоти назоратшаванда дар ViewModel обуна мешавад, UI-ро дар тағйирёбии маълумот навсозӣ мекунад. Ҳодисаҳои корбарро (кликҳо, ворид кардани матн) ба ViewModel месупорад. Data Binding ё View Binding-ро барои пайвастагии декларативӣ истифода мебарад.
// Намунаи View (Fragment) class UserFragment : Fragment() { private lateinit var viewModel: UserViewModel private var _binding: FragmentUserBinding? = null private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = FragmentUserBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // гирифтани ViewModel, беҳтар бо ViewModelProvider viewModel = ViewModelProvider(this).get(UserViewModel::class.java) // обуна ба маълумоти назоратшаванда viewModel.user.observe(viewLifecycleOwner) { user -> // навсозии UI дар тағйирёбии корбар binding.userNameTextView.text = user.name binding.userEmailTextView.text = user.email } // супоридани ҳодиса ба ViewModel binding.loadUserButton.setOnClickListener { viewModel.loadUser(1) // Мисол: боркунии корбар бо ID 1 } } override fun onDestroyView() { super.onDestroyView() _binding = null } } -
Пайваст кардани компонентҳо: View як нусхаи ViewModel (аз
ViewModelProvider) месозад ва ба маълумоти назоратшаванда обуна мешавад. ViewModel бо Model кор мекунад.
Аспектҳои асосии иҷрои мустақил:
- Истифодаи
LiveDataё Flow барои реактивӣ ва навсозии автоматии UI дар тағйирёбии маълумот. - Истифодаи
ViewModelProviderбарои таъмин кардани давраи дурустии ViewModel. - Истифодаи Dependency Injection (масалан, Hilt ё Koin) барои таъмин кардани вобастагиҳо (масалан, UserRepository) дар ViewModel.
- Ҳалли амалиётҳои асинхронӣ (захираҳои шабакавӣ, кор бо базаи додаҳо) дар ViewModel бо истифода аз корутинҳо ё механизмҳои дигар.
Фоидаҳо:
- Тестшаванда: ViewModel ба осонӣ тест карда мешавад, алоҳида аз UI.
- Ҷудо кардани масъулиятҳо: Ҷудоии равшан байни UI, логикаи намоиш ва логикаи бизнес.
- Мустаҳкамӣ дар тағйиротҳои конфигурация: ViewModel дар гардииши экран ва дигар тағйиротҳо нигоҳ дошта мешавад.
- Беҳтар кардани нигоҳдории код.