首页 > 其他分享 >Flutter状态管理之Bloc

Flutter状态管理之Bloc

时间:2023-06-22 23:32:04浏览次数:25  
标签:状态 Widget flutter bloc Bloc Flutter

Flutter Bloc的简介

Flutter Bloc 是一个用于状态管理的库,它帮助你在 Flutter 应用程序中实现单向数据流的架构模式。Bloc 是 Business Logic Component(业务逻辑组件)的缩写,它的设计目标是分离应用程序的业务逻辑和界面的表示层,使代码更易于测试、理解和维护。

核心概念和用法

下面是 Flutter Bloc 的一些核心概念和用法:

核心概念

Bloc

Bloc(业务逻辑组件):Bloc 是状态管理的核心组件。它负责管理应用程序的状态以及响应用户操作和其他事件的逻辑。Bloc 将输入事件转换为输出状态,并通过 Stream 将状态传递给界面层。Bloc 通常被封装为一个类,它包含一个输入事件流(Input Event Stream)和一个输出状态流(Output State Stream)。

Event

Event(事件):事件是触发状态变化的动作或操作。事件可以是用户交互、网络请求、定时器触发等。Bloc 接收事件并根据事件的类型和数据进行相应的状态更新。

State

State(状态):状态表示应用程序的当前状态。它可以是任何数据类型,如布尔值、整数、对象等。Bloc 将状态发送给界面层,以便更新用户界面的显示。

Stream

Stream(流):Stream 是 Dart 中的异步数据流,它用于在 Bloc 中传递事件和状态。Bloc 使用 Stream 来接收事件并发送状态更新给界面层。

BlocProvider

BlocProvider:BlocProvider 是一个 Widget,用于在 Flutter 应用程序中提供和管理 Bloc 的实例。它使用 Flutter 的 InheritedWidget 机制将 Bloc 实例传递给子 Widget,并确保在 Widget 树中的任何位置都可以访问到相应的 Bloc 实例。

使用

使用 Flutter Bloc 的一般步骤如下:

  1. 定义事件和状态:确定应用程序的事件和状态类型,并为它们创建相应的类。

  2. 创建 Bloc:创建一个继承自 Bloc 类的自定义 Bloc,定义其输入事件和输出状态的转换逻辑。

  3. 实现界面层:在界面层的 Widget 中使用 BlocProvider,将 Bloc 实例提供给子 Widget,并监听状态变化以更新界面显示。

  4. 处理事件:在界面层的 Widget 中通过 BlocProvider.of(context) 获取到 Bloc 实例,并调用相应的方法触发事件。

  5. 响应状态变化:在界面层的 Widget 中监听 Bloc 的状态流,根据状态的变化更新界面的显示。

Flutter Bloc 提供了几种不同的实现方式,包括官方的 flutter_bloc 库和第三方的 bloc 库。它们都遵循类似的设计思想和用法,但具体的实现细节可能有所不同。

通过使用 Flutter Bloc,你可以更好地组织和管理 Flutter 应用程序的状态和逻辑,提高代码的可测试性、可维护性和可扩展性。它是一个强大的工具,适用于各种规模的应用程序开发。

实例

首先,需要在 pubspec.yaml 文件中添加 flutter_bloc 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_bloc: ^8.1.3

然后,创建一个计数器 Bloc:

import 'package:flutter_bloc/flutter_bloc.dart';

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

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

  @override
  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 {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Counter App'),
      ),
      body: BlocProvider(
        create: (context) => CounterBloc(),
        child: CounterView(),
      ),
    );
  }
}

class CounterView extends StatelessWidget {
  @override
  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),
              ),
            ],
          ),
        ],
      ),
    );
  }
}

在上面的例子中,我们创建了一个 CounterBloc,它继承自 Bloc 类,并定义了 CounterEvent 枚举和 mapEventToState 方法来处理事件和状态转换。然后,我们在页面中使用 BlocProvider 来提供和管理 CounterBloc 的实例,并在 CounterView 中使用 BlocBuilder 来监听状态变化并更新 UI。

这个例子实现了一个简单的计数器应用,当点击加号按钮时,计数器增加;当点击减号按钮时,计数器减少。通过使用 Bloc 架构,我们可以将业务逻辑和 UI 分离,实现可维护和可测试的代码结构。

标签:状态,Widget,flutter,bloc,Bloc,Flutter
From: https://blog.51cto.com/u_15777557/6536211

相关文章

  • 【flutter 起步走】flutter共享数据利器,InheritedWidget原理探秘
    知其然,也要知其所以然。最近的搬砖工作中,开发ui页面都是使用flutter,android原生只沦为了后台逻辑处理的后盾。在搬砖过程中,往往只要知道怎么用,便能搭起小房子,而要建的恢弘又大气,还是少不了对于原理的学习。在接触flutter中,Widget是我们接触最多的类。我们对于各种界面的搭建用的就......
  • Flutter 学习 之 权限管理 permission_handler 9.2.0
    官方文档地址permission_handler控制台打印提示信息的时候可能会有两种(我遇到的)Noandroidspecificpermissionsneededfor:9可能表示你当前申请的权限你的系统不支持就是备注里nothing的Noandroidspecificpermissionsneededfor:[]9可能表示你没在AndroidM......
  • Flutter性能优化实践
    作者:王猛猛前言Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的,可以用一套代码同时构建Android和iOS应用,性能可以达到原生应用一......
  • ubuntu 启用apache运行状态信息查看
    ubuntu下安装apache后,默认apache的配置文件都在/etc/apache2/目录下。而其中允许查看apache运行状态的配置默认是在/etc/apache2/mods-available/status.conf文件中配置的。这个文件的默认配置类似如下:<IfModulemod_status.c>##Allowserverstatusreportsgenerate......
  • k8s node的几种状态
    Kubernetes(K8s)中的节点有几种可能的状态。以下是一些常见的节点状态:1.Ready(就绪):节点正常运行且准备好接受工作负载。这是节点的正常工作状态。2.NotReady(未就绪):节点无法接受工作负载,可能是由于网络问题、资源不足或其他故障导致的。3.OutOfDisk(磁盘空间不足):节点磁盘空间不足......
  • Flutter — 文本为什么可以被编辑?如何自定义编辑的行为?
    通过阅读本文,您将了解到知道在Flutter中关于文本的整体逻辑;可编辑文本包含哪些内容;如何自定义可编辑行为;如何优雅的实现文本表单。前言:在上一篇文章中,我们讲解了Flutter文本的组成部分和Flutter文本渲染到屏幕上的逻辑。文本的输出我们已经分析完成了,那么文本的输入又是怎么样的......
  • 分本剧中设置align block text
    publicclassMainextendsActivity{8:9:WebViewmWebView;10:11:@Override12:publicvoidonCreate(BundlesavedInstanceState){13:super.onCreate(savedInstanceState);14:setContentView(R.layout.......
  • shell 检测命令执行结果状态代码
    检测命令执行结果0、1、2、126、127、128、130、255是系统已经定义的状态码,其中只有0表示成功,其它值都表示失败自定义时应该避开这些状态码,虽然占用系统定义好的也没什么关系,但也尽量避免未知的冲突。状态码取值范围0~255如果值大于255,则会用值一直减去255,直到......
  • TMS320F28335光伏并网逆变器生产资料(另有离网状态 ),包含(原理图/PCB/
    TMS320F28335光伏并网逆变器生产资料(另有离网状态),包含(原理图/PCB/源代码,说明文挡),无实物。YID:3128609798582139......
  • 状态栏使用prograssBar
    privatestaticfinalintPROGRESS=0x1;privatestaticfinalintMAX_PROGRESS=100;privateintmProgressStatus=10;privateHandlermHandler=newHandler();@OverridepublicvoidonCreate(BundlesavedInstanceState){......