flutter之bloc使用详解

news2025/7/20 9:50:48

flutter中一切皆为Widget,因此在我们开发中,往往业务和UI逻辑写在一起,这样不利于代码维护,因此状态管理框架久诞生了,这篇就开始讲一讲Bloc。

对于Bloc库有两个,如下图:
在这里插入图片描述flutter_bloc其实是对bloc的进一步封装,flutter_bloc引入了bloc库和provider库,是对bloc的进一步延伸。

bloc官方文档:https://bloclibrary.dev/#/zh-cn/coreconcepts

一.Bloc介绍

BLoC设计模式:BLoC模式的核心是Sink和Stream,它们用于处理输入和输出。通常,你会创建一个BLoC类,该类接收输入流并根据输入产生输出流。然后,UI组件订阅输出流以接收状态更新,并将用户操作发送到输入流。

Bloc有两种模式:

Bloc模式:该模式划分四层结构
在这里插入图片描述

bloc:逻辑层
state:数据层
event:所有的交互事件
view:页面

Cubit模式:该模式划分了三层结构

在这里插入图片描述

cubit:逻辑层
state:数据层
view:页面

Bloc模式和Cubit模式区别:

  • 复杂度: BLoC:BLoC通常用于管理更复杂的业务逻辑和状态。它可以处理多个事件和多个状态,适用于大型、复杂的应用程序。
    Cubit:Cubit的设计更简单,适用于处理较简单的状态和事件。它更适合于小型和中型应用程序,以及对状态管理模式不太熟悉的开发者。

  • 事件和状态管理: BLoC:在BLoC中,事件和状态是分开管理的,你需要自己编写事件和状态的类,并在BLoC中进行映射。这使得BLoC更加灵活,但也更加复杂。
    Cubit:Cubit将事件和状态合并到一个类中,称为Cubit类。这使得代码更加简洁,但在处理复杂的事件和状态时可能会变得混乱。

  • 异步支持: BLoC:BLoC天生支持异步操作,可以轻松处理异步任务,例如网络请求。这是因为BLoC的mapEventToState方法可以返回Stream。
    Cubit:Cubit也支持异步操作,但需要使用Emit函数来发射新的状态。

二.flutter_bloc简单使用

导入库:

flutter_bloc: ^8.1.3

这是一个插件,可选择使用,简化模版代码生成。安装flutter_bloc插件
在这里插入图片描述

使用案例:计数器

import 'package:flutter_bloc/flutter_bloc.dart';

// 定义事件
enum CounterEvent { increment, decrement }

class CounterBloc extends Bloc<CounterEvent, int> {
  CounterBloc() : super(0);

  
  Stream<int> mapEventToState(CounterEvent event) async* {
    switch (event) {
      case CounterEvent.increment:
        yield state + 1;
        break;
      case CounterEvent.decrement:
        yield state - 1;
        break;
    }
  }
}

在页面中使用 Bloc:

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

class CounterPage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Counter App'),
      ),
      body: BlocProvider(
        create: (context) => CounterBloc(),
        child: CounterView(),
      ),
    );
  }
}

class CounterView extends StatelessWidget {
  
  Widget build(BuildContext context) {
    final counterBloc = BlocProvider.of<CounterBloc>(context);

    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          BlocBuilder<CounterBloc, int>(
            builder: (context, count) {
              return Text('Count: $count', style: TextStyle(fontSize: 24));
            },
          ),
          SizedBox(height: 16),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              FloatingActionButton(
                onPressed: () {
                  counterBloc.add(CounterEvent.increment);
                },
                child: Icon(Icons.add),
              ),
              SizedBox(width: 16),
              FloatingActionButton(
                onPressed: () {
                  counterBloc.add(CounterEvent.decrement);
                },
                child: Icon(Icons.remove),
              ),
            ],
          ),
        ],
      ),
    );
  }
}

三.各种小部件

BlocBuilder

BlocBuilder<BlocA, BlocAState>(
  builder: (context, state) {
    // return widget here based on BlocA's state
  }
)

BlocBuilder是一个 Flutter 小部件,需要一个bloc和 一个builder函数。BlocBuilder处理构建小部件以响应新状态。BlocBuilder与 非常相似,StreamBuilder但具有更简单的 API,以减少所需的样板代码量。该builder函数可能会被多次调用,并且应该是一个纯函数,它返回一个小部件以响应状态。

BlocSelector

BlocSelector<BlocA, BlocAState, SelectedState>(
  selector: (state) {
    // return selected state based on the provided state.
  },
  builder: (context, state) {
    // return widget here based on the selected state.
  },
)

BlocSelector是一个 Flutter 小部件,它类似于BlocBuilder但允许开发人员通过基于当前块状态选择新值来过滤更新。如果所选值不更改,则会阻止不必要的构建。所选值必须是不可变的,以便BlocSelector准确确定是否builder应该再次调用。

BlocListener

BlocListener<BlocA, BlocAState>(
  listener: (context, state) {
    // do stuff here based on BlocA's state
  },
  child: Container(),
)

BlocListener是一个 Flutter 小部件,它采用BlocWidgetListener和 一个可选参数bloc,并调用listener来响应块中的状态变化。它应该用于每次状态更改需要发生一次的功能,例如导航、显示 a SnackBar、显示 aDialog等…

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

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

相关文章

【webrtc】 对视频质量的码率控制的测试与探索

目录 环境设置 transport-cc goog-remb (webrtc中的两种码率算法&#xff09; 修改成remb算法 测试 效果 后续 可参考工程 环境设置 要到meshx上操作 telnet 112 然后执行factory_env show |grep meshx_ip 之后telnet meshx_ip 用户名admin 密码****.119 执行一下r…

IDEA连接数据库之后没有显示数据库里面的表

IDEA连接数据库之后没有显示数据库里面的表 第一步&#xff1a;点击下面红框处 第二步&#xff1a;点击Schemas那里 第三步&#xff1a;选择自己当前数据库的名称 最后回到database页面查看&#xff0c;相关数据可显示 如图&#xff1a;

提升客户体验,CRM客户管理系统有哪些优势?

人人都说CRM能够提升效率、跟踪销售流程、提升业绩、促进协作等等&#xff0c;但其中很重要的一项&#xff0c;便是改善并提升客户体验。在提升客户体验方面&#xff0c;CRM客户管理系统也有着独特的见解和优势。在了解CRM如何提升客户体验之前&#xff0c;我们要先说说什么是客…

回合制游戏特点,Q版回合制游戏开发

回合制游戏是一种视频游戏类型&#xff0c;其特点包括以下方面&#xff1a; 回合制战斗&#xff1a;回合制游戏的最显著特点是战斗和行动是基于回合制的&#xff0c;玩家和敌人交替进行动作。每个回合通常包括一系列动作&#xff0c;例如攻击、防御、使用道具等。这种机制允许…

Flutter 小技巧之不一样的思路实现炫酷 3D 翻页折叠动画

今天聊一个比较有意思的 Flutter 动画实现&#xff0c;如果需要实现一个如下图的 3D 折叠动画效果&#xff0c;你会选择通过什么方式&#xff1f; 相信可能很多人第一想法就是&#xff1a;在 Dart 里通过矩阵变换配合 Canvas 实现。 因为这个效果其实也算「常见」&#xff0c;…

el-table样式

1、实现效果&#xff0c;外部框是蓝绿色边框&#xff0c;深色背景&#xff0c;里面的表格首先设置透明色&#xff0c;然后应用自定义斑马纹。 2、代码 template代码&#xff0c;其中样式frameBordStyle是深色背景框&#xff0c;不负责表格样式&#xff0c;表格样式由tableStyl…

RCurl库做爬虫效率怎么样

RCurl库是一个非常强大的网络爬虫工具&#xff0c;它提供了许多功能&#xff0c;例如从服务器下载文件、保持连接、上传文件、采用二进制格式读取、句柄重定向、密码认证等等。使用RCurl库进行网络爬虫可以方便地获取网站上的数据&#xff0c;并进行数据分析和挖掘。在使用RCur…

2023-10-30 LeetCode每日一题(H 指数 II)

2023-10-30每日一题 一、题目编号 275. H 指数 II二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数&#xff0c;citations 已经按照 升序排列 。计算并返回该研究者的 h 指数…

LiveNVR监控流媒体Onvif/RTSP常见问题-概览负载信息具体表示什么实时展示取流中、播放中、录像中等使用数目说明

LiveNVR常见问题-概览负载信息具体表示什么实时展示取流中、播放中、录像中等使用数目说明 1、 Onvif/RTSP等直播流拉转服务2、负载信息2、负载信息说明 1、 Onvif/RTSP等直播流拉转服务 可接入传统监控行业里面的高清网络摄像机的RTSP直播流&#xff0c;及 RTMP、HTTP-FLV、M3…

全新彩虹知识付费商城源码-知识付费小程序V3.4/支持二级分类+多级分销(免授权)

源码简介&#xff1a; 全新彩虹知识付费商城源码&#xff0c;作为知识付费小程序V3.4&#xff0c;它支持二级分类&#xff0c;而且有多级分销&#xff0c;秒杀&#xff0c;砍价&#xff0c;团购的功能。它是免授权的。 彩虹知识付费商城初创体验版是一款功能丰富的电商平台&a…

uni-app项目 前端加前缀(包括页面及静态资源)

具体步骤 参考&#xff1a; https://www.jianshu.com/p/f1fe5daa3a3c manifest.json 文件## 位置如下&#xff1a; "h5" : {"title" : "物业公告","router" : {"mode" : "history", //采用history模式URL的路…

Go Metrics SDK Tag 校验性能优化实践

背景 Metrics SDK 是与字节内场时序数据库 ByteTSD 配套的用户指标打点 SDK&#xff0c;在字节内数十万服务中集成&#xff0c;应用广泛&#xff0c;因此 SDK 的性能优化是个重要和持续性的话题。本文主要以 Go Metrics SDK 为例&#xff0c;讲述对打点 API 的 hot-path 优化的…

VCR库编写爬虫程序

VCR库编写一个爬虫程序来爬取图片&#xff0c;代码如下所示&#xff1a; require vcr require open-uri ​ # 使用VCR库录制一次HTTP请求 VCR.use_cassette(vip_crawler) do# 设置主机和端口proxy_host proxy_port # 创建一个HTT理对象proxy URI.parse("http://#{prox…

免费好用的DNS在线工具,DNS记录、域名被墙、Whois轻松查询

在互联网的世界中&#xff0c;DNS是一种非常重要的存在&#xff0c;它们是域名与IP地址之间的桥梁&#xff0c;用于实现用户访问网站。我们在搭建网站时&#xff0c;经常会用到一些DNS工具&#xff0c;以便了解网站的DSN情况。DNS记录查询工具、域名被墙检测工具以及Whois域名信…

综合场景搭建|一张图展示多源空间数据,搭建丰富场景

「四维轻云」是一款轻量化的地理空间数据管理云平台&#xff0c;支持地理空间数据的在线管理、编辑以及分享。平台提供了项目管理、数据上传、场景搭建、发布分享、素材库等功能模块&#xff0c;支持团队多用户在线协作管理。 四维轻云平台是以项目的形式进行数据管理&#xf…

asp.net企业费用报销管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 企业费用报销管理信息系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使 用c#语言开发 asp.net企业费用报销系统…

构件基本概念

1.构件的概念 构件是一种组装单元&#xff0c;它可以可以是一个封装的对象&#xff0c;可以是软件包&#xff0c;也可以是一个子系统&#xff0c;甚至是一些文档。它具有规范的接口规约和显式的语境依赖&#xff0c;软件构件可以独立的部署并由第三方任意组装。中间件是构件的…

XUbuntu22.04之解决桌面突然放大,屏幕跟着鼠标移动问题(一百九十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

centos7安装mysql5.7

工具&#xff1a;VM16 centos7 1.1.Mysql安装 1.1.1 下载wget命令 root权限下进行&#xff1a; yum -y install wget 1.1.2 在线下载mysql安装包 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 1.1.3 安装MySQL rpm -ivh mysql57-community-r…

外观数列00

题目链接 外观数列 题目描述 注意点 1 < n < 30countAndSay(n) 是对 countAndSay(n-1) 的描述&#xff0c;然后转换成另一个数字字符串 解答思路 从第一个数1开始不断遍历推出下一个外观数列&#xff0c;下一个外观数列是由当前数列中连续数字的数量该数字组成&…