Fundamental Notes/Android

Orbit MVI

콩콩댕 2023. 6. 20. 23:31
반응형

Orbit repository : https://github.com/babylonhealth/orbit-mv

 

Orbit은 Android 애플리케이션의 상태를 관리하는 데 도움이 되는 프레임워크다.

MVI 패턴을 사용하여 애플리케이션의 상태를 관리할 수 있다.

MVI 패턴은 애플리케이션의 상태를 세 가지 부분으로 분리한다.

  • View: 애플리케이션의 사용자 인터페이스를 나타낸다.
  • ViewModel: 애플리케이션의 상태를 관리한다.
  • Model: 애플리케이션의 데이터를 제공한다.

 

Orbit은 View와 ViewModel 간의 상호 작용을 관리하는 데 도움이 된다. View는 ViewModel에 상태 변경을 요청하고, ViewModel은 Model에서 데이터를 가져와 View에 상태를 업데이트한다.

 

Orbit을 사용하여 간단한 MVI 프로젝트를 작성하기

  1. 새로운 Android 프로젝트를 생성한다
  2. 프로젝트에 Orbit 라이브러리를 추가한다
  3. ViewModelFactory 클래스를 생성한다. 이 클래스는 ViewModel을 생성하는 데 사용된다.
  4. ViewModel 클래스를 생성한다. 이 클래스는 애플리케이션의 상태를 관리한다.
  5. Model 클래스를 생성한다. 이 클래스는 애플리케이션의 데이터를 제공한다.
  6. Activity 클래스를 생성한다. 이 클래스는 애플리케이션의 사용자 인터페이스를 나타낸다.
  7. Activity 클래스에서 ViewModelFactory를 사용하여 ViewModel을 생성한다.
  8. Activity 클래스에서 ViewModel의 getState() 메서드를 사용하여 애플리케이션의 상태를 가져온다.
  9. Activity 클래스에서 ViewModel의 setState() 메서드를 사용하여 애플리케이션의 상태를 업데이트 한다.
MainViewModel.kt

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class MainViewModel : ViewModel() {

    private val state = MutableLiveData<String>()

    val currentState: String
        get() = state.value ?: ""

    fun setState(state: String) {
        this.state.value = state
    }
}
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import android.os.Bundle
import android.widget.TextView

class MainActivity : AppCompatActivity() {

    private lateinit var viewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel = ViewModelProvider(this).get(MainViewModel::class.java)

        viewModel.currentState.observe(this, Observer { state ->
            (findViewById<TextView>(R.id.text_view)).text = state
        })

        viewModel.setState("Hello, World!")
    }
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello, World!"
        android:textStyle="bold"
        android:textSize="20sp"
        android:layout_centerInParent="true"/>

</RelativeLayout>