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

从v7.2.1迁移到flutter_bloc v8.0.0后不会触发flutter_bloc事件

基础概念

Flutter Bloc 是一个用于 Flutter 应用的状态管理库,基于 BLoC(Business Logic Component)设计模式。它通过将业务逻辑与 UI 分离,使得代码更加清晰和可维护。Bloc 通过事件(Event)、状态(State)和上下文(Context)来管理应用的状态。

迁移问题

从 Flutter Bloc v7.2.1 迁移到 v8.0.0 后,可能会遇到事件不会触发的问题。这通常是由于 API 的变化导致的。

原因分析

  1. API 变化:Flutter Bloc v8.0.0 对一些 API 进行了重大更改,特别是事件的分发方式。
  2. 事件分发器:在 v8.0.0 中,事件分发器的使用方式有所改变,可能导致事件无法正确触发。
  3. 依赖注入:v8.0.0 引入了新的依赖注入机制,可能需要调整代码以适应新的依赖注入方式。

解决方法

以下是一些可能的解决方案:

1. 检查事件分发方式

确保你使用的是 v8.0.0 中正确的事件分发方式。例如,v8.0.0 中的 BlocProvider.of<T>(context) 方法被替换为 BlocProvider.of<T>(context, listen: false)

代码语言:txt
复制
// v7.2.1
BlocProvider.of<MyBloc>(context).add(MyEvent());

// v8.0.0
BlocProvider.of<MyBloc>(context, listen: false).add(MyEvent());

2. 更新 Bloc 和 Cubit

确保你已经更新了所有相关的 Bloc 和 Cubit 类,以适应 v8.0.0 的 API。

代码语言:txt
复制
// v7.2.1
class MyBloc extends Bloc<MyEvent, MyState> {
  // ...
}

// v8.0.0
class MyBloc extends Bloc<MyEvent, MyState> with ListenerMixin {
  // ...
}

3. 检查依赖注入

如果你使用了依赖注入框架(如 Provider、Riverpod 等),确保你已经更新了依赖注入的配置。

代码语言:txt
复制
// v7.2.1
BlocProvider<MyBloc>(
  create: (context) => MyBloc(),
  child: MyApp(),
);

// v8.0.0
BlocProvider<MyBloc>(
  create: (context) => MyBloc(),
  child: MyApp(),
);

4. 调试和日志

在调试过程中,添加日志以确保事件被正确分发和处理。

代码语言:txt
复制
class MyBloc extends Bloc<MyEvent, MyState> with ListenerMixin {
  @override
  Stream<MyState> mapEventToState(MyEvent event) async* {
    print('Event received: $event');
    // ...
  }
}

参考链接

通过以上步骤,你应该能够解决从 Flutter Bloc v7.2.1 迁移到 v8.0.0 后事件不会触发的问题。

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

相关·内容

初学者的 Flutter bloc

当我们使用 Flutter Bloc,我们要在应用中创建事件触发交互,然后 Bloc 会发射 emit 请求数据,存在在 state 中,在真实的场景中,它会像这样: 用户点击按钮来获取游戏列表 事件触发...这个挂件不会重新构建视图,它只会监听。 BlocBuilder 通过这个挂件,我们能够根据它们的状态重新构建我们的挂件。...至此,这个首页有三个 blocs 和两个事件触发。现在,我们看看首页布局 HomeLayout。 HomeLayout 正如上面所提及,这个类有三个主要的挂件,包含视图的骨架。...我们使用一个 BlocSelector 来控制这情形,当用户点击其中一个分类,事件将会被触发并且 bloc 将发射一个选中分类的 id 状态 isSelected,所以在 bloc selector 中...AllGamesWidget AllGamesEvent 我们创建一个 API 获取所有游戏的事件

15510

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

[表情1] 项目效果(建议PC浏览器打开) Bloc范例效果 Cubit范例效果 问题 初次使用flutter_bloc框架,可能会有几个疑问 state里面定义了太多变量,某个事件只需要更新其中一个变量...state.isExtended; } } } main_event:在这里就能看见,view触发了那些事件了;维护起来也很爽,看看这里,也很快能懂页面在干嘛了 @immutable abstract...;改动写法对比以前的写法,优雅了N倍 所有事件入口全部归纳在一起 可以轻松的归纳事件入口,跳转到相应的业务逻辑 对事件的处理,不用写一堆判断了!...如果buildWhen返回false,builder则不会调用state且不会进行重建。...在这种情况下,BlocProvider由于不会创建bloc,因此不会自动关闭该bloc。

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

    题记 —— 执剑天涯,你的点滴积累开始,所及之处,必精益求精。 *** Flutter是谷歌推出的最新的移动开发框架。...【x1】微信公众号的每日提醒 随时随记 每日积累 随心而过 【x2】各种系列的视频教程 免费开源 关注 你不会迷路 【x3】系列文章 百万 Demo 随时 复制粘贴 使用 *** 在 Flutter...[在这里插入图片描述] 使用BloC模式,Flutter项目应用里的所有组件都在一个事件流,其中一部分组件可以订阅事件,另一部分组件则消费事件 [在这里插入图片描述] *** 2 BloC 的基本使用...BloC是一种架构模式也是一种编程思想,在Flutter中使用BloC时,首先要引入bloc库 dependencies: flutter_bloc: ^6.0.6 然后将依赖库拉取到本地 flutter...buildWhen参数,用于向BlocBuilder提供可选的条件,返回 true,那么将调用state执行视图的重新构建,如果返回false,则不会执行视图的重建操作。

    3.3K11

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

    BLoC 代表 Business Logic Components;它的目的是用户界面分离程序的业务逻辑。使得应用程序代码更加优雅,可扩展和可测试。...✅ 开发者: Felix Angelov ✅ 赞助者: Very Good Ventures, Stream, Miquido ✅ 版本: flutter_bloc: ^8.0.1(编写该文的时候) BLoC...使用 BLoC 的优点 ✅ 针对不同场景都有很出色的文档 ✅ UI 中分离业务逻辑,因此使得代码更容易理解 ✅ 使得产品更易测试 ✅ 容易跟踪应用程序经历的状态 使用 BLoC 的缺点 ✅ 其学习曲线有点陡峭...extends AppBlocEvent { const ChangeTextEvent();} 上面我们创建了一个 ChangeTextEvent,当按钮被点击触发。...提供我们的 BLoC import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import

    84710

    Flutter 状态管理 | 业务逻辑与构建逻辑分离

    理解需要哪些数据、数据存储在哪里,哪里来,要传到哪里去,是编程过程中非常重要的一个环节。由于数据需要在构建界面时使用,所以很自然的:在布局写哪里,数据就在哪里维护。...StopWatchType.running; // tag3 }); } } ---- 4.秒表记录值的维护 如下所示,在秒表运行时点击旗子,可以记录当前的时刻并显示在右侧: 由于布局界面在 _HomePageState 中,事件触发也在该类中定义...基于 flutter_bloc 的状态管理 状态类的核心逻辑应该在于界面的 构建逻辑,而业务数据的维护,我们可以提取出来。...这里通过 flutter_bloc 来将秒表中数据的维护逻辑进行分离,由 bloc 承担。...我们的目的是为 _HomePageState 状态类 "瘦身" ,如下,其中对于数据的处理逻辑都交由 StopWatchBloc 通过 add 相关事件触发

    1.5K40

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

    前言 看了Bloc源码,心情有点复杂呀。。。 [img] 说点积极的......下面就直接写出调整写法了 插件 因为官方插件生成的写法,和调整写法差距有点大,而且官方插件不支持生成view层和相关设置,此处我就撸了一个插件,完善了相关功能 请注意,Wrap代码和提示代码片段,参靠了官方插件规则...这里就不重复写怎么使用了,使用明细可参照:flutter_bloc使用解析---骚年,你还在手搭bloc吗!...bindEventsToStates() 方法 Bloc抽象了一个mapEventToState(Event event)方法,继承Bloc抽象类,必须实现该方法 Bloc类中,实例了Stream流对象,来做Event的事件触发机制...添加Event事件时,会触发 _bindEventsToStates() 方法中的listener回调 _bindEventsToStates里面做了一些操作 被添加的Event事件:events.asyncExpand

    2.4K41

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

    希望点赞支持,本系列文章一览: 【Flutter&Flame 游戏 - 壹】开启新世界的大门 【Flutter&Flame 游戏 - 贰】操纵杆与角色移动 【Flutter&Flame 游戏 - 叁】键盘事件与手势操作...不断运动的动画,是通过 Timer.periodic 周期触发定时器实现的,每 500 ms 触发一次更新。...由于这里是单独抽离的 AnimatedEllipsisText ,所以 setState 也只是局部的组件更新,不会影响触发外界组件的重新构建。...---- 最后,是加载页最核心的业务逻辑,该项目是通过 flutter_bloc 来进行状态管理的。...代码中可以看出,这个像素风格的进度条,通过 PinballLoadingIndicator 组件进行显示。构造中传入进度值,红色的区域就会占据相应的百分比。

    79910

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

    希望点赞支持,本系列文章一览: 【Flutter&Flame 游戏 - 壹】开启新世界的大门 【Flutter&Flame 游戏 - 贰】操纵杆与角色移动 【Flutter&Flame 游戏 - 叁】键盘事件与手势操作...不断运动的动画,是通过 Timer.periodic 周期触发定时器实现的,每 500 ms 触发一次更新。...由于这里是单独抽离的 AnimatedEllipsisText ,所以 setState 也只是局部的组件更新,不会影响触发外界组件的重新构建。...---- 最后,是加载页最核心的业务逻辑,该项目是通过 flutter_bloc 来进行状态管理的。...代码中可以看出,这个像素风格的进度条,通过 PinballLoadingIndicator 组件进行显示。构造中传入进度值,红色的区域就会占据相应的百分比。

    78810

    【Flutter 专题】80 初识 Flutter Stream (一)

    和尚在之前尝试 EventChannel 时曾经用到过 Stream 流数据,现在准备学习一下 flutter_bloc 时也主要用到 Stream 来做异步处理,于是简单学习一下何为 Stream...Flutter 提供了多种创建 Stream 的方式; 1.1 Stream.fromFuture(Futurefuture) Stream 通过 Future 创建新的单订阅流,当 Future 完成时会触发...,当这一系列的 Future 均完成时,Stream 以 done 事件结束;若 Futures 为空,则 Stream 会立刻关闭;其分析源码,很直接的看到是将每一个 Future 事件监听完之后才会执行的微事件结束...2.9 Future get length Stream 监听订阅事件结束,符合 where 条件的数量; _streamLength(index) async { Duration...2.10 Future get isEmpty Stream 监听订阅事件结束,统计是否符合 where 条件的订阅数据是否为空; _streamLength(2); ?

    1.1K21

    Flutter 桌面探索 | 自定义可拖拽导航栏

    这说明用户登录时会服务器获取配置信息,作为导航栏的状态数据决定显示。 本文我们将来探讨两个问题: 第一:如何将导航栏的数据变得 可配置。 第二:如何实现 拖拽 更改导航栏位置。...如何在数据变化触发更新。 状态管理的工具多种多样,但都不会脱离这两件本质的工作,不同的只是用法的形式而已。不必为了一些表面的功夫争论不休,而忽略问题的本质,适合自己就是好的。...---- 这里用我比较熟悉的 flutter_bloc 来对激活菜单数据进行管理。现在引入 Cubit ,对于小的数据进行管理变得非常方便。...super(id); void selectMenu(int id) { emit(id); } } ---- 上面完成了 记录 和 维护 数据的变化,那接下来的重点就是:如何在数据变化触发更新...另外 Draggable 中有一些拖拽事件相关的回调,在这里作用不大,大家可以只了解一下。 bool _onWillAccept(int?

    2.3K20

    【Flutter 异步编程 - 拾】 | 探索 Stream 的转换原理与拓展

    该成员运行结果上来看,将用于控制订阅的完成,等下就能看到它的作用。 ---- 我们已经知道,当输入流的元素激活时,会触发 _handleData 方法。...也就是说当你一直拖拽,前后元素响应时间戳都会很短,是不会触发 debounce 的。上面动图中,停顿了一下,前后间隔超过阈值,所以中间会触发一次。 ---- 2....throttle 更适合那些需要在固定时下激活的场景,比如画板中,每个 50ms 记录一个更新点,这时 debounce 很明显不合适,因为在连续密集触发的情况下, debounce 并不会触发。...其依赖的数据是 时间差列表 List , 开始拖拽开始起,每次触发事件激活一次元素,此时的时间差就会决定线条的偏移量: 绘制逻辑非常简单,就是根据 List 数据画线而已: class...painter: Painter(touchCollector), ), ); }, ), ---- 对应 throttle 而言,只要把原流通过 throttle 转换即可,这样拖拽的事件就会以指定间隔时间触发

    90230

    「大众点评点餐」小程序开发经验 04:逻辑层

    整个逻辑层大部分的代码都会写在 Page 函数中,Page 中承接着整个页面的数据、生命周期函数,以及在视图中绑定的事件触发函数(例如点击事件)。...首先,Page 的 data 会被用于页面的初始化渲染,之后,用户会在页面上——也就是展示层——触发事件。 举个例子:用户在点餐小程序,产生了「点击加菜按钮」这样的事件。...页面监听到这个事件之后,会触发在 Page 函数中申明的自定义事件。 然后,小程序根据具体情况,可能会调用微信的 API。...React 也是在 Component 里面申明自定义方法,触发通过 setState 来重新渲染页面。...我们之前的 HTML 5 页面就是使用 React 写的,所以逻辑层迁移到小程序的代价并不是很大。

    76910

    敖丙亲自上手迁移数据库,只用了2小时

    云服务器实现了硬件上的隔离以及宽带上的独享,不受到地域、流量等的限制,可以持续的进行业务交流,不会因中断影响效果。...我们现在是某云迁移到华为云,我想大家也会与这样的场景,但是这样迁移会带来一些什么样的问题呢?不知道大家思考过没?...迁移失败:数据迁移失败怎么办 数据丢失:怎么判断迁移数据是否完整 业务中断:迁移到一半遇到不可抗力怎么办 数据、传输加密:数据传输过程中怎么加密,防止被不法之徒中途获取数据 热切换:怎么做到不停服切换...我开始迁移到结束,整个流程其实不到2小时,这个放在以前是不敢想的,这波体验我是很满意的,让我一个开发就做到了以前DBA才能做的事情,说着说了旁边的DBA的眼角也湿润了.......触发器、事件的迁移 应用场景: 市面上的迁移产品均不支持触发器、事件的迁移,精通迁移的用户关注这些细节,因 为触发器和事件也是数据库的一部分,触发器和事件存在关键的业务逻辑,这些对象 不支持迁移,业务必然报错

    1.1K20

    fish_redux使用详解---看完就会用!

    说句心里话,这篇文章,来来回回修改了很多次,如果认真看完这篇文章,还不会写fish_redux,请在评论里喷我。...flutter对鼠标触发的相关事件也支持的越来越好了!...只能想办法看能不能添加一次字段,后期添加字段,并不会引起其他模块爆红,试了多次,成功的使用中间实体,来解决该问题 这里优化俩个方面 使用通用的全局实体 这样后期添加字段,就不会影响其他模块,这样我们就能一个个模块的去整改...shit 组合widget关键点 一般来说,我们并不关注widget内部页面的实现,只需要关心的是widget需要的数据源, 以及widget对交互的反馈;例如:我点击widget,widget回调事件...flutter_bloc使用解析—骚年,你还在手搭bloc吗!

    2.8K43

    一种更优雅的Flutter Dialog解决方案

    事件被AbsorbPointer消费掉,会导致背景的页面无法获取到触摸事件;IgnorePointer本身无法消费触摸事件,又由于IgnorePointer和AbsorbPointer都具有屏蔽子Widget...,很奇怪;使用Listener不会产生此问题 我们的背景使用Container控件,我这里设置了Colors.transparent,直接会导致下层接受不到触摸事件,color为空才能使下层控件接受到触摸事件...Alignment.center, children: children, ), ), ); } } Toast和Loading冲突 这个问题,理论上肯定会存在的...都会让内部逻辑和方法使用急剧复杂,维护也会变得不可预期,故额外只多提供一个OverlayEntry;如果需要更多,可copy本库,自行定义,实现该库相关源码,都力求能让人看明白,相信大家copy使用时不会感到晦涩难懂...flutter_bloc使用解析---骚年,你还在手搭bloc吗!

    3.6K41
    领券