• 【flutter-mobx】Flutter 状态管理- 使用 MobX实现计数器


    实践flutter mobx:

    提示:对下面这篇掘金文章的实践,通过flutter结合 mobx 实现计数器,过程中也添加了一些处理和注释,代码放在feat/mobx下
    在这里插入图片描述


    第一步,我们首先从pubspec.yaml开始:

    在 pubspec.yaml 中添加一些依赖 (dependencies 与 dev_dependencies),同时运行依赖拉取flutter packages get,它会将我们所需的软件包添加至项目中

    dependencies:
      mobx:
      flutter_mobx:
    
    dev_dependencies:
      build_runner: 
      mobx_codegen:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    重写一下main.dart 更加整洁

    import 'package:flutter/material.dart';
    import 'package:language/pages/counter_page.dart';
     
    void main() => runApp(const MyApp());
     
    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: CounterPage(),
        );
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    第二步,在lib/pages/counter_page.dart 中创建 CounterPage:

    CounterPage只是一个StatelessWidget,在main.dart中导入,project 为项目名。
    import 'package:`${project}`/pages/counter_page.dart';

    onPressed 回调可以用来调用counter.increment

      // 这里先不用Text而是包裹一个新的widget,然后这里需要一个observer widget
                 // 它不是可以直接使用的,因此我们需要导入它
                 Observer(
                     builder: (_) => Text(
                           '${counter.value}',
                           style: const TextStyle(fontSize: 42.0),
                         )),
                 // 现在我们有了Observe 和 builder,它随时给我们的Text一个最新的值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    import 'package:language/store/counter/counter.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter_mobx/flutter_mobx.dart';
    
    class CounterPage extends StatelessWidget {
      final Counter counter = Counter();
    
      CounterPage({super.key});
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
              title: const Text('Flutter and MobX by think'),
            ),
            body: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  const Text(
                    'Counter',
                    style: TextStyle(fontSize: 30.0),
                  ),
                  // const Text(
                  //   '0',
                  //   style: TextStyle(fontSize: 42.0),
                  // ),
                  // 这里先不用Text而是包裹一个新的widget,然后这里需要一个observer widget
                  // 它不是可以直接使用的,因此我们需要导入它
                  Observer(
                      builder: (_) => Text(
                            '${counter.value}',
                            style: const TextStyle(fontSize: 42.0),
                          )),
                  // 现在我们有了Observe 和 builder,它随时给我们的Text一个最新的值
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      TextButton.icon(
                        icon: const Icon(Icons.add),
                        label: const Text('Add'),
                        // onPressed 回调可以用来调用counter.increment
                        // onPressed: () {},
                        onPressed: counter.increment,
                      ),
                      TextButton.icon(
                        icon: const Icon(Icons.remove),
                        label: const Text('Remove'),
                        onPressed: counter.decrement,
                      ),
                    ],
                  )
                ],
              ),
            ));
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    第三步,在lib目录下创建store文件夹,我们很有可能在store中管理很多的内容,所以再创建一个counter文件夹再创建counter.dart.

    import 'package:mobx/mobx.dart';
     
    // This is our generated file (we'll see this soon!)
    part 'counter.g.dart';
     
    // We expose this to be used throughout our project
    class Counter = _Counter with _$Counter;
     
    // Our store class
    abstract class _Counter with Store {
      @observable
      // 定义变量,它是一个能够被观察到int类型的count
      int value = 1;
     
      @action
      void increment() {
        value++;
      }
     
      @action
      void decrement() {
        value--;
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    提示:写完counter.dart之后需要启动生成器
    在终端的该工程目录下通过下面的命令运行 build_runner 和 mobx_codegen:

    flutter packages pub run build_runner watch
    
    • 1

    整体的变化也是比较小的,main.dart 就是将create的初始化项目更简洁的重新写了一下,
    counter.g.dart 也是通过命令自己生成的,实际上只改动了4个文件,也没有很多代码,这里的行数主要是添加依赖上。
    在这里插入图片描述

  • 相关阅读:
    Linux 下安装 miniconda,管理 Python 多环境
    探索Java设计模式:中介者模式
    PCIe系列专题之二:2.5 Flow Control缓存架构及信用积分
    计算机网络:应用层 - 文件传输协议 FTP & 电子邮件
    Node.js | 基础完结、综合训练 —— 路由应用实战教程
    聚焦降本增效,用户满意度成达内教育增长“晴雨表”
    (栈)剑指 Offer 09. 用两个栈实现队列(java)
    Docker进阶——再次认识docker的概念 & Docker的结构 & Docker镜像结构 & 镜像的构建方式
    ArduinoUNO实战-第二十一章-通过调整电位器来改变9克舵机的角度
    vite3学习记录
  • 原文地址:https://blog.csdn.net/daddykei/article/details/128143158