【Flutter】 Flutter 状态管理 BLoC 简明使用指南

news2024/9/21 0:25:04

文章目录

      • 一、前言
      • 二、Flutter BLoC 的安装和配置
      • 三、Flutter BLoC 的基本使用
      • 四、Flutter BLoC 的简单示例
      • 五、总结

一、前言

🎉想要精通 Flutter,掌握更多技巧和最佳实践?好消息来了!👉 Flutter专栏->Flutter Developer 101 入门小册 正在等你!📚

🔍这里有你需要的所有 Flutter 学习资源,包括代码示例和深度解析。🎯

⏰专栏内容持续更新,价格也会随之上涨。现在加入,享受最优惠的价格!💰

🚀现在,让我们开始今天的 Flutter 之旅吧!🌍

在 Flutter 的世界里,状态管理是一个永恒的话题。

有许多不同的状态管理方案,而 BLoC(Business Logic Component)设计模式是其中的佼佼者。

BLoC 是由 Google 开发者 Advocate Paolo Soares 和 Cong Hui 提出的,它的主要目标是将业务逻辑从 UI 中分离出来,使得代码更加清晰,易于测试和复用。

那么,为什么我们要选择 Flutter BLoC 呢?

首先,BLoC 是基于流(Stream)的,这意味着我们可以利用 Dart 的强大的异步特性。

其次,BLoC 是完全独立于 UI 的,这使得我们可以在不同的 UI 组件之间共享和复用状态。

最后,BLoC 是由 Google 官方推荐的,这意味着它有着良好的社区支持和丰富的学习资源。

二、Flutter BLoC 的安装和配置

要开始使用 Flutter BLoC,我们首先需要在项目中安装它。打开你的 pubspec.yaml 文件,添加以下依赖:

dependencies:
  flutter_bloc: ^8.1.3

然后,运行 flutter packages get 命令来获取包。

三、Flutter BLoC 的基本使用

在 Flutter BLoC 中,我们主要会使用到三个组件:BLoC、BlocProvider 和 BlocBuilder。

首先,我们需要创建一个 BLoC。BLoC 是一个简单的 Dart 类,它接收输入(事件)并产生输出(状态)。以下是一个简单的 BLoC 的例子:

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;
    }
  }
}

然后,我们需要使用 BlocProvider 来提供 BLoC。BlocProvider 是一个 Flutter widget,它将 BLoC 提供给它的子 widget。以下是如何使用 BlocProvider 的例子:

BlocProvider(
  create: (context) => CounterBloc(),
  child: CounterPage(),
)

最后,我们需要使用 BlocBuilder 来响应状态的变化。BlocBuilder 是一个 Flutter widget,它接收一个 BLoC 和一个 builder 函数,当 BLoC 的状态发生变化时,它会调用 builder 函数并重建 widget。以下是如何使用 BlocBuilder 的例子:

BlocBuilder<CounterBloc, int>(
  builder: (context, count) {
    return Text('$count');
  },
)

四、Flutter BLoC 的简单示例

让我们通过一个简单的计数器应用来看看如何在实践中使用 Flutter BLoC。

在这个应用中,我们将创建一个简单的计数器,它有两个按钮,一个用于增加计数,一个用于减少计数。

以下是完整的代码:

import 'package:flutter/material.dart';
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;
    }
  }
}

void main() {
  runApp(App());
}

class App extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BlocProvider(
        create: (context) => CounterBloc(),
        child: CounterPage(),
      ),
    );
  }
}

class CounterPage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Counter')),
      body: BlocBuilder<CounterBloc, int>(
        builder: (context, count) {
          return Center(
            child: Text(
              '$count',
              style: TextStyle(fontSize: 24.0),
            ),
          );
        },
      ),
      floatingActionButton: Column(
        crossAxisAlignment: CrossAxisAlignment.end,
        mainAxisAlignment: MainAxisAlignment.end,
        children: <Widget>[
          Padding(
            padding: EdgeInsets.symmetric(vertical: 5.0),
            child: FloatingActionButton(
              child: Icon(Icons.add),
              onPressed: () {
                BlocProvider.of<CounterBloc>(context).add(CounterEvent.increment);
              },
            ),
          ),
          Padding(
            padding: EdgeInsets.symmetric(vertical: 5.0),
            child: FloatingActionButton(
              child: Icon(Icons.remove),
              onPressed: () {
                BlocProvider.of<CounterBloc>(context).add(CounterEvent.decrement);
              },
            ),
          ),
        ],
      ),
    );
  }
}

在这个例子中,我们首先定义了一个 CounterEvent 枚举,它有两个值:incrementdecrement。然后,我们创建了一个 CounterBloc,它接收 CounterEvent 作为输入,并输出一个整数作为状态。在 mapEventToState 方法中,我们根据接收到的事件来更新状态。

CounterPage 中,我们使用 BlocBuilder 来构建 UI。当 CounterBloc 的状态发生变化时,BlocBuilder 会调用它的 builder 函数并重建 UI。在 floatingActionButton 中,我们添加了两个按钮,一个用于发送 increment 事件,一个用于发送 decrement 事件。

五、总结

通过这篇文章,我们对 Flutter BLoC 有了一个初步的了解。我们学习了如何安装和配置 Flutter BLoC,如何创建和使用 BLoC,以及如何通过一个简单的计数器应用来实践 Flutter BLoC。

Flutter BLoC 是一个强大的状态管理库,它可以帮助我们更好地组织和管理状态,使我们的代码更加清晰和可维护。然而,Flutter BLoC 也有它的

复杂性,特别是对于初学者来说,理解和使用 BLoC 可能会有一些困难。但是,一旦你理解了 BLoC 的核心概念,你就会发现它是一个非常强大和灵活的工具。

在接下来的文章中,我们将深入探讨 Flutter BLoC 的更多特性和用法,包括如何处理异步事件,如何测试 BLoC,以及如何使用 BLoC 来构建更复杂的应用。希望你会继续关注我们的系列文章,一起学习和探索 Flutter BLoC。

🚀对 Flutter 好奇?想深入探索?👉 Flutter专栏->Flutter Developer 101 入门小册 是你的最佳伙伴!📚

👀你将在这里找到全面的 Flutter 学习资源,包括代码示例和深度解析。🔍

💡想知道如何用 Flutter 构建应用?答案就在我们的专栏!🎯

⏰别等了,专栏内容持续更新,价格也会随之上涨。现在加入,享受最优惠的价格!💰

🌍一起在 Flutter 的世界中探索吧!想了解更多?点击这里:Flutter Developer 101 入门小册 专栏指引 🚩

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

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

相关文章

波动率预言机:开启新的DeFi风险管理策略和衍生市场

Chainlink 喂价一直是 DeFi 生态系统的基础构建块&#xff0c;为越来越多的加密货币、大宗商品和法定货币提供准确、防篡改和聚合的价格参考数据。高质量的价格数据的可用性在 DeFi 的增长过程中起到了重要作用&#xff0c;使其总锁定资产价值在高峰期达到了 1700 亿美元&#…

基于云计算技术B/S架构的医院信息管理系统源码(HIS)

云HIS系统源码&#xff0c;采用云端SaaS服务的方式提供 基于云计算技术的B/S架构的云HIS系统&#xff0c;采用云端SaaS服务的方式提供&#xff0c;使用用户通过浏览器即能访问&#xff0c;无需关注系统的部署、维护、升级等问题&#xff0c;系统充分考虑了模板化、配置化、智能…

MySQL基础之概述

MySQL 启动、终止 //以管理员身份运行cmd net start mysql80 net stop mysql80客户端连接 客户端cmd “开始”找到MySQL 环境变量普通cmd mysql [-h 127.0.0.1] [-P 3306] -u root -p mysql -u root -p[ ] 内的参数可省略&#xff0c;若连接本地MySQL&#xff0c;则无需指定…

机器学习笔记 - 结合深度学习的基于内容的图像实例检索 利用现成的DCNN模型进行检索

一、简述 上一篇,基于内容的图像实例检索综述。 https://mp.csdn.net/mp_blog/creation/editor/131415155https://mp.csdn.net/mp_blog/creation/editor/131415155 一种方案是,为分类任务而进行大规模训练的DCNN直接充当图像检索任务的现成特征检测器,也就是说,可以…

Live800:为什么越来越多的企业选择在线客服系统?

现今&#xff0c;越来越多的企业开始使用在线客服系统&#xff0c;这是因为互联网时代已经席卷全球&#xff0c;企业需要尽可能地利用新技术&#xff0c;优化客户体验和服务。一个强大的在线客服系统可以帮助企业实现客服信息的统一管理&#xff0c;这样可以为企业带来巨大的好…

Vue Router 相关理解 基本路由 多级路由

6.1.相关理解 6.1.1.vue-router 的理解 vue的一个插件库&#xff0c;专门用来实现SPA应用 6.1.2.对SPA应用的理解 单页Web应用&#xff08;single page web application&#xff0c;SPA&#xff09;整个应用只有一个完整的页面点击页面中的导航链接不会刷新页面&#xff0c…

Find My资讯|苹果Find My技术应用于车内丢失设备

美国专利商标局正式授予苹果两项泰坦项目新专利&#xff0c;分别是扩展其针对车内丢失设备的“Find My”设备服务&#xff0c;以及用于自动驾驶汽车的高级传感器系统&#xff0c;其中传感器系统还涵盖了带有摄像头系统的车辆&#xff0c;而摄像头系统除可3D重建场景之外&#x…

通过网络流量监测分析解决堡垒主机部署后未经授权访问的3389端口问题

1. 前言 堡垒主机是网络安全的重要组成部分&#xff0c;但在部署后仍可能存在一些主机可以绕过堡垒主机直接访问之前的3389端口。本文将介绍如何利用网络流量监测分析方法解决这个问题&#xff0c;提供一种有效的解决方案&#xff0c;加强对网络的访问控制和安全监测。 2. 网…

[NOI2016] 网格

题目描述 跳蚤国王和蛐蛐国王在玩一个游戏。 他们在一个 &#xfffd;n 行 &#xfffd;m 列的网格上排兵布阵。其中的 &#xfffd;c 个格子中 (0≤&#xfffd;≤&#xfffd;⋅&#xfffd;)(0≤c≤n⋅m)&#xff0c;每个格子有一只蛐蛐&#xff0c;其余的格子中&#xff…

小红书美妆品牌投放流程有哪些,品牌规划

越来越多的品牌开始重视新媒体&#xff0c;很多品牌和商家纷纷将目光瞄准了小红书&#xff0c;但是由于各平台都有自己的规则&#xff0c;盲目踏入不熟悉的领域肯定是有点冒险的。那么小红书美妆品牌投放流程有哪些&#xff0c;以及品牌规划。 小红书品牌投放指南是指小红书平台…

享元模式(Flyweight)

别名 缓存&#xff08;Cache&#xff09;。 定义 享元是一种结构型设计模式&#xff0c;它摒弃了在每个对象中保存所有数据的方式 &#xff0c;通过共享多个对象所共有的相同状态&#xff0c;让你能在有限的内存容量中载入更多对象。 前言 1. 问题 假如你希望在长时间工作…

互联网+洗鞋店软件多门店多网点预约下单小程序

互联网洗鞋店软件小程序功能介绍: 1.用户端&#xff08;上门取件、送货到店、寄存网点&#xff09; 2.取货员端&#xff08;取件员拍照&#xff0c;清洗过程&#xff0c;包装拍照&#xff09; 3.多门店管理&#xff08;用户进入小程序&#xff0c;根据定位自动匹配就近门店&…

Golang每日一练(leetDay0106) 超级丑数、右侧小于当前元素的个数

目录 313. 超级丑数 Super Ugly Number &#x1f31f;&#x1f31f; 315. 计算右侧小于当前元素的个数 Count-of-smaller-numbers-after-self &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练…

easypoi 导出word并插入echart图片和文件

一 pom 文件引入&#xff1a;<!-- 目前的版本对应 poi 4.1.2 和 xmlbeans 3.1.0 , poi 3.17 和 xmlbeans 2.6.0 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version&…

新人必看的Java基础知识点大梳理

一个Java程序可以认为是一系列对象的集合&#xff0c;而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。 对象&#xff1a;对象是类的一个实例&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对象&#xff0c;它的状态有&…

树莓派Pico|SHELL中microPython命令行|pico sdk开发环境搭建|点灯代码|必备开发工具|gcc涉及的include文件目录

文章目录 SHELL中microPython命令行SHELL中基于microPython的控制代码Hello Pico 代码SHELL中简单点灯代码SHELL中循环亮灯代码 基于pico sdk开发环境搭建及点灯代码必备开发工具Mingw-w64&#xff1a;著名C/C编译器GCCarm-none-eabi&#xff1a;交叉编译工具Git&#xff1a;开…

js翻转数组

arr [red, green, "blue", "pink", "purple"];var arr1 [];for (var i 1; i < arr.length; i) {console.log(arr1.length)arr1[arr1.length] arr[arr.length - i];console.log(arr1.length)}console.log(arr1);

echarts饼装图自定义图例和扇形区的文字

最近因为工作需要&#xff0c;需要开发一个大屏&#xff0c;后台给的数据是这个的&#xff0c;echarts是默认将数据data例的name属性作为图例和扇形图上展示文本&#xff0c;这里我需要自定义图例信息和内容&#xff0c;通过这篇文章&#xff0c;记录下如何修改这些内容&#x…

spring IOC详解

一、IOC IoC就是Inversion of Control&#xff0c;控制反转。在Java开发中&#xff0c;IoC意味着将你设计好的类交给系统去控制&#xff0c;而不是在你的类内部控制。这称为控制反转。 下面我们以几个例子来说明什么是IoC。假设我们要设计一个Girl和一个Boy类&#xff0c;其中G…

【PostgreSQL-16新特性之普通用户的保留连接个数(reserved_connections)】

PostgreSQL数据库为了保证在高并发&#xff0c;高连接数情况下某些用户能够正常连接到数据库里&#xff0c;设立了几个用户连接的保留个数。 本文介绍了PostgreSQL16版本前为超级用户保留的连接数&#xff08;superuser_reserved_connections&#xff09;以及PostgreSQL16版本…