Flutter状态管理之Bloc

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 分离,实现可维护和可测试的代码结构。

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。

img

相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题

你可能感兴趣的:(flutter,android)