在现代 Android 开发中,MVI(Model-View-Intent)架构因其简单易懂、清晰的状态管理和响应式编程的特性而受到越来越多开发者的青睐。结合 Kotlin 和 Flow,我们可以更方便地实现响应式编程。本文将手把手教你如何搭建一个基于 Android 的 MVI 架构示例。

项目结构

在开始之前,我们先简单了解一下 MVI 架构的组成部分: 1. Model:表示应用的数据和业务逻辑。 2. View:用户界面,负责展示数据并处理用户的交互。 3. Intent:用户的意图或操作,表示用户对界面的请求。

1. 创建一个简单的 Android 项目

首先,使用 Android Studio 创建一个新的 Kotlin 项目,选择 Empty Activity 模板。

2. 添加依赖库

build.gradle 文件中添加 Kotlin CoroutinesFlow 的依赖:

dependencies {
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2"
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0"
}

3. 定义 State 和 Intent

我们定义 UIStateUIIntent 来表示视图状态和用户意图。

sealed class UIState {
    object Loading : UIState()
    data class Success(val data: List<String>) : UIState()
    data class Error(val message: String) : UIState()
}

sealed class UIIntent {
    object LoadData : UIIntent()
}

4. 创建 ViewModel

在 ViewModel 中,我们将处理用户的意图,并更新 UI 状态。使用 StateFlow 来保持状态的响应。

class MainViewModel : ViewModel() {
    private val _state = MutableStateFlow<UIState>(UIState.Loading)
    val state: StateFlow<UIState> get() = _state

    fun intent(intent: UIIntent) {
        when (intent) {
            is UIIntent.LoadData -> loadData()
        }
    }

    private fun loadData() {
        viewModelScope.launch {
            _state.value = UIState.Loading
            try {
                // 模拟网络请求
                delay(2000)
                val data = listOf("Item 1", "Item 2", "Item 3")
                _state.value = UIState.Success(data)
            } catch (e: Exception) {
                _state.value = UIState.Error("加载失败")
            }
        }
    }
}

5. 创建 View

在 MainActivity 中,我们将观察状态并更新 UI。

class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: MainViewModel
    private lateinit var textView: TextView

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

        textView = findViewById(R.id.textView)
        viewModel = ViewModelProvider(this).get(MainViewModel::class.java)

        // 观察状态
        lifecycleScope.launchWhenStarted {
            viewModel.state.collect { state ->
                render(state)
            }
        }

        // 触发加载数据
        viewModel.intent(UIIntent.LoadData)
    }

    private fun render(state: UIState) {
        when (state) {
            is UIState.Loading -> {
                textView.text = "加载中..."
            }
            is UIState.Success -> {
                textView.text = state.data.joinToString(", ")
            }
            is UIState.Error -> {
                textView.text = state.message
            }
        }
    }
}

6. 布局文件

res/layout/activity_main.xml 中添加一个简单的 TextView 来展示结果:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

</LinearLayout>

总结

通过以上步骤,我们已经成功搭建了一个简单的 MVI 架构的 Android 应用。我们定义了状态和意图,创建了 ViewModel 处理数据的加载,并在 UI 中实时更新界面。通过使用 Kotlin 的 Flow 和 Coroutines,我们可以以一种声明式的方式管理 UI 状态,使代码更易于理解和维护。希望这个简单的示例能够帮助你在实际项目中更好地应用 MVI 架构。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部