首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用BLoC模式,如何处理不会导致状态更改的事件(例如,log),最好?

BLoC(Business Logic Component)模式是一种架构设计模式,主要用于将业务逻辑与UI组件分离,使得代码更加模块化和可维护。在BLoC模式中,事件处理是一个核心部分,通常涉及到状态的更改。然而,有些事件可能不会导致状态更改,例如日志记录(log)。以下是如何处理这类事件的最佳实践:

基础概念

BLoC模式的核心思想是将业务逻辑从UI组件中分离出来,通过事件和状态管理来实现组件之间的通信。事件可以是用户操作、数据变化或其他系统通知。

相关优势

  1. 解耦:BLoC模式将业务逻辑与UI组件分离,使得代码更加模块化和易于维护。
  2. 可测试性:由于业务逻辑与UI组件分离,可以更容易地对业务逻辑进行单元测试。
  3. 可重用性:业务逻辑组件可以在不同的UI组件中重用。

类型

BLoC模式中的事件可以分为两类:

  1. 状态更改事件:这些事件会导致状态的变化,需要更新UI。
  2. 非状态更改事件:这些事件不会导致状态的变化,例如日志记录。

应用场景

在处理日志记录等不会导致状态更改的事件时,BLoC模式可以通过以下方式来处理:

处理不会导致状态更改的事件

对于不会导致状态更改的事件,如日志记录,可以采用以下几种方法:

1. 使用单独的日志BLoC

创建一个专门用于处理日志记录的BLoC,这样可以将日志记录逻辑与其他业务逻辑分离。

代码语言:txt
复制
// 日志BLoC
class LogBloc {
  final _logController = StreamController<String>();

  Stream<String> get logStream => _logController.stream;

  void log(String message) {
    _logController.add(message);
  }

  void dispose() {
    _logController.close();
  }
}

在UI组件中,可以订阅这个日志流并处理日志记录。

代码语言:txt
复制
class MyWidget extends StatelessWidget {
  final LogBloc logBloc;

  MyWidget({required this.logBloc});

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<String>(
      stream: logBloc.logStream,
      builder: (context, AsyncSnapshot<String> snapshot) {
        if (snapshot.hasData) {
          // 处理日志记录
          print(snapshot.data!);
        }
        return Container();
      },
    );
  }
}

2. 使用事件总线

事件总线是一种发布-订阅模式,可以用于处理不会导致状态更改的事件。通过事件总线,可以将日志记录事件发布到一个全局的事件流中,然后在需要的地方订阅这些事件。

代码语言:txt
复制
// 事件总线
class EventBus {
  final _controller = StreamController<dynamic>.broadcast();

  Stream<T> on<T>() {
    return _controller.stream.where((event) => event is T).cast<T>();
  }

  void fire<T>(T event) {
    _controller.add(event);
  }

  void dispose() {
    _controller.close();
  }
}

// 日志事件
class LogEvent {
  final String message;

  LogEvent(this.message);
}

// 在UI组件中订阅日志事件
class MyWidget extends StatelessWidget {
  final EventBus eventBus;

  MyWidget({required this.eventBus});

  @override
  Widget build(BuildContext context) {
    eventBus.on<LogEvent>().listen((event) {
      print(event.message);
    });

    return Container();
  }
}

遇到的问题及解决方法

如果在处理不会导致状态更改的事件时遇到问题,可以考虑以下几点:

  1. 事件分类:确保事件被正确分类为状态更改事件和非状态更改事件。
  2. 日志记录:使用单独的日志BLoC或事件总线来处理日志记录,避免在主BLoC中混杂不必要的逻辑。
  3. 性能优化:确保日志记录不会影响应用的性能,特别是在高频事件的情况下。

通过以上方法,可以有效地处理不会导致状态更改的事件,同时保持BLoC模式的清晰和解耦特性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Flutter BLoC 教程:使用 BLoC 模式状态管理

✅ 简单应用不推荐使用 ✅ 有更多标准化代码,但可以通过扩展解决 Flutter BLoC 教程目标 我们将构建相关简单应用,来演示 BLoC 如何使用流来管理状态,并为 bloc 编写一些测试。...✅ Events:事件就是应用程序输入(比如点击鼠标加载文件,文本输入,或者应用程序希望接受到其他用户输入值) ✅ States:状态就是应用程序状态,会根据事件收到响应而更改 BLoC 管理着事件...因为一个应用程序中会有很多事件,我们创建一个抽象类并继承它,并在需要处理和传递多个事件BLoC 时进行扩展。...用于输出一个新状态,这会导致 build() 函数重新构建 将这些碎片拼接起来。 到目前为止,events,states,bloc 和我们应用程序 UI 并没有联系起来。...总结 希望该教程对你开始学习使用 BLoC 模式管理状态有所帮助。

85610

Flutter响应式编程:Streams和BLoC

响应式编程是使用异步数据流进行编程。换句话说,从事件例如,点击),变量变化,消息,......到构建请求,可能改变或发生所有事物所有内容将被传送,由数据流触发。...感谢业务逻辑与UI分离:我们可以随时更改业务逻辑,对应用程序影响最小, 我们可能会更改UI而不会对业务逻辑产生任何影响, 现在,测试业务逻辑变得更加容易。...如何将此BLoC模式应用于Counter应用? 将BLoC模式应用于Counter 应用可能看起来有点矫枉过正,但请允许我先向你展示...... 我已经听到你说“哇......为什么这一切?...当然,这是非常可取。建议如下: (如果有任何业务逻辑)每个页面的顶部有一个BLoC, 为什么不是ApplicationBloc来处理应用程序状态? 每个“足够复杂组件”都有相应BLoC。...不同BLoCs / Streams编排 下图显示了如何使用主要3个BLoC: 在BLoC左侧,哪些组件调用Sink 在右侧,哪些组件监听流 例如,当MovieDetailsWidget调用inAddFavorite

4.2K90
  • flutter_bloc使用解析---骚年,你还在手搭bloc吗!

    层改动是巨大 可以发现,主要改变就是对事件处理;改动后写法对比以前写法,优雅了N倍 所有事件入口全部归纳在一起 可以轻松从归纳事件入口,跳转到相应业务逻辑 对事件处理,不用写一堆判断了!...模式里面,如果页面不是过于复杂,使用Cubit去写,基本完全够用了;但是如果业务过于复杂,还是需要用Bloc去写,需要将所有的事件行为管理起来,便于后期维护 OK,Bloc简化模块,Cubit模式就这样讲完了...,就能使用全局XxxBloc了,这里全局XxxBloc,state状态都会被保存,除非关闭app,否则state里面的数据都不会被还原!...该builder函数可能会被多次调用,并且应该是一个纯函数,它会根据状态返回小部件。 看看BlocListener是否要响应状态更改“执行”任何操作,例如导航,显示对话框等。...它应用于需要在每次状态更改时发生一次功能,例如导航,显示a SnackBar,显示aDialog等。 listener`与in和函数不同,每次状态更改(**不**包括初始状态)仅被调用一次。

    5.4K41

    Flutter 移动端架构实践:Widget-Async-Bloc-Service

    团队向我们展示了如何使用Provider包和ChangeNotifier,用于在组件之间传递状态更改。...在BLoC模式下,控件能够: 将事件分发给接收器; 通过流通知状态更新。 根据最初定义,我们只能通过 接收器 和 流 与BLoC进行通信。 虽然我喜欢这个定义,但我发现它在许多场景下限制性太强。...WABS使用简单异步方法来处理UI事件,而RxVMS使用是 RxCommand。...RxCommand是抽象处理UI事件和更新UI库,它删除了使用BLoC创建StreamController/Stream对所需样板代码。...当更新app本地状态例如,将状态从一个控件传递到另一个控件中)时,BLoC有更简单替代方案,这个后文再提。

    16.1K20

    Flutter 对状态管理认知与思考

    这是一种十分简洁层级划分,众多流行Flutter状态管理框架,也是如此划分例如:provider,getx view:界面层 Logic:逻辑层 + 状态层 [极简模式] 标准模式 ?...这已经是一种类似MVC层级划分了,这种层级也十分常见,例如:cubit(provider和getx也能轻松划分出这种结构) view:界面 Logic:逻辑层 State:状态层 [标椎模式] 严格模式...常见状态管理框架:Bloc,Redux,fish_redux view:界面层 Logic:逻辑层 State:状态层 Action:行为层 [严格模式] 强迫症模式 ?...我时常认为:优秀思想见证变迁,它并不会在时光中衰败,而是变越来越璀璨 例如:设计模式 解耦成本 分离逻辑+状态层 一个成熟状态管理框架,必定将逻辑从界面层里面划分处理,这是应该一个状态管理框架最朴实初衷...,BlocBloc模式和Cubit模式,redux系列。。。

    1.1K41

    掌握Flutter底部导航栏:畅游导航之旅

    底部导航栏与状态管理 底部导航栏通常需要与应用程序状态进行交互,例如根据用户操作更新当前选中导航项。Flutter提供了多种状态管理方法,其中包括使用Provider和Bloc进行状态管理。...6.2 使用Bloc进行状态管理 Bloc是另一个常用Flutter状态管理库,它基于流(Stream)和事件(Event)模式来管理应用程序状态,并提供了一种清晰、可维护方式来组织和处理复杂业务逻辑...通过创建一个NavigationBloc来处理底部导航栏状态,并在需要时向Bloc发送事件来更新状态,可以实现底部导航栏状态管理。...,它继承自Bloc并定义了一个mapEventToState方法来处理事件。...此外,我们还探讨了如何利用状态管理库(如Provider和Bloc)来管理底部导航栏状态,以及如何实现一些高级功能,如添加徽章、动态更改导航栏项以及实现动画效果等。

    36610

    【Flutter 状态管理】第一论: 对状态管理看法与理解

    但从根本上来说,这些变化是种子与外界资源交换,导致内部数据变化,而产生结果。也就是一个是 面子 ,一个是 里子 。 看花人并不会在意种子内部变化逻辑,他们只需满足看花需求就行了。...通过这种方式,编程者可以将 状态变化逻辑 集中在 Bloc处理。当事件触发时,通过发送 Event 指令,让 Bloc 驱动 State 进行变化。...flutter_bloc 只是 状态管理 工具之一,而其他工具,也不会脱离这个核心。 四、官方案例 - github_search 解读 1....有人可能会问,业务逻辑都放在 Bloc处理不就行了吗,为什么非要搞个 repository 层。其实很任意理解,Bloc 核心是处理状态变化,如果接口请求代码都放在 Bloc 里就显得非常臃肿。...3. bloc 层 首先来看事件,整个搜索功能只有一个事件:文字输入时TextChanged,事件触发时需要附带搜索信息字符串。

    1.5K20

    Flutter BLoC 异步通信、BlocBuilder基本使用、BlocProvider初探

    【x1】微信公众号每日提醒 随时随记 每日积累 随心而过 【x2】各种系列视频教程 免费开源 关注 你不会迷路 【x3】系列文章 百万 Demo 随时 复制粘贴 使用 *** 在 Flutter...BLoC模式可以将Widget构建UI代码与业务处理代码分离出来,在BLoC模式应用程序,一般会有全局BLoC,每一个页面也会对应有一个独立BLoC。...[在这里插入图片描述] 使用BloC模式,Flutter项目应用里所有组件都在一个事件流,其中一部分组件可以订阅事件,另一部分组件则消费事件 [在这里插入图片描述] *** 2 BloC 基本使用...BloC是一种架构模式也是一种编程思想,在Flutter中使用BloC时,首先要引入bloc库 dependencies: flutter_bloc: ^6.0.6 然后将依赖库拉取到本地 flutter...在这里使用Bloc模式开发一个时间计时器 运行效果如下图所示: [在这里插入图片描述] 首先来看程序入口,在这里使用到了 BlocProvider ,BlocProvider相当于一个组合者,它将 Bloc

    3.3K11

    初学者 Flutter bloc

    flutter Bloc 是 Flutter 应用其中一个状态管理。我们可以通过它很容易处理应用中所有可能状态。...当我们使用 Flutter Bloc,我们要在应用中创建事件触发交互,然后 Bloc 会发射 emit 请求数据,存在在 state 中,在真实场景中,它会像这样: 用户点击按钮来获取游戏列表 事件被触发...Bloc Widgets 这个库提供了我们需要掌握所有可能类型挂件,比如,添加一个事件,监听一个状态,发射一个状态,根据状态重新构建页面等等。...这个挂件不会重新构建视图,它只会监听。 BlocBuilder 通过这个挂件,我们能够根据它们状态重新构建我们挂件。...我们使用一个 BlocSelector 来控制这情形,当用户点击其中一个分类,事件将会被触发并且 bloc 将发射一个选中分类 id 状态 isSelected,所以在 bloc selector 中

    15810

    flutter中使用BloC模式

    如何BloC模式 上图是描述是,组件一些基本行为,【展示数据】,【发送事件】。...= null), super(key: key, stream: stream); 发送事件丢给BloC处理,具体到了sink上。...因为第一组stream用户产生ui用数据,第二组stream用户接受处理UI事件。 总结及个人建议 使用Bloc模式开发app好处显而易见,大约有: 1、严重遵守了单一职责原则,代码解耦更好。...1、个人觉得,非常简单页面,使用BloC就有点过了,实际上像上面那个例子,点击次数计数,用StateFulWidget明显就是更优选择,使用BloC就有点为了模式模式了。...2、用于不用BloC,要基于业务场景来考虑,个人觉得,对于多个UI共享一份数据例子,就非常使用BloC模式,比如订单相关页,购物车等等,因为订单状态扭转,购物车物品同步,用户发送事件相当多,这种如果使用

    17.5K82

    【Flutter 专题】86 初识状态管理 Bloc (一)

    使用 Bloc 之前需要提前了解一下如下几个概念; Event Event 事件作为 Bloc 输入,一般是为了响应用户交互(例如按钮按下)或生命周期事件例如页面加载)而添加它们。...可以使用枚举类型定义事件类,对于相对复杂事件可以联合业务定义为 class; enum TestEvent { onEvent1, onEvent2 ... onEventN} States States...,过渡由当前状态事件和下一个状态组成;例如和尚上述定义 TestEvent 中各个 onEvent 中状态变更等均可以视为 Transitions 转场;onTransition 在 Bloc ...i < max; i++) { yield i; } } Blocs Bloc 作为将 Stream 输入 Event 事件转换为输出 States 状态;每个自定义 Bloc...初始化状态,该状态是接收任何事件之前状态; mapEventToState 将 Event 作为参数,返回是 Stream state 状态,通过 state 属性随时访问当前状态

    83151

    【源码篇】Flutter Bloc背后思想,一篇纠结文章

    用过Bloc靓仔们,肯定能感受到,Bloc框架对开发页面,做了很清晰划分,框架强行定了俩种开发模式 Bloc模式:该模式划分四层结构 bloc:逻辑层 state:数据层 event:所有的交互事件...,应该不会有这么深执念[img] 这个state层加,我觉得相当有必要,因为某个页面一旦维护状态很多,将状态变量和逻辑方法混在一起,后期维护会非常头痛。...XxxBloc不会自动释放 BlocProvider实现了上面这三个碉堡功能,基本就可以把Stream使用模式彻底精简了 图示 [BlocProvider] 基石BlocBase 毋庸置疑,BlocBase...使用 使用基本和Bloc一摸一样 我本来想把emit俩个新旧state对象对比判断去掉,但是想想Bloc作者对这个理念好像有很深执念,在很多地方都做了处理;所以,这边我也就保留了,也可以保留Bloc...Stream使用,做了一个大大精简,基本使用痛点,全都封装起来,内部处理了 最后 留言板 Provider和Bloc源码解析终于写完了,就差最后一篇GetX了。。。

    2.4K41

    Flutter 状态管理方案:setState、BLoC、ValueNotifier、Provider

    image.png 例如,我们使用简单身份验证流程。当登录请求发起时,设置正在加载中状态。...此示例 app 展示了如何使用各种状态管理方案处理加载状态。 主要导航 登录页面的主要导航是通过一个小部件实现,该小部件使用 Drawer 菜单在不同选项中进行选择。...作为 BloC 替代方案,我们可以使用 BehaviorSubject 来跟踪加载状态,并根据需要进行更新。 我会通过 GitHub 项目 来展示具体如何实现。...最后比较 上述三种实现(setState、BLoC、ValueNotifier)非常相似,只是处理加载状态方式不同。...如下是他们比较方式: setState ↔︎ 最精简代码 BLoC ↔︎ 最多代码 ValueNotifier ↔︎ 中等水平 所以 setState 方案最适合这个例子,因为我们需要处理单个小部件各自状态

    4.6K00

    Flutter以两种方式实现App主题切换代码

    说到这里,我想你肯定能联想到一种设计模式:观察者模式。多种观察对象(主题资源)来观察当前主题更新行为(被观察对象),进行主题更新。今天和大家分享在Flutter 平台上如何实现主题更换。...Flutter 借鉴了 React 状态控制,同样产生了一些状态管理框架,例如 flutter_redux、scoped_model、bloc。...区别 从 print log 中,可以发现,当使用 eventbus 事件总线进行切换主题刷新时,_AppState 下 build方法 和 home指向组件界面 整体都会重新构建。...而使用scoped_model等状态管理工具,_AppState 下 build方法不会重新执行,只会刷新使用到了Model组件,但是home对应组件依然会重新执行build方法进行构建。...所以我们可以得出以下结论: 两者方式都会导致 home 组件被重复 build。明显区别在于使用状态管理工具方式可以避免父组件 build 重构。

    3.3K30

    flutter架构:Repository设计模式

    本文中我们将详细讲解「Repository设计模式,「包含以下部分」:」 「Repository设计模式」是什么以及何时使用使用「具体」和「抽象」类实现以及如何权衡使用 如何使用「Repository...如果使用其他架构模式例如 MVC、MVVM 或 Clean Architecture,虽然看起来不一样,但repository设计模式应用都一样。...(例如权限、摄像头、位置等)交互 这样做最大好处是,「如果任何第三方API 发生重大更改,我们只需要更新Repository代码」。...仅仅这一点就我就觉得使「Repository模式」 是100% 值得我们在实际中使用。 下面我们就看看如何使用吧! 3....如何进行repository初始化,我们需要根据我们选择状态管理工具来决定。

    2.6K30

    Flutter ——状态管理 | StreamBuild

    如果你需要对输出数据进行处理,可以使用StreamTransformer,它可以对输出数据进行过滤、重组、修改、将数据注入其他流等等任何类型数据操作。...Stream是一种订阅者模式,当数据发生变化时,通知订阅者发生改变,重新构建小部件,刷新UI。 ###4.如何使用streamBuild?...刚刚介绍了stream的如何使用,是不是感觉还是懵状态,实例代码仅仅是实例,如何应用到项目中呢?我们项目不仅仅是一个简单计数器,接下来我将结合项目,简单讲述一下如何使用streamBuild。...2.方法二使用状态管理bloc,如果使用bloc,streamBuild中stream 就因该传bloc数据,如果我其它地方使用使用了这个item,那么这个stream就应该传...bloc,此时streamBuild中stream 类型就不匹配了,这个item 就无法复用了,所以我放弃使用bloc状态管理 3.为何item 最外层使用StatefulWidget

    3K31

    前端面试题汇总

    (8)避免404:HTTP请求时间消耗是很大,因此使用HTTP请求来获得一个没有用处响应(例如404没有找到页面)是完全没有必要,它只会降低用户体验而不会有一点好处。...(6)开发智能事件处理程序 (7)javascript代码注意:谨慎使用with,避免使用eval Function函数,减少作用域链查找。...(){ console.log('created:这个时候已经可以使用到数据,也可以更改数据,在这里更改数据不会触发updated函数') this.msg...以上这些模式非常脆弱,通常会导致无法维护代码。 因此,我们为什么不把组件共享状态抽取出来,以一个全局单例模式管理呢?...确实是如此——如果您应用够简单,您最好不要使用 Vuex。一个简单store 模式就足够您所需了。

    2.8K30

    一种更优雅Flutter Dialog解决方案

    ,还存在一些其它解决方案,例如: 页面顶级使用Stack 使用Overlay 很明显,使用Overlay可移植性最好,目前很多toast和dialog三方库便是使用该方案,使用了一些loading库,...,关闭弹窗解决方案 使用Overlay依赖库,基本都存在一个问题,难以对返回事件监听,导致触犯返回事件难以关闭弹窗布局之类,想了很多办法,没办法在依赖库中解决该问题,此处提供一个BaseScaffold...但是又存在一个十分坑问题 因为使用IgnorePointer屏蔽子控件触摸事件,而IgnorePointer本身又不消耗触摸事件,会导致无法获取到背景点击事件!...GestureDetector获取不到触摸事件,很奇怪;使用Listener不会产生此问题 我们背景使用Container控件,我这里设置了Colors.transparent,直接会导致下层接受不到触摸事件...区分 最后 这个库花了一些时间去构思和实现,算是解决几个很大痛点 如果大家对返回事件有什么好处理思路,麻烦在评论里告知,谢谢!

    3.6K41

    flutter开发技巧汇总

    CupertinoTabScaffold这个构造你tab框架,这个笔者验证过,切换时候,不会导致每次都initState, 2、listview 加divider问题 这个实际上是一个小技巧,就是将你额...4、你也许想实现一个顶部弹框,但是似乎flutter只提供了showModalBottomSheet这种,或者中间弹框,而且占据控件不会铺满整个width,所以 image.png 一个这样弹框应该如何实现呢...可以你可能会遇到SegmentedControl中文字不居中问题,请注意,最好不要直接传一个text进去,最好用container包裹一下,类似这样,那么就居中了,注意SegmentedControl...,做出更加好维护,规模更大app,笔者从官方举办那个“枯燥无味flutter show”节目中发现了一种比较好设计模式BLOC模式,很好实现了代码中模型与数据分离,模型复用问题。...如果你遇到了代码复用或者说页面规模太大需要用很好模式来分离逻辑问题,不妨了解一下我另外一篇文章flutter中使用bloc 9、有时候我们需要一个背景为图片,而且边缘是有弧度背景,那么,有没有什么很好办法来做到

    1.7K81
    领券