Flutter Bloc之简单记录

news2025/1/16 5:33:34

目录

0.库安装

1.插件和自动生成

2.状态的配置

1.初始化中:

2.赋值完成后:

3.如果出错:

3.事件的配置

1.定义一个读取事件

2.定义一个更改事件

4.Bloc的设置

5.Bloc的使用

1.BlocProvider

2.内部调用


参考文章进行类的配置

0.库安装

首先需要安装bloc相关的两个库flutter_bloc和equatable。

1.插件和自动生成

我使用的是Android Studio,首先在插件市场安装Bloc,可以用来快速生成bloc类

bloc插件

 在bloces文件目录下新建想要创建的类名,右键New->Bloc Class

输入想创建的类名,选择equatable即可

 

 最终插件会在该目录下自动生成3个文件

 分别是:

test_bloc.dart:管理bloc的整体配置;

test_event.dart:管理bloc数据对应所需要处理的事件;

test_state.dart:管理bloc数据所存在的状态

2.状态的配置

先配置密封状态类,密封类必定抽象,无法在外部被继承且可以被switch选择

sealed class TestState extends Equatable {
  const TestState();
}

首先,可以配置我们认为bloc数据所可能存在的状态

1.初始化中:

/// 初始化数据,该状态无返回值
final class TestInitial extends TestState {
  @override
  List<Object> get props => [];
}

2.赋值完成后:

/// 初始化完成,该状态要返回赋值的值
class TestInitialed extends TestState {
  final Object? value;
  const TestInitialed({this.value = Object});

  @override
  List<Object?> get props => [value];
}

3.如果出错:

/// 显示错误情况
class TestError extends TestState{

  @override
  List<Object> get props => [];
}

以上简单配置了3种赋值的简单情况。

最终test_state.dart的内容为:

part of 'test_bloc.dart';

sealed class TestState extends Equatable {
  const TestState();
}

/// 初始化数据,该状态无返回值
final class TestInitial extends TestState {
  @override
  List<Object> get props => [];
}

/// 初始化完成,该状态要返回赋值的值
class TestInitialed extends TestState {
  final Object? value;
  const TestInitialed({this.value = Object});

  @override
  List<Object?> get props => [value];
}

/// 显示错误情况
class TestError extends TestState{

  @override
  List<Object> get props => [];
}

3.事件的配置

同理先配置事件的密封类

/// 密封类,必定抽象,无法在外部继承,可以被 switch 选择
sealed class TestEvent extends Equatable {
  const TestEvent();
}

1.定义一个读取事件

/// 获取信息事件
class LoadTestData extends TestEvent {

  @override
  List<Object> get props => [];
}

2.定义一个更改事件

/// 更改信息事件
class ChangeTestData extends TestEvent {
  final Object value;
  const ChangeTestData(this.value);

  @override
  List<Object> get props => [value];
}

最终test_event.dart的内容为:

part of 'test_bloc.dart';

/// 密封类,必定抽象,无法在外部继承,可以被 switch 选择
sealed class TestEvent extends Equatable {
  const TestEvent();
}

/// 获取信息事件
class LoadTestData extends TestEvent {

  @override
  List<Object> get props => [];
}

/// 更改信息事件
class ChangeTestData extends TestEvent {
  final Object value;
  const ChangeTestData(this.value);

  @override
  List<Object> get props => [value];
}

4.Bloc的设置

Bloc类TestBloc继承Bloc<TestEvent, TestState>,并且在初始化时为TestInitial()状态,然后谁知它在不同事件中的不同状态下的情况,这里定义前文中两个事件会对应发生的情况:

import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';

part 'test_event.dart';
part 'test_state.dart';

class TestBloc extends Bloc<TestEvent, TestState> {
  TestBloc() : super(TestInitial()) {
    /// 定义读取事件发生时不同状态的情况
    on<LoadTestData>((event, emit) async {
      emit(TestInitial());
      try{
        await Future<void>.delayed(const Duration(seconds: 1));
        /// 正常应该是拉取到的信息
        const _value = Object();
        emit(const TestInitialed(value: _value));
      }catch(_){
        emit(TestError());
      }
    });

    on<ChangeTestData>((event, emit) async {
      emit(TestInitial());
      try{
        await Future<void>.delayed(const Duration(seconds: 1));
        /// 正常应该是拉取到的信息
        const _value = Object();
        emit(const TestInitialed(value: _value));
      }catch(_){
        emit(TestError());
      }
    });
  }
}

5.Bloc的使用

1.BlocProvider

在需要使用该Bloc的范围外,用BlocProvider进行包裹,BlocProvider本身可以嵌套使用。使用方法如下:

BlocProvider<TestBloc>(
      create: (_) => TestBloc()..add(LoadTestData()),
      child: Container(),
    )

其中..add是对Bloc的一次初始化启动,所以先进行值的加载,括号内的事件即是想要做的事件

2.内部调用

在这个包裹的树内,可以使用如下代码调用对应Bloc的事件函数进行相应的操作:

BlocProvider.of<TestBloc>(context).add(ChangeTestData(_value));

综上,大致的使用就是这样。

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

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

相关文章

RPA实战演练UiBot6.0校园学生教评机器人

前言 校园学生教评机器人&#xff0c;也称为全自动校园教评RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;机器人&#xff0c;是一种利用软件机器人技术来模拟和执行学生教评流程中的各项任务和操作的智能化系统。以下是关于校园学生教评…

【Python绘画】画正方形简笔画

本文收录于 《一起学Python趣味编程》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、代码示例三、知识点梳理四、总结 一、前言 本文介绍如何使用Python的海龟画图工具turtle&#…

怎么做好企业短信服务呢?(文字短信XML接口示例)

企业短信服务已经成为各行各业都信赖的行业推广方式之一&#xff0c;并且短信行业也与时俱进的发展着&#xff0c;随之而来的就是市场上短信平台的数量也随之增多。那么怎么在鱼龙混杂的短信行业中选择适合自己的企业短信服务平台呢&#xff1f;企业短信服务平台又适用于哪些应…

④单细胞学习-cellchat细胞间通讯

目录 1&#xff0c;原理基础 流程 受体配体概念 方法比较 计算原理 2&#xff0c;数据 3&#xff0c;代码运行 1&#xff0c;原理基础 原文学习Inference and analysis of cell-cell communication using CellChat - PMC (nih.gov) GitHub - sqjin/CellChat: R toolk…

mysql高级刷题-01-求中位数

题目&#xff1a; 解题代码 select sum(num) / count(num) as median from (select num,row_number() over (order by num desc,id desc ) as desc_math,row_number() over (order by num ,id ) as asc_mathfrom number) as t1 where asc_math in (desc_math, desc…

期末考试后,老师如何发布期末成绩给学生家长查看

当期末的脚步悄然临近&#xff0c;作为班主任&#xff0c;深知期末成绩的发布不仅关系到学生和家长的期待&#xff0c;更是教学成果的重要体现。那么&#xff0c;有没有一种方法&#xff0c;既能保护学生隐私&#xff0c;又能方便家长和学生查询成绩呢&#xff1f; 答案是肯定有…

Python 全栈系列249 IO并发:异步、线程与协程

说明 很久没有关注这方面的问题了&#xff0c;平时大部分时候还是做批量操作 。在这种情况下(CPU密集),异步、协程这些意义就不大了&#xff0c;甚至可能进一步拖慢处理时间。 但是在IO这一块的零碎处理是比较重要的&#xff0c;可以更快&#xff0c;且更省资源。很早的时候&…

css动画案例练习之会展开的魔方和交错的小块

这里写目录标题 一级目录二级目录三级目录 下面开始案例的练习&#xff0c;建议第一个动手操作好了再进行下一个一、交错的小块效果展示1.大致思路1.基本结构2.实现动态移动 2.最终版代码 二、会展开的魔方1.大致思路1.基本结构;2.静态魔方的构建3.让静态的魔方动起来 2.最终版…

使用python绘制华夫饼图

使用python绘制华夫饼图 华夫饼图效果代码 华夫饼图 华夫饼图&#xff08;Waffle Chart&#xff09;是一种数据可视化图表&#xff0c;用于显示数据在一个网格中的分布情况。它类似于饼图&#xff0c;通过将数据划分为等大小的方块来表示不同类别的比例。华夫饼图的优势在于它…

图解Mysql索引原理

概述 是什么 索引像是一本书的目录列表&#xff0c;能根据目录快速的找到具体的书本内容&#xff0c;也就是加快了数据库的查询速度索引本质是一个数据结构索引是在存储引擎层&#xff0c;而不是服务器层实现的&#xff0c;所以&#xff0c;并没有统一的索引标准&#xff0c;…

bootstrap5-学习笔记2-模态框+弹窗+tooltip+popover+信息提示框

参考&#xff1a; Bootstrap5 教程 | 菜鸟教程 https://www.runoob.com/bootstrap5/bootstrap5-tutorial.html Bootstrap 入门 Bootstrap v5 中文文档 v5.3 | Bootstrap 中文网 https://v5.bootcss.com/docs/getting-started/introduction/ 之前用bootstrap2和3比较多&#x…

音频信号分析与实践

音频信号分析与实践课程,方便理解音频信号原理和过程 1.音频信号采集与播放 两种采样模式和标准的采样流程 人说话的声音一般在2kHz一下&#xff1a; 采样频率的影响&#xff1a;采样率要大于等于信号特征频率的2倍&#xff1b;一般保证信号完整&#xff0c;需要使用10倍以上的…

Git权限管理

Git权限管理 简介&#xff1a;大家好&#xff0c;我是程序员枫哥&#xff0c;&#x1f31f;一线互联网的IT民工、&#x1f4dd;资深面试官、&#x1f339;Java跳槽网创始人。拥有多年一线研发经验&#xff0c;曾就职过科大讯飞、美团网、平安等公司。在上海有自己小伙伴组建的副…

纯血鸿蒙APP开发实战:如何添加TabBar

1.tabbar组件 tabbar组件是移动端开发经常使用的一个组件&#xff0c;底部固定工具栏&#xff0c;顶部tab工具栏等。 2.示例 EntryComponentstruct MainPage {State private selectedIndex: number 0;private controller: TabsController new TabsController()build() {Col…

PHP序列化、反序列化

目录 一、PHP序列化&#xff1a;serialize() 1.对象序列化 2.pop链序列化 3.数组序列化 二、反序列化&#xff1a;unserialize() 三、魔术方法 ​四、NSSCTF相关简单题目 1.[SWPUCTF 2021 新生赛]ez_unserialize 2.[SWPUCTF 2021 新生赛]no_wakeup 学习参考&#xff1…

Python学习从0开始——Kaggle机器学习004总结2

Python学习从0开始——Kaggle机器学习004总结2 一、缺失值二、分类变量2.1介绍2.2实现1.获取训练数据中所有分类变量的列表。2.比较每种方法方法1(删除分类变量)方法2(序数编码)方法3独热编码 三、管道3.1介绍3.2实现步骤1:定义预处理步骤步骤2:定义模型步骤3:创建和评估管道 四…

数据仓库核心:维度表设计的艺术与实践

文章目录 1. 引言1.1基本概念1.2 维度表定义 2. 设计方法2.1 选择或新建维度2.2 确定维度主维表2.3 确定相关维表2.14 确定维度属性 3. 维度的层次结构3.1 举个例子3.2 什么是数据钻取&#xff1f;3.3 常见的维度层次结构 4. 高级维度策略4.1 维度整合维度整合&#xff1a;构建…

HCIP的学习(28)

第九章&#xff0c;链路聚合和VRRP 链路聚合 ​ 目的&#xff1a;备份链路以及提高链路带宽。 ​ 链路聚合技术&#xff08;Eth-Trunk&#xff09;&#xff1a;将多个物理接口捆绑成一个逻辑接口&#xff0c;将N条物理链路逻辑上聚合为一条逻辑链路。 正常情况下&#xff0c;…

Android开机动画的结束过程BootAnimation(基于Android10.0.0-r41)

文章目录 Android 开机动画的结束过程BootAnimation(基于Android10.0.0-r41) Android 开机动画的结束过程BootAnimation(基于Android10.0.0-r41) 路径frameworks/base/cmds/bootanimation/bootanimation_main.cpp init进程把我们的BootAnimation的二进制文件拉起来了&#xf…

STM32作业实现(五)温湿度传感器dht11

目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…