Android MVI 架构模式

简介

MVI(Model-View-Intent)是一种在 Android 应用程序中使用的架构模式,它通过将应用程序的状态和用户操作分离,提供了一种可预测和可测试的方式来管理应用程序的状态。

MVI 架构模式的核心概念包括:

  • Model:表示应用程序的状态,是一个不可变的数据类。
  • View:负责显示用户界面,并向用户显示应用程序的状态。
  • Intent:表示用户的操作,如点击按钮或输入文本。
  • Reducer:根据接收到的 Intent 和当前的 Model 状态,计算新的 Model 状态。
  • Action:表示一次用户操作的结果,它是一个命令,用于更新 Model 状态。

在本文中,我们将详细介绍 MVI 架构模式,并提供一个示例应用程序来说明其工作原理。

MVI 架构示例

为了更好地理解 MVI 架构模式,我们将创建一个简单的待办事项应用程序。该应用程序包含两个屏幕:待办事项列表和添加待办事项。

Model 类

我们首先定义一个 Model 类来表示应用程序的状态,它包含一个待办事项列表。

data class TodoList(val items: List<TodoItem>)

View 类

接下来,我们创建一个 View 类来管理用户界面的显示和用户操作的处理。

class TodoListView : Activity() {
    private lateinit var todoListAdapter: TodoListAdapter

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

        todoListAdapter = TodoListAdapter()

        // 初始化待办事项列表
        val todoListRecyclerView = findViewById<RecyclerView>(R.id.todoListRecyclerView)
        todoListRecyclerView.adapter = todoListAdapter

        // 处理用户点击添加待办事项按钮的操作
        val addButton = findViewById<Button>(R.id.addButton)
        addButton.setOnClickListener {
            // 创建一个添加待办事项的 Intent
            val intent = AddTodoItemIntent()

            // 发送 Intent 到 Reducer
            TodoListReducer.reduce(intent)
        }
    }

    // 更新待办事项列表的显示
    fun updateTodoList(todoList: TodoList) {
        todoListAdapter.submitList(todoList.items)
    }
}

Intent 类

我们还需要创建一个 Intent 类来表示用户操作,例如添加待办事项。

sealed class TodoListIntent {
    data class AddTodoItemIntent(val todoItem: TodoItem) : TodoListIntent()
    // 其他 Intent 类型...
}

Reducer 类

接下来,我们创建一个 Reducer 类来处理 Intent,并计算新的 Model 状态。Reducer 会接收当前的 Model 状态和接收到的 Intent,并返回新的 Model 状态。

object TodoListReducer {
    fun reduce(intent: TodoListIntent, currentModel: TodoList): TodoList {
        return when (intent) {
            is AddTodoItemIntent -> {
                val newTodoList = currentModel.items.toMutableList()
                newTodoList.add(intent.todoItem)
                TodoList(newTodoList)
            }
            // 处理其他 Intent 类型...
        }
    }
}

序列图

下面是一个使用 mermaid 序列图语法表示的 MVI 架构模式的序列图示例:

sequenceDiagram
    participant View
    participant Reducer
    participant Model

    View->>Reducer: 发送 Intent
    Reducer->>Model: 计算新的 Model
    Model-->>View: 更新视图

类图

下面是一个使用 mermaid 类图语法表示的 MVI 架构示例的类图:

classDiagram
    class View
    class Reducer
    class Model
    class Intent

    View --> Reducer: 发送 Intent
    Reducer --> Model: 计算新的 Model
    Model --> View: 更新视图
    View --> Intent: 发送 Intent

总结

MVI 架构模式提供了一种可预测和可测试的方式来管理应用程序的状态。它通过将应用程序的状态和用户操作分离,使得我们能够更好地理解和维护应用程序的代码。在本文中,我们介绍了 MVI 架构模式的核心概念,并提供了一个示例应用程序来说明其工作原理。