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

Flutter BLoC mapEventToState仅在第一次调用事件时调用,而不是每次触发该事件时都调用

Flutter BLoC是一种用于状态管理的设计模式,它将业务逻辑与用户界面分离,使得应用程序的开发更加可维护和可测试。在Flutter BLoC中,mapEventToState是一个方法,用于将事件映射到新的状态。

mapEventToState方法仅在第一次调用事件时被调用,而不是每次触发该事件时都调用。这是因为BLoC的设计思想是将事件转化为状态的变化,而不是每次事件都重新计算状态。当第一次调用事件时,BLoC会根据当前的状态和触发的事件,计算出新的状态,并将其返回给用户界面进行展示。之后,如果再次触发相同的事件,BLoC会直接返回之前计算得到的状态,而不会重新执行mapEventToState方法。

这种设计有以下优势:

  1. 性能优化:避免了重复计算状态的开销,提高了应用程序的性能。
  2. 状态一致性:保证了相同事件触发时,状态的一致性,避免了不必要的状态变化。
  3. 可维护性:将事件与状态的转换逻辑分离,使得代码更加清晰和易于维护。

在实际应用中,mapEventToState方法的具体实现会根据业务需求而定。可以根据事件的类型和当前的状态,进行一系列的判断和计算,最终返回新的状态。同时,为了更好地使用Flutter BLoC,腾讯云提供了一些相关产品和工具,如腾讯云移动开发平台、腾讯云函数计算等,可以帮助开发者更高效地构建和部署Flutter应用。

更多关于Flutter BLoC的信息,可以参考腾讯云的官方文档:Flutter BLoC官方文档

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

相关·内容

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

用过Bloc的靓仔们,肯定能感受到,Bloc框架对开发页面,做了很清晰划分,框架强行定了俩种开发模式 Bloc模式:模式划分四层结构 bloc:逻辑层 state:数据层 event:所有的交互事件...Event层,层是定义所有的事件交互 这边提一下 Bloc:省略了一些代码 abstract class Bloc extends BlocBase {...是抽象类 构造函数里面调用 _bindEventsToStates() 方法 Bloc抽象了一个mapEventToState(Event event)方法,继承Bloc抽象类,必须实现方法 Bloc...类中,实例了Stream流对象,来做Event的事件触发机制 添加Event事件,会触发 _bindEventsToStates() 方法中的listener回调 _bindEventsToStates...:将Event参数传入mapEventToState中,然后mapEventToState回传State对象 然后触发listen回调,listen中,将state传emit中,然后触发刷新控件重建 总结

2.4K41
  • Flutter 专题】86 初识状态管理 Bloc (一)

    在使用 Bloc 之前需要提前了解一下如下几个概念; Event Event 事件作为 Bloc 的输入,一般是为了响应用户交互(例如按钮按下)或生命周期事件(例如页面加载)添加它们。...;例如和尚上述定义的 TestEvent 中的各个 onEvent 中状态变更等均可以视为 Transitions 转场;onTransition 在 Bloc 的 state 更新之前被调用,常用于记录...作为将 Stream 输入的 Event 事件转换为输出的 States 状态;每个自定义的 Bloc 必须继承自基础的 Bloc;通过复写 initialState 和 mapEventToState...方法来完成事件 Event 和 State 状态的转换; initialState 为 Bloc 初始化状态,状态是接收任何事件之前的状态; mapEventToState 将 Event 作为参数...; import 'package:bloc/bloc.dart'; import 'package:flutter/material.dart'; class BlocPage extends StatefulWidget

    82251

    Flutter响应式编程:Streams和BLoC

    只要至少有一个活动侦听器,Stream就会开始生成事件,以便每次通知活动的StreamSubscription对象: 一些数据来自流, 当一些错误发送到流, 当流关闭。...换句话说,从事件(例如,点击),变量的变化,消息,......到构建请求,可能改变或发生的所有事物的所有内容将被传送,由数据流触发。...[image.png] Widgets通过Sinks向BLoC发送事件BLoC通过Stream通知Widgets, 由BLoC实现的业务逻辑不是他们关注的问题。...为了在每个BLoC中强制执行dispose()方法,所有BLoC必 须实现BlocBase接口。...通过Streams使其工作的示例代码可能如下所示......丑陋不是它。 在BLoC级别,您还需要转换某些数据的“假”注入,以触发提供您希望通过流接收的数据。

    4.2K90

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

    [在这里插入图片描述] 使用BloC模式,Flutter项目应用里的所有组件都在一个事件流,其中一部分组件可以订阅事件,另一部分组件则消费事件 [在这里插入图片描述] *** 2 BloC 的基本使用...BloC是一种架构模式也是一种编程思想,在Flutter中使用BloC,首先要引入bloc库 dependencies: flutter_bloc: ^6.0.6 然后将依赖库拉取到本地 flutter.../cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart...定义的 Bloc 角色,代码如下: import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:intl/intl.dart'; /...buildWhen参数,用于向BlocBuilder提供可选的条件,返回 true,那么将调用state执行视图的重新构建,如果返回false,则不会执行视图的重建操作。

    3.3K11

    Flutter 对状态管理的认知与思考

    大家如果写flutter套娃代码写的很尽兴的时候,可能会发现,很多点击事件的交互入口都在widget山里 交互事件散落在大量的界面代码,如果需要调整跳转事件传参,找起来会很头痛 还有一个很重要的方面:实际上交互事件的入口...基于业务会逐渐鬼畜的考量,一些框架划分出了Action层,统一管理了所有的交互事件 成本 框架侧成本 想要统一管理所有的交互事件,实现上难度不是很大 一般情况下,我们可以直接在view层,直接调用逻辑层的方法...,执行相关有业务逻辑 现在需要将调用逻辑层方法的行为,进行统一的管理 所以,需要在调用的中间,增加一个中间层,中转所有的事件 这个中转层就是action层,可以管理所有的交互事件 来看下实现思路 [Action...tag}) { final key = _getKey(T, tag); //只保存第一次注入:针对自动刷新机制优化,每次热重载的时候,数据不会重置 _single.putIfAbsent...tag}) { final key = _getKey(T, tag); //只保存第一次注入:针对自动刷新机制优化,每次热重载的时候,数据不会重置 _single.putIfAbsent

    1.1K41

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

    管理的目的就是分层级、提高地 处理任务。 1.状态的作用范围 首先来思考一个问题:是不是所有的状态需要管理?...通过这种方式,编程者可以将 状态变化逻辑 集中在 Bloc 中处理。当事件触发,通过发送 Event 指令,让 Bloc 驱动 State 进行变化。...避免每输入一个字符请求接口。 注: debounce : 当调用动作 n 毫秒后,才会执行动作,若在这 n 毫秒内又调用此动作则将重新计算执行时间。...3. bloc 层 首先来看事件,整个搜索功能只有一个事件:文字输入时的TextChanged,事件触发需要附带搜索的信息字符串。...事件触发,是在文字输入时。

    1.5K20

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

    事实上,一些状态管理的技术被普遍使用: Scoped Model以其简单著称 BLoC也被广泛使用,借助于Streams和RxDart,它适用于更复杂的应用程序 在最近的Google I/O大会上,Flutter...2.返回一个Future的结果,调用的代码可以等待结果并相应地执行某些操作。 3.抛出一个异常,调用的代码可以通过try/catch捕获它,并在需要展示一个警告。...以下是我用Flutter和Firebase实现的身份验证流程的示例: [image] 观察到的结果: 当触发了登录事件,我们禁用了所有按钮并显示CircularProgressIndicator,我们将加载状态设置为...,因为builder只应该返回一个控件,不是执行任何命令式的代码。...WABS使用简单的异步方法来处理UI事件RxVMS使用的是 RxCommand。

    16.1K20

    初学者的 Flutter bloc

    当我们使用 Flutter Bloc,我们要在应用中创建事件触发交互,然后 Bloc 会发射 emit 请求数据,存在在 state 中,在真实的场景中,它会像这样: 用户点击按钮来获取游戏列表 事件触发...首页有不同的部分,我们看下。 Header 这是个简单的挂件,我们展示了两行文本和一个圆形的头像。 Category 挂件 展示通过调用 getGenres 方法 API 返回的不同的类型。...我们使用一个 BlocSelector 来控制这情形,当用户点击其中一个分类,事件将会被触发并且 bloc 将发射一个选中分类的 id 状态 isSelected,所以在 bloc selector 中...this.categoryName, ); } } GameByCategoryBloc 在这个 bloc 总,我们将通过方法 GetGamesByCategory 来调用存储库以获取满足分类...个人观点,我们更喜欢创建小美的 blocs 来使得我们的代码更加干净和可维护性,不是使用大文件 bloc 来管理很多的事情,但是你的逻辑要求你那么做,你那么做会更好。

    14310

    Flutter完整开发实战详解(十一、全面深入理解Stream)

    一、Stream 由浅入深 Stream 在 Flutter 是属于非常关键的概念,在 Flutter 中,状态管理除了 InheritedWidget 之外,无论 rxdart,Bloc 模式,flutter_redux...,fish_redux 离不开 Stream 的封装,事实上 Stream 并不是 Flutter 中特有的,而是 Dart 中自带的逻辑。...对象用于监听, 并且通过监听得到 StreamSubscription 管理事件订阅,最后在不需要关闭即可,看起来是不是很简单?...); 执行 1 中得到的 _onData 对象,触发 listen 传入的回调方法。...默认的在 Dart 中,如 点击、滑动、IO、绘制事件事件属于 event 外部队列,microtask 内部队列主要是由 Dart 内部产生, Stream 中的执行异步的模式就是 scheduleMicrotask

    3.7K41

    Flutter 面试知识点集锦

    Layer,所以不是每个 RenderObject 具有 Layer 的,因为这受 isRepaintBoundary 的影响。...更多相关可查阅 《Flutter完整开发实战详解(九、 深入绘制原理)》 Flutter 中 Widget 不可变,每次保持在一帧,如果发生改变是通过 State 实现跨帧状态保存,真实完成布局和绘制数组的是...Flutter 中 setState 其实是调用了 markNeedsBuild ,方法内部标记此Element 为 Dirty ,然后在下一帧 WidgetsBinding.drawFrame...didChangeDependencies() 在 initState() 之后调用,当 State 对象的依赖关系发生变化时,方法被调用,初始化时也会调用。...deactivate() 当 State 被暂时从视图树中移除,会调用这个方法,同时页面切换,也会调用

    5.1K61

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

    ✅ Events:事件就是应用程序的输入(比如点击鼠标加载文件,文本输入,或者应用程序希望接受到的其他用户输入值) ✅ States:状态就是应用程序的状态,会根据事件收到的响应更改 BLoC 管理着事件...因为一个应用程序中会有很多事件,我们创建一个抽象类并继承它,并在需要处理和传递多个事件BLoC 进行扩展。...比如,任何你想通过切换事件的信息,我们都可以通过 this 获取(像 event.any_info - 我们必须相应更改事件),发射 emit 特定事件对应的状态。...提供我们的 BLoC import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import...总结 希望教程对你开始学习使用 BLoC 模式管理状态有所帮助。

    78810

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

    6.1 使用Provider进行状态管理 Provider是Flutter生态中最常用的状态管理库之一,它提供了一种简单强大的方式来管理应用程序的状态,并在不同组件之间进行状态共享。...6.2 使用Bloc进行状态管理 Bloc是另一个常用的Flutter状态管理库,它基于流(Stream)和事件(Event)的模式来管理应用程序的状态,并提供了一种清晰、可维护的方式来组织和处理复杂的业务逻辑...通过创建一个NavigationBloc来处理底部导航栏的状态,并在需要Bloc发送事件来更新状态,可以实现底部导航栏的状态管理。...并定义了一个mapEventToState方法来处理事件。...通过向Bloc发送事件,我们可以实现底部导航栏的状态管理,并根据需要更新导航栏的选中项状态。 7.

    31110

    Flutter&Flame 游戏 - 贰伍】pinball 源码分析 - 资源加载与 Loading

    操纵杆与角色移动 【Flutter&Flame 游戏 - 叁】键盘事件与手势操作 【Flutter&Flame 游戏 - 肆】精灵图片加载方式 【Flutter&Flame 游戏 - 伍】Canvas...---- 最后,是加载页最核心的业务逻辑,该项目是通过 flutter_bloc 来进行状态管理的。...仔细数一下上图,就会发现整体是由六个细条,从上到下排列的构成的。 ---- 4....---- 这个 load 方法,会在 AssetsManagerCubit 构造被立刻触发: ---- load 方法在有一个小细节,一开始延迟了一秒钟才开始真正加载,这是因为加载是个昂贵的操作,先给出...---- 然后通过 _triggerLoad 局部函数对象,分三波依次触发这些异步任务。每次异步任务完成,都会产出新的状态,让已加载的资源数加一。

    79610

    Flutter&Flame 游戏 - 贰肆】pinball 源码分析 - 项目结构介绍.md

    操纵杆与角色移动 【Flutter&Flame 游戏 - 叁】键盘事件与手势操作 【Flutter&Flame 游戏 - 肆】精灵图片加载方式 【Flutter&Flame 游戏 - 伍】Canvas...---- 最后,是加载页最核心的业务逻辑,该项目是通过 flutter_bloc 来进行状态管理的。...仔细数一下上图,就会发现整体是由六个细条,从上到下排列的构成的。 ---- 4....---- 这个 load 方法,会在 AssetsManagerCubit 构造被立刻触发: ---- load 方法在有一个小细节,一开始延迟了一秒钟才开始真正加载,这是因为加载是个昂贵的操作,先给出...---- 然后通过 _triggerLoad 局部函数对象,分三波依次触发这些异步任务。每次异步任务完成,都会产出新的状态,让已加载的资源数加一。

    78710

    优雅的UI与Model绑定 Flutter DataBus使用~

    Flutter开发中,大家绕不开Widget的刷新,setState()是最简单的用法。...但随着当app的交互变得复杂,setState出现的次数便会显著增加,每次setState都会重新调用build方法,这势必对于性能以及代码的可阅读性带来一定的影响。...如何优雅的解决这个问题,不得不提到StreamBuilder,StreamBuilder是Flutter中异步构建的核心组件。许多著名的开源框架例如Bloc皆是基于此实现。...当我们点击按钮使本地变量key1,key2做增加操作,之后调用setState()。 ? img ? img ? img ?...这样Widget的构建完全由Stream触发,控件无需自行setState,它的构建完全由数据驱动,是一种响应式编程。也是许多开源框架例如Bloc等核心原理。

    2.5K41

    Flutter&Flame 游戏 - 贰柒】pinball 源码分析 - 角色选择与玩法面板

    可以思考一下:这个模块是相对独立的,而且有一定的拓展需求,比如增加其他的角色,可以在包在进行处理。不是全部塞在主项目中,这样有利于对项目结构的划分,也能让读者更容易理解。...因为使用了Bloc ,业务逻辑封装了,使用统一的事件接口触发。这里只需看一下何时触发 characterSelected 方法即可。这就是业务分层所带来的的好处之一。...---- 3.角色选择的视图变化 如下,在 _Character 组件点击,是唯一触发 characterSelected 的场景。...原因很简单,移动端通过点击屏幕,桌面端通过按键触发事件 ,玩法是有区别的。 ---- 代码中对界面的分层处理是很值得借鉴的,不是把所有的构建逻辑写在一块。...所以关键就是方法的触发时机: ---- 在 StartGameListener 中,会监听 StartGameState 状态的变化,如果是 howToPlay 状态,则会触发 _onHowToPlay

    96840

    flutter中使用BloC模式

    flutter中,实现BloC模式的精髓就是, 展示的数据从BloC中来,具体到了stream上,有了stream的到来,就可以使用StreamBuilder来构建ui了。...,onListen中就可以收到,并且识别出事件,进行相应的处理,之后,stream中产生了新的数据,于是,StreamBuilder又触发了UI的更新,整个流程就跑通了。...3、便面了setState的方式来触发build,可能性能更好,注意,只是可能,因为这也是大佬们说的,我并不太认可,实际上我认为,即便是使用streamBuilder,当stream有新的data,也是触发了其包裹的组件走...1、个人觉得,非常简单的页面,使用BloC就有点过了,实际上像上面那个例子,点击次数计数,用StateFulWidget明显就是更优选择,使用BloC就有点为了模式模式了。...Redux相比大家也听过了,flutter中当然也是有的,那么,和Bloc有什么区别么?

    17.5K82

    Flutter完整开发实战详解(十二、全面深入理解状态管理设计)

    在所有 响应式编程 中,状态管理一直老生常谈的话题,而在 Flutter 中,目前主流的有 scope_model 、BloC 设计模式 、flutter_redux 、fish_redux 等四种设计..._inheritedWidgets 一般情况下是空的,只有当父控件是 InheritedWidget 或者本身是 InheritedWidgets 才会有被初始化,当父控件是 InheritedWidget...二、BloC BloC 全称 Business Logic Component ,它属于一种设计模式,在 Flutter 中它主要是通过 Stream 与 SteamBuilder 来实现设计的,所以...之后我们可以 dispatch 一个 Action ,在经过 middleware 之后,触发对应的 Reducer 返回数据,事实上这里核心的内容实现,还是 Stream 和 StreamBuilder...4、当我们调用 Stroe 的 dispatch 方法,我们会先进过 NextDispatcher 数组中的一系列 middleware 拦截器,最终调用到队末的 _changeController

    2K20
    领券