前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Flutter event_bus 发布/订阅 总线

Flutter event_bus 发布/订阅 总线

作者头像
xcsoft
发布于 2022-04-06 11:06:21
发布于 2022-04-06 11:06:21
79700
代码可运行
举报
文章被收录于专栏:星辰日记星辰日记
运行总次数:0
代码可运行

最近在捣鼓Flutter的时候, 一直在解决有关fileProvider的问题. 当需要打开安卓设备自带的文件管理器时, 一直报错

exposed beyond app through Intent.getData() 在配置 FileProvider相关权限后, 依旧不行, 貌似需要原生调用.这估计就需要flutter与原生相互调用了, 奈何我暂时没有了解过有关原生开发的信息. 就只能先去解决一些页面交互的问题.

event_bus

Flutter 的event_bus扩展, 可以简单的实现一个 发布<->订阅 模型. 如果需要其他的跨组建数据共享, 则可以选择 Provider 扩展.

举个例子, 当我们在 login.dart 中登录后, 需要在 user.dart 中更新信息时. 我们可以直接在 user.dart 中订阅一个事件, 当用户在 login.dart 中登录后发布一个信息, user.dart中监听到事件则重新获取用户信息, 重新渲染页面.

实现

目前 我需要的场景是, 当用户登录后, 直接返回首页, 刷新信息.

大致的文件结构为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
|_ main.dart
|_ account |_ login.dart 
|
|_ home    |_ index.dart
|          |_ home.dart
|          |_ user.dart
|
|_ event   |_ bus.dart
           |_ account_event.dart

其中 main.dart 是我们的启动文件, account/login 为登录页面, home/index 为首页的 入口文件, 有 user 和 home 两个tab.

首先 我们可以新建一个 ~/event/bus.dart 文件, 来全局共享 EventBus 类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:event_bus/event_bus.dart';

// event/bus.dart
class Bus {
  static late EventBus eventBus;

  static init() {
    Bus.eventBus = EventBus();
  }
}

接着在 main.dart 中初始化 event_bus

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/* code */
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  Bus.init();

  runApp(const App());
}

在发布/订阅消息时, 我们需要一个模型来指定参数, 比如这里 我们只需要一个简单的登录通知 >

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class AccountEvent {
  final String type;

  const AccountEvent(this.type);
}

接着 我们可以在需要的页面(user.dart)订阅通知 >

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 import 'package:example/event/account_event.dart';
 import 'package:example/event/bus.dart';
 
 /* code */

 Future<void> _listen() async {
     Bus.eventBus.on<AccountEvent>().listen((event) {
        LogUtil.v(event.type)
        /* code */
     });
 }

此时 当用户登录后, 我们可以直接 通过 EventBus.fire 发布信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 import 'package:example/event/account_event.dart';
 import 'package:example/event/bus.dart';
 
 Future<void> _login() async {
   httpR.post('/login',{
     'user': xx,
     'pass': xx,
   }).then((res) async {
     if (res['code'] == 0){
        prefs.setString('token', res['token']); // 存储凭证
        Bus.eventBus.fire(const AccountEvent('login'));
        Navigator.of(context).pop();
     }
   })
 }

此时, 当用户登录后, 在user.dart中 我们期待会返回一个 内容为 'login' 字符串

本文链接:https://blog.xsot.cn/archives/flutter_event_bus.html

所有原创文章采用 CC BY-NC-SA 4.0 协议进行许可, 转载请注明原文链接

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flutter之EventBus消息总线
原生开发中,时常遇到通知或广播机制,应对需要跨页面的事件通知。作为移动端跨平台框架的Flutter而言,也有同样的解决方案-EventBus,event_bus提供事件总线功能来实现一些状态的更新,核心是基于Dart Streams(流);事件总线通常实现了订阅者模式,订阅者模式包含发布者和订阅者两种角色,可以通过事件总线来触发事件和监听事件,下面来通过更改主题颜色的案例认识下event_bus。
Qson
2022/04/11
1.3K0
Flutter之EventBus消息总线
「 Flutter 项目实战 」设计企业级项目入口 main.dart 设计与实现 ( GSYGithubApp 源码解读·二 )
???? 提示:温馨提示一下哈,这篇文章主要是针对 GitHub 上 12+k 顶级项目「 CarGuo/gsy_github_app_flutter 」 的源码解读,因为这是我目前见过最棒、最具有企
圆号本昊
2021/09/24
9830
「 Flutter 项目实战 」设计企业级项目入口 main.dart 设计与实现 ( GSYGithubApp 源码解读·二 )
「 flutter 必知必会 」最强事件发布/订阅框架方案 event_bus 全局事件总线使用解析
一、前言 EventBus是全局事件总线,底层通过Stream来实现;它可以实现不同页面的跨层访问,通过Stream的机制来实现不同widget之间的状态共享. 二、作用 举个例子: 你有一个主界面,里面有一些信息可能会修改,但触发源不在该界面,是在其他的界面触发了一些事件后,首页的内容需要做修改。如果没有EventBus,也有很多的方式可以实现,譬如定义全局静态变量、或者定义个CallBack接口传出去等等。不管怎样,总是要把主页和触发源关联起来,这是相当难受的,这不但会导致代码量暴涨,同时还会导致耦合
圆号本昊
2021/09/24
1.2K0
Flutter中使用event_bus进行事件广播和事件监听
通俗地讲,状态管理就是:当我们想在多个页面(组件/Widget)之间共享状态(数据),或者一个页面(组件/widget)中的多个子组件之间共享状态(数据),这个时候我们就可以使用Flutter中的状态管理来管理统一的状态(数据),实现不同组件间直接的传值和数据共享。
拉维
2019/10/14
5.6K0
Flutter中使用event_bus进行事件广播和事件监听
flutter使用eventBus进行组件间通信
在使用flutter开发过程中有些时候需要在组件之间进行通讯,我们可以借助eventBus来实现。实现步骤如下:
挥刀北上
2021/01/16
3.8K0
flutter使用eventBus进行组件间通信
flutter中event_bus实现原理
Event Bus可以说是在客户端界公认的最好的全局通信解决方案了,他的出现简化了应用程序内各组件间、组件与后台线程间的通信。
老码小张
2018/09/13
9.4K0
【Flutter 专题】99 初识 EventBus
和尚在 Android 开发过程中经常会用到 EventBus 事件分发机制,EventBus 遵从 publish/subscribe 模式,即发布/订阅模式;简化了模块之间通信,对于项目的解耦很实用;而 Flutter 也提供了相应的 event_bus 插件,今天和尚学习尝试一下;
阿策小和尚
2020/09/01
1K0
【Flutter 专题】99 初识 EventBus
flutter全局数据共享通知方案
让我们先抛开Flutter这个平台说话,如果让你实现数据共享,你能想到的基础方案有哪些。
老码小张
2018/09/13
6.1K2
Flutter 中路由返回的多种方式
当页面中跳转顺序是A页面-B页面-C页面,如果在B页面中使用上面这个命令跳转到C页面,在C页面返回时会直接跳转到A页面。如果在A页面也是使用的此命令跳转到B页面,那么在C页面中返回时会返回A页面的上一级页面。
越陌度阡
2020/12/29
2.4K0
从 Flutter Go 到 Flutter Go web - 手把手带你轻松玩转 Flutter-web(一)
其实背景不多说, Flutter for Web 是 Google大会 伴随 Flutter 发布了1.5.4版本,同时也推出了Flutter for Web的预览版。
Nealyang
2019/09/29
1.7K0
从 Flutter Go 到 Flutter Go web - 手把手带你轻松玩转 Flutter-web(一)
Flutter中命名路由模块化及传参
上面的代码中分别引入了三个页面:Form.dart 和 Search.dart 以及 Tabs.dart。
越陌度阡
2020/12/28
1.6K0
Flutter BottomNavigation 底部导航详解 及问题记录
这里多数一句 Flutter 提供了两套预设的主题UI 这些UI有很多的常量可以直接引入使用
拿我格子衫来
2022/01/24
3.4K0
Flutter  BottomNavigation 底部导航详解 及问题记录
dart-flutter实现页面跳转
使用按钮在flutter应用中做到页面之间的跳转,一个简单的dmeo 直接上代码 这是lib/main.dart import 'package:flutter/material.dart'; import './pages/tabs.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(
Tom2Code
2023/02/14
7670
dart-flutter实现页面跳转
Flutter 中 BottomNavigationBar 定义底部导航条
BottomNavigationBar 是底部导航条,可以让我们定义底部 Tab 切换,在Scaffold 组件中通过配置bottomNavigationBar来实现该功能。
越陌度阡
2020/12/23
1.3K0
Flutter 中 BottomNavigationBar 定义底部导航条
Flutter定义tabbar底部导航路由跳转
第一步 把三个页面放到tabs里 Category.dart || Home.dart || Setting.dart 在这里我只展示Home.dart 另外两个页面相同
明知山
2020/09/03
1.8K0
Flutter跨页面改变BottomNavigationBar选中下标
###### 需求是这样的,bottomBar内有A,B,C,D页面,4个页面由tabBar管理显示,当在A页面点击按钮时让TabBar选中B页面展示,通俗来讲就是在两个不相邻的Widget里,一个Widget改变另一个Widget的状态。
前端小tips
2021/12/07
1.2K0
Flutter跨页面改变BottomNavigationBar选中下标
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutte
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-卓伊凡换人优雅草Alex
卓伊凡
2025/02/02
1300
Flutter 多语言、主题切换之GetX库
  关于GetX库前面我们讲述了状态管理的使用,实际上GetX是非常强大的,功能很多,本篇文章中我们将介绍GetX的多语言切换和主题切换等功能。
晨曦_LLW
2024/05/25
1.1K0
Flutter 多语言、主题切换之GetX库
Flutter开发-事件总线
在APP中,我们经常会需要一个广播机制,用以跨页面事件通知,比如一个需要登录的APP中,页面会关注用户登录或注销事件,来进行一些状态更新。
码客说
2020/05/14
6140
推荐阅读
相关推荐
Flutter之EventBus消息总线
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验