Flutter之BLOC
flutter_bloc 是一个bloc第三方库,这个库很方便的让你集成bloc模式,这个库结合了RXDart,先了解一下bloc 的模式吧

1,widget 触发event 事件
2,bloc 接收event 事件并作出逻辑处理
3 ,并把逻辑处理结果给返回出来
4,UI展示数据
其实它有点像mvvm ,Event只是出发事件,并不能传值,bloc 接收这个event,根据event去找到具体的方法去处理逻辑,之后把结果返回,如果再不明白,我举个例子,我去饭店吃饭去告诉老板点一个大盘鸡(这个是event),老板根据菜名找到具体的厨师(sink),厨师做好大盘鸡(这是逻辑处理)之后告诉老板做好(state)老板把菜端上来(UI跟数据改变)
flutter_bloc 提供几个api 根据这几个API 就可以快速搭建bloc
BlocBuilder
BlocProvider
BlocProviderTree
BlocListener
BlocListenerTree
BlocBuilder
有三个属性 bloc condition builder
BlocBuilder(
bloc: ,这个添加bloc dart
condition: (previousState, currentState){ return true;},//可选默认返回true
builder: (BuildContext context, List state) {}state 返回数据
)。
BlocProvider
这个可以管理全局变量
BlocProvider(
bloc:,这个添加bloc dart 把这个bloc 传递其它字界面使用
child:LogIn(),子类
)
子widget 通过BlocProvider.of<LogBloc>(context) 获取这个bloc
如果涉及到push 可以通过这种模式传递
Navigator.push(context, new MaterialPageRoute(
builder: (Context)=>BlocProvider(
bloc:LogBloc(),
child:HomePage1(),
)));
BlocProviderTree
可以管理多个状态
一个widget 涉及多个state 可以用它管理
BlocProviderTree(
blocProviders: [
BlocProvider<BlocA>(bloc: BlocA()),
BlocProvider<BlocB>(bloc: BlocB()),
BlocProvider<BlocC>(bloc: BlocC()),
],
child: ChildA(),
)
demo
import 'package:flutter/material.dart';
import 'package:flutter_app/bloc/counter_bloc_demo.dart'; class BlocDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CounterProvider(
bloc: CounterBloc(),
child: Scaffold(
appBar: AppBar(
title: Text('BlocDemo'),
elevation: 0.0,
),
body: CounterHome(),
floatingActionButton: CounterActionButton(),
),
);
}
}
import 'dart:async';
import 'package:flutter/material.dart';
class CounterHome extends StatelessWidget {
@override
Widget build(BuildContext context) {
CounterBloc _counterBloc = CounterProvider.of(context).bloc;
return Center(
child: StreamBuilder(
initialData: 0,
stream: _counterBloc.count,
builder: (context, snapshot) {
return ActionChip(
label: Text('${snapshot.data}'),
onPressed: () {
// _counterBloc.log();
_counterBloc.counter.add(1);
},
);
},
),
);
}
}
class CounterActionButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
CounterBloc _counterBloc = CounterProvider.of(context).bloc;
return FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
// _counterBloc.log();
_counterBloc.counter.add(1);
},
);
}
}
class CounterProvider extends InheritedWidget {
final Widget child;
final CounterBloc bloc;
CounterProvider({
this.child,
this.bloc,
}) : super(child: child);
static CounterProvider of(BuildContext context) =>
context.inheritFromWidgetOfExactType(CounterProvider);
@override
bool updateShouldNotify(CounterProvider oldWidget) {
return true;
}
}
class CounterBloc {
int _count = 0;
final _counterActionController = StreamController<int>();
StreamSink<int> get counter => _counterActionController.sink;
final _counterController = StreamController<int>();
Stream<int> get count => _counterController.stream;
CounterBloc() {
_counterActionController.stream.listen(onData);
}
void onData(int data) {
print('$data');
_count = data + _count;
_counterController.add(_count);
}
void disponse() {
_counterActionController.close();
_counterController.close();
}
void log() {
print('BLoC');
}
}

Flutter之BLOC的更多相关文章
- Flutter Bloc状态管理 简单上手
我们都知道,Flutter中Widget的状态控制了UI的更新,比如最常见的StatefulWidget,通过调用setState({})方法来刷新控件.那么其他类型的控件,比如StatelessWi ...
- Flutter 状态管理之BLoC
在正式介绍 BLoC之前, 为什么我们需要状态管理.如果你已经对此十分清楚,那么建议直接跳过这一节.如果我们的应用足够简单,Flutter 作为一个声明式框架,你或许只需要将 数据 映射成 视图 就可 ...
- flutter Provide 状态管理篇
Provide是Google官方推出的状态管理模式.官方地址为: https://github.com/google/flutter-provide 现在Flutter的状态管理方案很多,redux. ...
- bloc控制读写文件
import 'package:flutter/material.dart'; import 'dart:io'; import 'package:path_provider/path_provide ...
- (转)flutter 新状态管理方案 Provide (一)-使用
flutter 新状态管理方案 Provide (一)-使用 版权声明:本文为博主原创文章,基于CC4.0协议,首发于https://kikt.top ,同步发于csdn,转载必须注明出处! ...
- 基于 Flutter 以两种方式实现App主题切换
概述 App主题切换已经成为了一种流行的用户体验,丰富了应用整体UI视觉效果.例如,白天夜间模式切换.实现该功能的思想其实不难,就是将涉及主题的资源文件进行全局替换更新.说到这里,我想你肯定能联想到一 ...
- 【Flutter】348- 写给前端工程师的 Flutter 教程
点击上方"前端自习课"关注,学习起来~ | 导语 最爱折腾的就是前端工程师了,从 jQuery 折腾到 AngularJs,再折腾到 Vue.React.最爱跨屏的也是前端工程师, ...
- Flutter中高级培训
Flutter中高级培训 一.简介 Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面.Flutter可以与现有的代码一起工作.本课程全面介绍Flutter ...
- flutter,SliverPersistentHeader实现Tab顶部吸附固定效果
直接上代码啦 import 'package:flutter/material.dart'; class StickyDemo extends StatefulWidget { @override _ ...
随机推荐
- vim、gvim 在 windows 下中文乱码的终极解决方案
vim.gvim 在 windows 下中文乱码的终极解决方案 vim ~/.vimrc 然后加入: " Gvim中文菜单乱码解决方案 " 设置文件编码格式 set encodin ...
- Kotlin枚举与委托深入详解
枚举: 基本上跟Java的差不多,这里就过一遍既可,如下: 还可以接收参数,如下: 枚举还可以定义方法,如下: 看下错误提示: 所以可以这样: 然后咱们再冒号之前定义对象,如下: 下面来使用一下: 当 ...
- 分布式调度平台XXL-JOB源码分析-执行器端
上一篇文章已经说到调度中心端如何进行任务管理及调度,本文将分析执行器端是如何接收到任务调度请求,然后执行业务代码的. XxlJobExecutorApplication为我们执行器的启动项,其中有个X ...
- 解决jdbc向数据库存入数据出现乱码的情况
解决办法 1.修改项目的编码,建议统一使用utf-8来实现,这样整个项目就是utf-8. 2.jdbc:mysql://locathost:3306/数据库名称?useUnicode=true& ...
- 「NOI2012」迷失游乐园
「NOI2012」迷失游乐园 题目描述 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩. 进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该 ...
- ORA-12638: Credential retrieval failed 解决办法
ORA-12638 ORA-12638: Credential retrieval failed 身份证明检索失败 解决办法: 修改sqlnet.ora文件(位置:$ORACLE_HOME ...
- log4j+junit+maven
本文在开发第一个maven示例的基础上进行扩展. 日志级别测试 在src\main\resources文件夹下新建log4j.properties log4j.rootLogger = warn,st ...
- linux ps命令查看最消耗CPU、内存的进程
1.CPU占用最多的前10个进程: ps auxw|head -1;ps auxw|sort -rn -k3|head -10 2.内存消耗最多的前10个进程 ps auxw|head -1;ps a ...
- 表述数据的手段——json
一.JSON 语法规则 在 JS 语言中,一切都是对象.因此,任何支持的类型都可以通过 JSON 来表示,例如字符串.数字.对象.数组等.但是对象和数组是比较特殊且常用的两种类型: 对象表示为键值对 ...
- leetcode解题报告(27):Reverse Linked List
描述 Reverse a singly linked list. 分析 一开始写的时候总感觉没抓到要点,然后想起上数据结构课的教材上有这道题,翻开书一看完就回忆起来了,感觉解法挺巧妙的,不比讨论区的答 ...