Flutter 基于Bloc框架的封装

2023-11-15

1.页面状态的bloc封装

1.1 定义一个基类用于bloc用于处理页面状态
状态主要有:loading,error,empty,以及展示内容的showContent

enum PageEnum {
  showLoading,
  showError,
  showEmpty,
  showContent,
}

1.2 定义一个枚举表示页面状态,另外还需定义事件的类,传递一些必要的数据
bloc流供baseWidget做状态的变化

class PageStatusEvent {
  String errorDesc; //错误数据,主要是展示错误页面
  bool isRefresh;//主要用于list列表数据
  PageEnum pageStatus; 页面状态
  PageStatusEvent({this.errorDesc,this.isRefresh, this.pageStatus});
}

1.3 BaseBloc封装

class BaseBloc {
  void dispose() {
    _pageEvent.close();
  }
  ///请求专用的类
  Repository repository = new Repository();

  ///主要是事件通知
  BehaviorSubject<PageStatusEvent> _pageEvent =
      BehaviorSubject<PageStatusEvent>();

  get pageEventSink => _pageEvent.sink;

  get pageEventStream => _pageEvent.stream.asBroadcastStream();

  postPageEmpty2PageContent(bool isRefresh, Object list) {
    pageEventSink.add(new PageStatusEvent(errorDesc : "", isRefresh: true,
        pageStatus: ObjectUtil.isEmpty(list)
            ? PageEnum.showEmpty
            : PageEnum.showContent));
  }
  postPageError(bool isRefresh, String errorMsg) {
    pageEventSink.add(
        new PageStatusEvent(errorDesc : errorMsg, isRefresh: isRefresh, pageStatus: PageEnum.showError));
  }
}

主要提供了页面状态的Stream,提供子类使用,postPageEmpty2PageContent,postPageError 主要是的页面状态调用方法

2.BaseWidget封装

@override
  Widget build(BuildContext context) {
    return _buildWidgetDefault();
  }

  ///构建默认视图
  Widget _buildWidgetDefault() {
    return WillPopScope(
      child: Scaffold(
        appBar: buildAppBar(),
        body: _buildBody(),
      ),
    );
  }

  ///子类实现,构建各自页面UI控件
  Widget buildWidget(BuildContext context);

  ///构建内容区
  Widget _buildBody() {
    bloc = BlocProvider.of<B>(context);
    return new StreamBuilder(
        stream: bloc.pageEventStream,
        builder:
            (BuildContext context, AsyncSnapshot<PageStatusEvent> snapshot) {
          PageStatusEvent status;
          bool isShowContent = false;
          if (snapshot == null || snapshot.data == null) {
            isShowContent = false;
            status =
                PageStatusEvent(errorDesc : "", isRefresh: true, pageStatus: PageEnum.showLoading);
          } else {
            status = snapshot.data;
            if ((!status.isRefresh) ||
                (status.pageStatus == PageEnum.showContent &&
                    status.isRefresh)) {
              isShowContent = true;
            } e
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter 基于Bloc框架的封装 的相关文章

  • 使用 Android 前台服务为 MediaPlayer 创建通知

    问题就在这里 我目前正在开发一个应用程序 该应用程序必须提供 A 广播播放器 来自 URL 的 AAC 直播 还有一个播客播放器 来自 URL 的 MP3 流 该应用程序必须能够在后台运行 Android 服务 并通过以下方式向用户公开持续
  • 从 Throwable 获取错误代码 - Android

    我怎样才能从错误代码可投掷 https developer android com reference java lang Throwable html public void onFailure Throwable exception 我
  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • Android:“dp”到“px”转换?

    我正在读这篇文章 http developer android com guide practices screens support html http developer android com guide practices scre
  • Android libgdx 首选项丢失

    我在 Libgdx 引擎中创建了 Android 游戏 一段时间后 我注意到在某些应用程序杀手中杀死该应用程序后 或者如果我在 Android 设置中执行 强制关闭 操作 我保存到首选项中的游戏选项就会丢失 有办法防止这种情况吗 我从来没有
  • 设置从 Facebook 登录获取用户电子邮件 ID 的权限

    我在用着Facebook 3 0 SDK对于安卓 我必须实施Facebook登录 我正在访问用户的基本信息 例如姓名 用户 ID 但我也想访问用户的电子邮件 我浏览了很多博客和论坛 但不知道该怎么做 我正在使用我自己的 android 按钮
  • 如果我们使用后退按钮退出,为什么 Android 应用程序会重新启动?

    按住主页按钮并返回应用程序时 应用程序不会重新启动 为什么使用后退按钮会重新启动 如果我们使用后退按钮退出 有什么方法可以解决在不重新启动的情况下获取应用程序的问题吗 请帮忙 当您按下Home按钮 应用程序将暂停并保存当前状态 最后应用程序
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • 更新到材质 1.2.0 后,材质按钮上缺少圆角半径属性

    这是我的材质按钮代码
  • 带有自定义阵列适配器的微调器不允许选择项目

    我使用自定义阵列适配器作为微调器 但是 当在下拉列表中选择一个项目时 下拉列表保留在那里 并且微调器不会更新 这是错误行为 与使用带有字符串的通用数组适配器相比 这是自定义类 我错过了什么吗 谢谢 public class Calendar
  • Android 启动器快捷方式

    我制作了一个简单的打卡 打卡时钟应用程序 我想向用户添加在主屏幕上创建快捷方式的选项 该快捷方式将切换应用程序的状态 超时 超时 但我根本不希望此快捷方式在屏幕上打开应用程序 这是我的 setupShortcut private void
  • ROOM迁移过程中如何处理索引信息

    CODE Entity tableName UserRepo indices Index value id unique true public class GitHubRepo PrimaryKey autoGenerate true p
  • 调节麦克风录音音量

    我们正在尝试调整录音时的音量级别 麦克风似乎非常敏感 会接收到很多静电 我们查看了 setVolumeControlStream 但找不到传入其中来控制麦克风的流 将您的音频源设置为 MIC using MediaRecorder Audi
  • Android 设备上的静默安装

    我已经接受了一段时间了 在 Android 上静默安装应用程序是不可能的 也就是说 让程序安装捆绑为 APK 的应用程序 而不提供标准操作系统安装提示并完成应用程序安装程序活动 但现在我已经拿到了 Appbrain 快速网络安装程序的副本
  • 通过 ADB 拔出设备:“找不到服务”

    我必须测试我的应用程序在打瞌睡模式下的行为 根据文档 https developer android com training monitoring device state doze standby html testing doze 我
  • 使用 Espresso 检查 EditText 的字体大小、高度和宽度

    如何使用 Espresso 检查 EditText 的字体大小 高度和宽度 目前要分割我使用的文本 onView withId R id editText1 perform clearText typeText Amr 并阅读文本 onVi
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 在webview android中加载本地html文件

    我正在尝试在 android 的 webview 中加载 html 文件的内容 但是 它给了我 网页不可用错误 如果我尝试使用谷歌或雅虎等网站 它们就会起作用 html文件位于src gt main gt assests gt index
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想
  • 在 Android 中,如何将字符串从 Activity 传递到 Service?

    任何人都可以告诉如何将字符串或整数从活动传递到服务 我试图传递一个整数 setpossition 4 但它不需要 启动时总是需要 0 Service 我不知道为什么我不能通过使用 Service 实例从 Activity 进行操作 publ

随机推荐

  • decode函数_decode函数的妙用

    如下这张表 包含id和name两列 其中id是主键 name允许为空 存在两条记录 一条是 id 1 name a 另一条是 id 2 name SQL gt create table emp id number primary key n
  • MySQL-数据库读写分离(中)

    作者 小刘在C站 个人主页 小刘主页 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 学习两年总结出的运维经验 以及思科模拟器全套网络实验教程 专栏 云计算技术 小刘私信可以随便问 只要会绝不吝啬 感谢CSDN让你我相遇 前言
  • 基于iView-Cascader的多选级联选择器:cascader-multi

    前言 iview的cascader 多级联动虽然可以实现多级联动 但是不支持多选 这里 cascader multi 可以支持多选功能 实现效果 真实效果和他有出入 这是网上找的好看的动图 实现步骤 1 安装 npm i cascader
  • 求解集合A和集合B的差集

    求解集合A和集合B的差集 题目 已知集合A和B的元素分别用不含头结点的单链表存储 函数difference 用于求解集合A与B的差集 并将结果保存在集合A的单链表中 例如 若集合A 5 10 20 15 25 30 集合B 5 15 35
  • 关于vue-cli 3版本做的改动,没有static文件夹,本地文件应放在哪儿,如何引用

    2 x版本 3 0版本 原来放在static下的文件 现在应该放在public文件夹下 原来的请求数据的写法 现在的写法 总结 vue3 0 对脚手架的结构和静态文件的引用方式都进行了简化
  • 字符流字节流相互转换

    1 字节输出流转换成字符输出流 写到硬盘 创建字节输出流 FileOutputStream fis new FileOutputStream E document aaa txt 字节输出流转换成字符输出流 OutputStreamWrit
  • 使用Python办公自动化:将文本与图表写入到PPT中

    使用Python办公自动化 将文本与图表写入到PPT中 其中含有写入文本 表格及图表到PPT中的一些常用函数 还含有一些对单元格的操作函数 代码如下 import pptx from pptx util import Inches from
  • 模型视图投影矩阵传递

    11
  • mysql 批量插入更新数据 的 两种方法

    有时会有这种需求 当符合某种条件的数据存在时 去修改它 不存在时 则新增 也就是saveOrUpdate操作 当没有的时候就是插入语句 有数据的时候判断主键和唯一索引是否一样 一样那就按照 ON DUPLICATE KEY UPDATE写的
  • 安装raw文件下的apk文件

    有时候我们需要将一些小软件嵌在我们的软件里面 那么我们就可以将这些apk放在我们的raw或者assets文件下进行暂时存储 那么下面我们用放在raw文件下进行展示安装这一过程 首先我们要把我们需要隐藏我apk文件放在raw文件下 raw是在
  • Dirichlet distribution狄利克雷分布

    狄利克雷分布 狄利克雷分布 维基百科 是一组连续多变量概率分布 是多变量普遍化的B分布 为了纪念德国数学家约翰 彼得 古斯塔夫 勒热纳 狄利克雷 Peter Gustav Lejeune Dirichlet 而命名 狄利克雷分布常作为贝叶斯
  • [1036]Jadx gui(JAVA反编译工具)

    github https github com skylot jadx Jadx gui是一款JAVA反编译工具 一个简单轻巧的 DEX 到 Java 反编译器 可让您导入 DEX APK JAR 或 CLASS 文件并将其快速导出为 DE
  • 实时数据库,内存数据库,关系型数据库比较

    内存数据库 内存数据库就是将数据放在内存中直接操作的数据库 它利用内存的读写速度比磁盘快 内存是随机访问而磁盘是顺序访问这两个特点 将数据保存在内存中 在内存中模仿建立表结构和索引结构并针对内存特性进行优化 相比从磁盘上访问 内存数据库访问
  • 集成电路设计开源EDA软件yosys详解1:工具安装

    yosys为一套开源的针对verilog的rtl综合框架 从本节开始将详细介绍工具的使用 并详细对源代码进行分析和讲解 首先介绍一下工具的安装和使用 yosys的git网址为https github com YosysHQ yosys 下面
  • scanner中InputMisMatchException处理

    我们知道在使用scanner进行控制台输入时候 使用next 方法输出 但是这种方法存在弊端 比如你使用nextInt 方法 但是输入一个字符串类型 就会抛出InputMisMatchException异常 首先来看一下scanner在jd
  • crmeb Java2.0集群部署教程

    crmeb Java 宝塔单机nginx负载均衡集群部署 1 添加站点 此处不做详述 2 站点设置 网站目录 关闭防跨转攻击 3 站点设置 添加反向代理 4 站点设置 配置文件 此处因为是本地测试 使用IP 端口 需要在之前的项目同级目录下
  • 关于lua语言及热更新的研究一

    lua语言是个非常强大的语言 在一些游戏里进行一些热更新操作 下面就来分享一下这个lua语言的基本语法 我这里使用了Sublime Text2 ctrl B 运行 Ctrl 快捷键注释 下面是代码 print hello 单行注释 多行注释
  • 开发工程师的职场人生路

    新闻来源 伯乐在线 当你选择计算机或者电子 自控等专业进入大学时 你本来还是有机会从事其它行业的 可你毕业时执迷不悟 仍然选择了开发做为你的职业 真是自做孽不可活 不过 欢迎你和我一样加入这个被其它人认为是风光无限的 白领 吧 恭喜 你选择
  • 一次内存溢出事故 - 用 jprofiler 分析 gc root

    事情经过 事情是这样 公司项目是一个springcloud的微服务 服务每隔半个月就会发生一次频繁的fullGC 后来定位到是缓存不合理导致的 该缓存的key是一条条sql value是表名 这个缓存是用来干嘛呢 查了下他主要是分库组件sh
  • Flutter 基于Bloc框架的封装

    1 页面状态的bloc封装 1 1 定义一个基类用于bloc用于处理页面状态 状态主要有 loading error empty 以及展示内容的showContent enum PageEnum showLoading showError