首页
学习
活动
专区
工具
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 模式管理状态有所帮助。

84510

Flutter响应式编程:Streams和BLoC

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

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

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

    16.1K20

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

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

    5.4K41

    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)来管理底部导航栏状态,以及如何实现一些高级功能,如添加徽章、动态更改导航栏项以及实现动画效果等。

    35910

    【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 中

    15310

    【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 属性随时访问当前状态

    82851

    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 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

    主题色切换+国际化 三连

    fontWeight: FontWeight.bold), ... ---- 所以只要有需要颜色地方,都可以使用这种方法从状态中拿主题色,颜色切换事件触发也是非常简单。...思路是极为一致,让我们看看有哪些不同,首先要说是rudux三大件:状态State,行为Action和处理器Reducer。所有状态由仓库统一管理,天子状态AppState向下分封。 ?...一个BloC也有三大件:Bloc 业务逻辑单元、State状态、Events事件 ? ---- 1.主题色BloC 状态类 可以根据自己爱好写出自己风格。下面是我比较喜欢风格。...定义Bloc可执行事件,比如这里直接传两参切换和重置状态 @immutable abstract class ThemeEvent {} class EventSwitchTheme extends...核心,主要通过事件去生成状态

    3.4K20
    领券