mobx.dart实战教程:构建完整的待办事项应用

mobx.dart实战教程:构建完整的待办事项应用

【免费下载链接】mobx.dart MobX for the Dart language. Hassle-free, reactive state-management for your Dart and Flutter apps. 【免费下载链接】mobx.dart 项目地址: https://gitcode.com/gh_mirrors/mo/mobx.dart

mobx.dart是Dart语言的响应式状态管理库,为Dart和Flutter应用提供轻松的状态管理解决方案。通过使用mobx.dart,开发者可以构建出响应式且易于维护的应用程序,让状态管理变得简单而高效。

一、mobx.dart核心概念解析

mobx.dart基于三个核心概念构建:Observables(可观察对象)、Actions(动作)和Reactions(反应)。这三个概念构成了mobx.dart的核心架构,共同协作实现响应式状态管理。

mobx核心概念

1.1 Observables(可观察对象)

Observables是应用程序状态的持有者,它们可以是简单的变量、列表、映射等。当可观察对象的值发生变化时,所有依赖它的Reactions都会自动更新。

1.2 Actions(动作)

Actions是修改Observables的函数。通过将状态修改操作封装在Actions中,mobx.dart可以跟踪状态的变化,确保状态修改的可预测性和可调试性。

1.3 Reactions(反应)

Reactions是响应Observables变化的函数。当依赖的Observables发生变化时,Reactions会自动执行,从而更新UI或执行其他副作用操作。

响应式循环

二、环境搭建与项目初始化

2.1 安装mobx.dart依赖

要使用mobx.dart,需要在pubspec.yaml文件中添加以下依赖:

dependencies:
  mobx: ^2.2.0
  flutter_mobx: ^2.0.6

dev_dependencies:
  mobx_codegen: ^2.2.0
  build_runner: ^2.1.10

2.2 克隆项目仓库

git clone https://gitcode.com/gh_mirrors/mo/mobx.dart

三、构建待办事项应用

3.1 创建Todo模型

首先,我们需要创建一个Todo模型来表示待办事项:

// lib/todo.dart
class Todo {
  final String id;
  final String title;
  bool completed;

  Todo({
    required this.id,
    required this.title,
    this.completed = false,
  });
}

3.2 创建TodoStore

接下来,创建一个TodoStore来管理待办事项的状态:

// lib/todo_store.dart
import 'package:mobx/mobx.dart';
import 'todo.dart';

part 'todo_store.g.dart';

class TodoStore = _TodoStore with _$TodoStore;

abstract class _TodoStore with Store {
  @observable
  ObservableList<Todo> todos = ObservableList<Todo>();

  @computed
  int get pendingTodos => todos.where((todo) => !todo.completed).length;

  @computed
  int get completedTodos => todos.where((todo) => todo.completed).length;

  @action
  void addTodo(String title) {
    final todo = Todo(
      id: DateTime.now().toString(),
      title: title,
    );
    todos.add(todo);
  }

  @action
  void toggleTodo(String id) {
    final index = todos.indexWhere((todo) => todo.id == id);
    if (index != -1) {
      todos[index].completed = !todos[index].completed;
    }
  }

  @action
  void removeTodo(String id) {
    todos.removeWhere((todo) => todo.id == id);
  }

  @action
  void markAllCompleted() {
    for (final todo in todos) {
      todo.completed = true;
    }
  }

  @action
  void removeCompleted() {
    todos.removeWhere((todo) => todo.completed);
  }
}

3.3 生成代码

运行以下命令生成mobx代码:

flutter pub run build_runner watch

3.4 创建UI组件

最后,创建一个Flutter界面来展示和操作待办事项:

// lib/main.dart
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'todo_store.dart';

void main() {
  final todoStore = TodoStore();
  runApp(MyApp(todoStore: todoStore));
}

class MyApp extends StatelessWidget {
  final TodoStore todoStore;

  const MyApp({required this.todoStore});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MobX Todo App',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: TodoScreen(todoStore: todoStore),
    );
  }
}

class TodoScreen extends StatelessWidget {
  final TodoStore todoStore;
  final TextEditingController _textController = TextEditingController();

  TodoScreen({required this.todoStore});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Todos')),
      body: Column(
        children: [
          Padding(
            padding: EdgeInsets.all(8.0),
            child: TextField(
              controller: _textController,
              decoration: InputDecoration(labelText: 'Add a Todo'),
              onSubmitted: (value) {
                if (value.isNotEmpty) {
                  todoStore.addTodo(value);
                  _textController.clear();
                }
              },
            ),
          ),
          Observer(
            builder: (_) => Column(
              children: [
                Row(
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  children: [
                    ElevatedButton(
                      onPressed: todoStore.removeCompleted,
                      child: Text('Remove Completed'),
                    ),
                    ElevatedButton(
                      onPressed: todoStore.markAllCompleted,
                      child: Text('Mark All Completed'),
                    ),
                  ],
                ),
                Text('${todoStore.pendingTodos} pending, ${todoStore.completedTodos} completed'),
                Expanded(
                  child: ListView.builder(
                    itemCount: todoStore.todos.length,
                    itemBuilder: (_, index) {
                      final todo = todoStore.todos[index];
                      return ListTile(
                        leading: Checkbox(
                          value: todo.completed,
                          onChanged: (_) => todoStore.toggleTodo(todo.id),
                        ),
                        title: Text(todo.title),
                        trailing: IconButton(
                          icon: Icon(Icons.delete),
                          onPressed: () => todoStore.removeTodo(todo.id),
                        ),
                      );
                    },
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

四、待办事项应用功能展示

完成上述步骤后,你将得到一个功能完善的待办事项应用。该应用允许你添加、标记完成、删除待办事项,以及批量操作。

待办事项应用界面

五、总结

通过本教程,你学习了如何使用mobx.dart构建一个完整的待办事项应用。mobx.dart的响应式状态管理让应用开发变得更加简单和高效。你可以在mobx_examples/lib/todos/目录下找到完整的示例代码。

mobx.dart不仅适用于待办事项应用,还可以用于构建更复杂的应用程序。它的灵活性和简洁性使得状态管理不再是开发中的痛点,而是成为一种乐趣。

【免费下载链接】mobx.dart MobX for the Dart language. Hassle-free, reactive state-management for your Dart and Flutter apps. 【免费下载链接】mobx.dart 项目地址: https://gitcode.com/gh_mirrors/mo/mobx.dart

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值