Sobes.tech
Middle+

Kuidas te ise MVVM arhitektuurset lähenemist rakendaksite?

sobes.tech AI

Vastus AI-lt

MVVM (Model-View-ViewModel) on arhitektuurimuster, mis eraldab kasutajaliidese (UI), esitlusloogika ja äriloogika.

Peamised komponendid:

  • Model: Esindab andmeid ja äriloogikat. Ei sõltu UI-st.
  • Vaade: UI kiht. Kuvab andmeid ViewModel-ist ja saadab kasutaja tegevused (sündmused) ViewModel-ile. Ei sisalda äriloogikat.
  • Vaadete mudel (ViewModel): Sisaldab esitlusloogikat, valmistab andmed Model-ist ette kuvamiseks ja töötleb kasutaja tegevusi. Ei oma otsest viidet Vaatele, suhtleb jälgitavate andmete (Observable voogude) kaudu.

Iseseisev rakendamine:

  1. Modeli loomine: Lihtsad Plain Old Java Objects (POJO) või Kotlin andmeklassid andmete esitamiseks, hoidlad andmeallikatele juurdepääsuks (võrk, andmebaas).

    // Modeli näide
    andmeklass User(val id: Int, val name: String, val email: String)
    
    klass UserRepository {
        fun getUser(userId: Int): User {
            // Loogika kasutaja saamiseks andmeallikast
            return User(userId, "Test User $userId", "test$userId@example.com")
        }
    }
    
  2. ViewModeli loomine: Klass, mis pärib ViewModel Android arhitektuuri komponentidest (või oma rakendus). Hoidab LiveData või Kotlin StateFlow/SharedFlow jälgitavaid andmeid. Sisaldab meetodeid kasutaja tegevuste töötlemiseks ja andmete uuendamiseks.

    // Näide ViewModelist
    klass UserViewModel(private val userRepository: UserRepository) : androidx.lifecycle.ViewModel() {
    
        privaatne _user = MutableLiveData<User>()
        val user: LiveData<User> = _user
    
        fun loadUser(userId: Int) {
            // Reaalses rakenduses - asünkroonne laadimine
            val loadedUser = userRepository.getUser(userId)
            _user.value = loadedUser // LiveData uuendamine
        }
    
        fun updateUser(newUser: User) {
            // Loogika kasutaja uuendamiseks
            _user.value = newUser
        }
    }
    
  3. Vaate rakendamine: Activity või Fragment. Suhtleb ViewModel-iga, tellib selle jälgitavaid andmeid, uuendab UI andmete muutumisel. Delegib kasutaja sündmuste (klõpsud, teksti sisestus) töötlemise ViewModel-ile. Kasutab Data Binding või View Binding, et saavutada deklaratiivne side.

    // Näide Vaate (Fragment)
    klass UserFragment : Fragment() {
    
        privaatne hilinenud viewModel: UserViewModel
        privaatne _binding: FragmentUserBinding? = null
        privaatne 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 saamine, soovitatavalt ViewModelProvider kaudu
            viewModel = ViewModelProvider(this).get(UserViewModel::class.java)
    
            // Jälgimine jälgitavate andmete
            viewModel.user.observe(viewLifecycleOwner) { user ->
                // UI uuendamine kasutaja muutumisel
                binding.userNameTextView.text = user.name
                binding.userEmailTextView.text = user.email
            }
    
            // Sündmuse delegatsioon ViewModel-ile
            binding.loadUserButton.setOnClickListener {
                viewModel.loadUser(1) // Näide: kasutaja laadimine ID-ga 1
            }
        }
    
        override fun onDestroyView() {
            super.onDestroyView()
            _binding = null
        }
    }