前言:Flutter 的状态管理插件有很多,比如 ProviderGetX 还有本篇要讲述的 Bloc 。Bloc 目前最新的版本是 flutter_bloc: ^8.0.1

BLoC 依赖 Stream和 StreamController实现,组件通过Sinks发送更新状态的事件,然后再通过 Streams通知其他组件更新。事件处理和通知刷新的业务逻辑都是由 BLoC 完成,从而实现业务逻辑与 UI 层的分离,并且逻辑部分可以做到复用。

之前我们更新数据通常是通过 setState 的方式实现的,这种会刷新整个页面,而使用 Bloc 只会刷新想要更新的UI部分。下面会通过几个例子来说明下。

一、使用 Bloc 来实现计数器且把数据传递给跳转的页面

计算器要实现加减一的功能,所以先定义2个 Event,且都继承 CounterEvent ,如下:

// 定义 event 的基类
abstract class CounterEvent {}
// 加1的 event
class IncrementEvent extends CounterEvent {}
// 减1的event
class DecrementEvent extends CounterEvent {}

然后定义一个 CounterBloc 如下:

/// 表示通过 Bloc 发送的事件只能是 CounterEvent, 返回值是 int
class CounterBloc extends Bloc<CounterEvent, int> {CounterBloc(int initialState) : super(initialState) {/// 减1的事件就是把当前的 state - 1on<DecrementEvent>((event, emit) {/// 把对应的状态发送出去,在页面中就可以通过 BlocBuilder 来观察数据的改变emit(state - 1);});/// 加1的事件就是把当前的 state + 1on<IncrementEvent>((event, emit) {emit(state + 1);});}
}

页面具体的代码如下:

void main() {runApp(MyApp());
}
class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(/// 要使用 BlocProvider 来提供 Bloc home: BlocProvider<CounterBloc>(create: (BuildContext context) {return CounterBloc(0);},child: CounterPage(),),);}
}
class CounterPage extends StatelessWidget {@overrideWidget build(BuildContext context) {CounterBloc counterBloc = BlocProvider.of<CounterBloc>(context);print("---------------------- CounterPage build ----------------------- ${counterBloc.hashCode}");return Scaffold(appBar: AppBar(title: Text('test bloc '),),body: Container(width: double.infinity,child: Column(children: [/// 当增加或者减少计数时,只会局部更新 BlocBuilder ,不会整个刷新 buildBlocBuilder<CounterBloc, int>(builder: (BuildContext context, int count) {print("---------------------- BlocBuilder build -----------------------");return Text('当前计数: $count',style: TextStyle(fontSize: 24),);},buildWhen: (previous, next) {/// 这样写只有 increment 才有用,用来控制触发刷新的逻辑return previous < next;},),SizedBox(height: 12,),ElevatedButton(onPressed: () {counterBloc.add(IncrementEvent());},child: Text('increment',),),ElevatedButton(onPressed: () {counterBloc.add(DecrementEvent());},child: Text('decrement',),),ElevatedButton(onPressed: () {/// 需要 BlocProvider 的 context , 且 BlocProvider 的  create 中返回当前的 counterBloc/// 如果你在 create 中 重新 new 一个 CounterBloc ,那么在 page2 中增加计数,不会刷新本页面的计数Navigator.push(context, MaterialPageRoute(builder: (context) {return BlocProvider<CounterBloc>(create: (BuildContext context) {return counterBloc;},child: BlocPage2(),);}));},child: Text('jump page 2',),),],),),);}
}

其中的 buildWhen 是过滤触发条件的,代码中有注释了。BlocPage2 的代码如下:

class BlocPage2 extends StatelessWidget {@overrideWidget build(BuildContext context) {CounterBloc counterBloc = BlocProvider.of<CounterBloc>(context);print('xxxxxxxxxxxxxxx ${counterBloc.hashCode} ');return Scaffold(appBar: AppBar(title: Text('BlocPage2'),),body: Container(width: double.infinity,child: Column(children: [BlocBuilder<CounterBloc, int>(builder: (BuildContext context, int count) {return Text('page2 当前计数: $count',style: TextStyle(fontSize: 24),);}),ElevatedButton(onPressed: () {counterBloc.add(IncrementEvent());},child: Text('add')),],),),);}
}

BlocPage2 中改变了计数,返回到 CounterPage 页面时计数会同步更新。

结语:本篇这里就结束了,下篇会通过一个真正的例子来说明 Bloc 是怎么做到 UI 和业务逻辑分离的,会有真正的网络请求和页面的刷新。

Flutter 状态管理之Bloc上相关推荐

  1. FlyAI小课堂:Flutter 状态管理之BLoC

    在正式介绍 BLoC之前, 为什么我们需要状态管理.如果你已经对此十分清楚,那么建议直接跳过这一节. 如果我们的应用足够简单,Flutter 作为一个声明式框架,你或许只需要将 数据 映射成 视图 就 ...

  2. Flutter 状态管理之Bloc下

    这篇是使用 Bloc 来实现业务逻辑与UI分离.主要就是慕课网课程列表的网络请求并且展示. 首先定义一个基础事件的类,如下: abstract class LessonEvent {} 然后我定义了3 ...

  3. Flutter 状态管理指南之 Provider

    2019 Google I/O 大会,Flutter 团队在"Pragmatic State Management in Flutter "演讲上正式介绍了 Provider.自此 ...

  4. Flutter 状态管理

    目录 一.状态管理简介 1.1 为什么需要状态管理 1.1.1 Flutter与adr/ios UI框架区别 1.1.2 状态管理框架使用场景 1.2 需要解决的问题 二.状态管理框架现有方案调研 2 ...

  5. flutter 状态管理 flutter_bloc 的使用以及总结

    Bloc介绍 flutter_bloc 8.0,直接把mapEventToState方法去掉,需要手动注册事件处理器,不用再写if else 来判断event ,也不用写yield flutter_b ...

  6. Flutter状态管理1-ChangeNotifierProvider的使用

    关于Flutter中的状态管理,可以参考官网的介绍:Simple app state management 中文网的介绍:简单的应用状态管理 Flutter 官方的两个sample: provider ...

  7. Flutter:状态管理(5) --BLoC

    应用的开发架构:BLoC 其意思是业务逻辑组件,其实就是把业务需要的一些逻辑单独拿出来放在一个类里面.这种类就叫Bloc 可以使用这种架构创建反应式的应用. 这种架构是Google发出来的,其开源AP ...

  8. 【flutter-mobx】Flutter 状态管理- 使用 MobX实现计数器

    实践flutter mobx: 提示:对下面这篇掘金文章的实践,通过flutter结合 mobx 实现计数器,过程中也添加了一些处理和注释,代码放在feat/mobx下 https://juejin. ...

  9. Flutter 超简单状态管理

    Flutter 状态管理 目前Flutter已经有许多状态管理的方案,但就我个人而言,并不能完全满足我的要求.我希望状态管理更加简单,而不是成为负担,我希望状态管理更加可靠,而不是使用过于复杂的实现. ...

最新文章

  1. 【转】Jmeter常见问题
  2. 有哪些老鸟程序员知道而新手不知道的小技巧?自我感受
  3. 基于神经网络模型的文本语义通顺度计算研究-全文复现(还没弄完)
  4. freemarker跳出循环
  5. 用Java创建MongoDB上限集合
  6. Oracle12c部署,允许远程访问
  7. (转载)操作系统还有未来么?
  8. Tomcat startup.bat 后台运行,不再弹出 Dos 黑框
  9. 作为技术面试官,我在面试时考虑什么?
  10. 免费注册 上传html,一些可以免费上传文件的网站
  11. c++获取umg ue_UE4-UMG与c++交互
  12. C++ STL源码剖析 tr1与std array
  13. Redhat7.5升级openssh到8.2p1
  14. 好用一些的真无线蓝牙耳机,音质好的真无线蓝牙耳机
  15. IDEA搭建jsp项目
  16. DateTime常用方法,不积硅步无以至千里
  17. 21天精通python电子版_小白21天精通Python是如何做到的?
  18. 从三星 Note 7 电池事故引发的锂电池安全问题探讨 | 硬创公开课
  19. VS2019 C语言,在一个项目中添加多个包含main函数的源文件并分别调试运行
  20. 用python来玩科学计算

热门文章

  1. 汇编:汇编与C派系语言混用以及对应LLDB常用指令
  2. 微信小程序上传体验版并邀请其他人测试体验(小程序的发布上线)
  3. 韶音科技2021研究员面试经验
  4. 电脑一个磁盘分为两个磁盘
  5. MacBook Pro安装WIN10问题集锦
  6. firefox firbug 的“阻挡”
  7. Power BI(一)Power Query简介
  8. 搭建Aqours Online Judge的琐琐碎碎(一)Presentation Error判定
  9. 华硕z97不识别m2固态_华硕主板Z97-A无法识别intel M.2 NVME固态硬盘的解决方法
  10. P1650 田忌赛马