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

news2024/9/30 9:34:48

实践flutter mobx:

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

  • https://juejin.cn/post/6954523549386162213
  • https://github.com/ThinkerWing/language/commit/56be25d4b11264cfffa4e909a3a03565063240ff
    演示效果
    在这里插入图片描述

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

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

dependencies:
  mobx:
  flutter_mobx:

dev_dependencies:
  build_runner: 
  mobx_codegen:

重写一下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(),
    );
  }
}


第二步,在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一个最新的值
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: <Widget>[
              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: <Widget>[
                  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,
                  ),
                ],
              )
            ],
          ),
        ));
  }
}

第三步,在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--;
  }
}

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

flutter packages pub run build_runner watch

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论算法是如何优化的:四数之和

论算法是如何优化的&#xff1a;四数之和 心路历程 闲来无事&#xff0c;刷刷力扣&#xff0c;突然看到一道题目叫做四数之和&#xff0c;难度中等&#xff0c;心想&#xff0c;这不就是我大显身手的时候了吗&#xff1f;&#xff1f;&#xff1f;我直接就是一个点击进入&…

2022 CMU15-445 Project 1 Buffer Pool

通过截图 Task #1 - Extendible Hash Table 该 task 的知识点名为 可扩展动态散列 https://cloud.tencent.com/developer/article/1020586 这个部分要实现一个 extendible 哈希表&#xff0c;内部不可以用 built-in 的哈希表&#xff0c;比如 unordered_map。这个哈希表在 Buf…

Open-Dis的C++版本编译(CMake-gpu 3.21.4)以及SDL2和SDL_net库的配置使用

目录Open-DisOpen-Dis简介分布式交互仿真更多资料Open-Dis下载CMake编译教程SDL2和SDL_netSDL介绍下载SDL配置SDL2下载SDL_net配置SDL_net工程编译Open-DisOpen-Dis Open-Dis简介 Dis是国防部&#xff0c;北约和联合国实时/虚拟世界建模和仿真中使用最广泛的协议之一。 Open-…

关于二进制

关于二进制 读《程序是怎样跑起来的》 用二进制表示计算机信息的原因 计算机内部是由IC&#xff08;集成电路&#xff09;这种电子部件构成的。CPU和内存也是IC的一种&#xff0c;IC有几种不同的形状&#xff0c;有的像一条黑色的蜈蚣&#xff0c;在其两侧有数个乃至数百个引脚…

智慧水务:数字孪生污水处理厂,3D可视化一键管控

近年来&#xff0c;智慧水务、数字水务成为水务行业的热点领域。对于污水处理领域&#xff0c;如何贯彻落实双碳战略&#xff0c;积极推进智慧水厂建设&#xff0c;显得尤为关键。 可视化技术结合视频融合、BIM、5G、物联网、云计算及大数据等先进技术&#xff0c;围绕水质达标…

用DIV+CSS技术制作个人博客网站(web前端网页制作课期末作业)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【Docker】搭建MySQL主从复制,详细的图文展示

Docker是基于Go语言实现的云开源项目。Docker的主要目标是**“Build&#xff0c;Ship and Run Any App,Anywhere”**。也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&#xff08;可以是一个WEB应用或数据库应用等等&#xff09;及其运…

[附源码]JAVA毕业设计计算机散件报价系统(系统+LW)

[附源码]JAVA毕业设计计算机散件报价系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…

技巧 | Python绘制2022年卡塔尔世界杯决赛圈预测图

文章目录&#x1f3f3;️‍&#x1f308; 1. 世界杯三十二强&#x1f3f3;️‍&#x1f308; 2. 世界杯十六强&#x1f3f3;️‍&#x1f308; 3. 世界杯八强&#x1f3f3;️‍&#x1f308; 4. 世界杯四强&#x1f3f3;️‍&#x1f308; 5. 决赛圈&#x1f3f3;️‍&#x1f…

技术内幕 | 阿里云EMR StarRocks 极速数据湖分析

作者&#xff1a;阿里云智能技术专家 周康&#xff0c;StarRocks Active Contributor 郑志铨&#xff08;本文为作者在 StarRocks Summit Asia 2022 上的分享&#xff09; 为了能够满足更多用户对于极速分析数据的需求&#xff0c;同时让 StarRocks 强大的分析能力应用在更加广…

【温故而知新】构建高可用Linux服务器(三)

时间&#xff1a;2022年12月02日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 前言 大家好&#xff0c;欢迎来到小蒋聊技术。小蒋准备和大家一起聊聊技术的那些事。 今天小蒋继续坚持“温故而知新”的落地实践&#xff0c;继续…

[附源码]计算机毕业设计影院管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【单片机基础】C51语言基础

文章目录1、使用C/C开发单片机的优点2、C51中的基本数据类型3、C51数据类型扩展定义4、C51中的运算符与基础语句5、二进制与十六进制转换1、使用C/C开发单片机的优点 C/C语言作为一种非常方便的语言得到了广泛的支持&#xff0c;如STC、STM32、arduino、乐鑫科技的单片机都支持…

【目标搜索】基于matlab运动编码粒子群算法优化 (MPSO) 无人机搜索丢失目标【含Matlab源码 2254期】

⛄一、运动编码粒子群算法简介 1 粒子群算法 PSO算法是一种基于群体智能的随机优化方法。在PSO中&#xff0c;粒子群模拟鸟群行为在搜索空间中探索&#xff08;全局搜索&#xff09;和开发&#xff08;局部搜索&#xff09;&#xff0c;最终找到全局最优解。粒子的速度和位置更…

网络安全观察报告 攻击态势

设备类漏洞从未缓解 从图 5.1 中可以看到&#xff0c;针对设备漏洞的攻击占全部利用漏洞攻击的 43%&#xff0c;这和近两年智能路由器等 联网设备大规模增长密切相关。正如绿盟科技在《2017 年物联网报告》1 中提到的那样&#xff0c;很多智能设备 在设计之初&#xff0c;安全…

第3章 Thymeleaf模板渲染

文章目录第3章 Thymeleaf模板渲染3.2 Thymeleaf编程起步3.4 读取资源文件3.5 路径处理3.6 内置对象操作支持3.7 对象输出3.8 页面逻辑处理3.9 数据迭代处理3.10 包含指令3.11 Thymeleaf数据处理3.12 本章小结3.12 本章小结第3章 Thymeleaf模板渲染 3.2 Thymelea…

【OpenCV-Python】教程:3-13 Hough直线变换

OpenCV Python Hough直线变换 【目标】 理解Hough变换的概念学会使用Hough变换检测直线cv2.HoughLines(), cv2.HoughLinesP() 【理论】 Hough 变换是一个非常有用的技术&#xff0c;可以检测任何形状&#xff0c;只要那个形状可以通过数学方程表示出来&#xff0c;即使检测…

[附源码]计算机毕业设计springboot小区疫情事件处理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

传感器_三相-双极性-开关型-霍尔传感器 速度+电角度解算理解

1 前言 最近项目上涉及到使用三相-双极性-开关型-霍尔传感器解算 电机转速 、电角度的问题。结合自己的理解请教前辈&#xff0c;终有所得&#xff0c;下面做一个学习的记录。 主要以思路为主&#xff0c;不涉及代码。 2 正文 2.1 什么是三相&#xff1f; 所谓三相-双极性-…

毕设项目 - SSM农业商品信息管理权限后台子系统(含源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.3 系统结构设计4 项目获取1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品&#xff0c;【基于SSM的农业商品…