Flutter:读取 BloC 状态的 Stream 数据,如果发生变化则重新渲染 UI

2024-02-14

我在使用 BloC 模式并结合使用 Dio 显示下载过程时遇到问题。

谁能告诉我,如何从 dio 获取 onUploadProgress 进入块状态并在状态内的进度更新时显示它?

目前我有 UI、BloC 和 API 类。 我需要将我的块传递到 API 调用中以下载文件,然后添加一个额外的事件,如下所示:

onReceiveProgress: (int received, int total) => {
          bloc.add(DownloadingImages((received / total) * 100))
        });

我还发现了一个大问题,但我不知道如何以干净的方式解决。如果我添加 DownloadingImage 状态并传递该过程,它不会更新 UI。发生这种情况是因为状态不会改变,而只是状态内部的值发生变化。BlocBuilder 无法识别状态内部的值变化,也不会重新渲染 UI...

所以我有另一个解决方法(BloC):

if (state is ImagesDownloading) {
          imageBloc.add(DownloadingImages2(state.progress));
          if (state.progress < 100) {
            return DownloadAndProgressWidget(
                done: false, progress: state.progress);
          } else {
            return DownloadAndProgressWidget(done: true, progress: 100);
          }
        } else if (state is ImagesDownloading) {
          imageBloc.add(DownloadingImages2(state.progress));
          if (state.progress < 100) {
            return DownloadAndProgressWidget(
                done: false, progress: state.progress);
          } else {
            return DownloadAndProgressWidget(done: true, progress: 100);
          }

  ImageState _downloadImages(String localPath) {
try {
  api.fetchLibraryImagesFromBackend(localPath, this);

  return ImagesDownloading(0);
  // Update the ui later from here to show progress.
  // Get the progress and pass it to downloading when 100% is reached return ImagesDownloaded state
} on ImagesError {
  return ImagesError("Couldn't download images.");
}

在用户界面中:

} else if (state is ImagesDownloading) {
          imageBloc.add(DownloadingImages2(state.progress));
          if (state.progress < 100) {
            return DownloadAndProgressWidget(
                done: false, progress: state.progress);
          } else {
            return DownloadAndProgressWidget(done: true, progress: 100);
          }
        } else if (state is ImagesDownloading) {
          imageBloc.add(DownloadingImages2(state.progress));
          if (state.progress < 100) {
            return DownloadAndProgressWidget(
                done: false, progress: state.progress);
          } else {
            return DownloadAndProgressWidget(done: true, progress: 100);
          }

我很想看到一个干净的解决方案来解决这个问题。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter:读取 BloC 状态的 Stream 数据,如果发生变化则重新渲染 UI 的相关文章

  • 在 flutter 中将 JSON 解析为 Map

    我收到后端的响应 measurements pm10 name pm10 value 20 8647 unit g m pm25 name pm10 value 20 8647 unit g m o2 name pm10 v
  • 带 NestedScrollview 的 RefreshIndicator

    我想要 2 个带有 ListView 的选项卡页共享一个 RefreshIndicator 但是 RefreshIndicator 必须具有 Scrollable 作为子级 TabBarView 则不然 因此我尝试为每个选项卡创建 2 个
  • 带有 ListTiles 和按钮行的 Flutter 下拉菜单

    我正在尝试构建一个自定义下拉菜单 如下所示 我已经成功地实现了ListTiles and Row of Buttons没有下拉菜单 但我不确定如何将所有内容嵌套在下拉菜单类中 这是我到目前为止所得到的 class HomePage exte
  • Dart2js 数字类型:确定值是 int 还是 double

    我正在尝试确定是否dynamic函数的参数实际上是一个int or a double我发现了令人惊讶的行为 至少对我来说 谁能解释一下这个输出 在 dartpad 上生成 foo value print value is int value
  • Dart 流 .asBroadcastStream 内存泄漏

    在我们的 Flutter 应用程序中 我们存在内存泄漏和流未关闭的情况 我们追踪源代码如下 Rx combineLatest asBroadcastStream RxDart的结果 combineLatest 是单订阅流 添加 asBroa
  • 如何更改 Flutter 中的默认字体系列

    如何更改应用程序的每个文本以使用特定字体 我可以使用以下命令单独更改它们TextStyle 但如何让我的应用程序默认使用特定字体 你能告诉我怎么做吗 您可以按照以下步骤更改 Flutter 应用程序的默认字体系列 1 将字体文件添加到项目文
  • 没有脚手架的 DefaultTabController?

    我正在尝试使用DefaultTabController在一些小部件的中间 所以我的TabBar不能在AppBar并且必须关闭一些小部件 所以我的问题是当我使用时TabBarView它崩溃了 这是一个 Flutter 示例的示例 但没有找到如
  • 如何从 BottomNavigationBar 中删除图标?

    我只需要 BottomNavigationBarItem 中的标签 但我找不到删除它们的方法 您可以隐藏标签showSelectedLabels and showUnselectedLabels设置为 false 但图标没有等效项 构造函数
  • 如何在flutter中绕过SSL证书验证?

    如何在flutter中绕过SSL证书验证 错误 握手异常 客户端中的握手错误 操作系统错误 CERTIFICATE VERIFY FAILED 自签名证书 handshake cc 345 您需要配置 HttpService 以使用自签名
  • NestedScrollView 与 ListView 中的粘性选项卡

    布局按预期工作 但以下情况除外 当我滚动一页时 第二页也会滚动 没有那么多 但足以掩盖第一个项目 我可以想象它与 NestedScrollView 有关 但我不知道如何继续 import package flutter material d
  • 如何知道 Dart 中的复选框或单选按钮是否被选中?

    我有一个复选框和一个单选按钮组 我想知道是否选中了该复选框以及选择了哪个单选按钮 我如何在 Dart 中做到这一点 假设我们有这样的 HTML
  • Flutter编译错误:必须返回非空值,因为返回类型“String”不允许为空 - displayString

    我的测试无法在我的 Flutter 项目引用的仅 Dart 项目中编译和运行 我收到以下错误消息 Failed to precompile test test pub cache hosted pub dartlang org analyz
  • 如何更改 ElevatedButton 颜色或阴影 Flutter

    我当时用的是RaisedButton直到 Flutter 弃用了它 我们不能再使用它了 有一个建议说 使用ElevatedButton相反 所以我尝试使用它 但我看不到类似的属性color elevation focusColor etc
  • 当我使用 ListView 时,ListTile OnTap 正在工作。但是当我使用 ListWheelScrollView 时它不起作用

    当我使用 ListView 时 ListTile OnTap 正在工作 但是当我使用 ListWheelScrollView 时它不起作用 我的意思是它不会被窃听 观点发生变化 但我似乎无法点击它 我在很多地方和链接中寻找解决方案 但仍然找
  • flutter 中 sqlite 中的多个参数

    我想知道如何将多个参数传递给 sqllite 中的原始查询 我的代码如下 query async get a reference to the database Database db await DatabaseHelper instan
  • 扑。应用程序不会崩溃并发送崩溃报告

    我已经集成了Firebase Crashlytics在我的应用程序中 我正在测试 Android 应用程序 我强迫崩溃来检查它 if true List arr throw arr 1 2 我的问题是应用程序不会崩溃 我只是在日志中得到这个
  • Flutter Firestore - 如何从文档字段中的文档引用获取数据?

    我正在构建一个具有不同问题类型的自学应用程序 现在 其中一个问题有一个包含文档参考列表的字段 在 Flutter 中 我有以下代码 Query
  • 如何在 flutter 中仅显示列表中的 5 项

    我想在 flutter 中显示一个列表 我正在使用listView 问题是我只想显示 5 个项目 我的意思是当用户向下滚动时我想从开始索引中删除并将另一个小部件添加到包含我的小部件的列表的末尾 但是当我这样做时ScrollView 不会停留
  • 用颤动画布在形状上切一个洞

    如何使用颤动画布在形状上 切一个洞 我有一组相当复杂的形状 看起来像现实世界的物体 该物体上有一个圆角矩形形状的孔 我真的很想从形状中减去 RRect 但我找不到任何有关如何执行此操作的信息 canvas clipRRect myRRect
  • 如何展平列表?

    我怎样才能轻松地压平List在达特 例如 var a 1 2 3 a b c true false true var b 1 2 3 a b c true false true 我该如何转向a into b 即变成一个List包含所有这些值

随机推荐

  • Sqoop 自由格式查询导致 Hue/Oozie 中的参数无法识别

    我正在尝试使用自由格式查询运行 sqoop 命令 因为我需要执行聚合 它作为 Oozie 工作流程通过 Hue 界面提交 以下是命令和查询的缩小版本 处理命令时 query 语句 用引号引起来 会导致查询的每个部分被解释为无法识别的参数 如
  • Flutter:垃圾收集 - 如何检查?

    在 Flutter 中 如何检查我是否正确释放 处置 所有内容 我正在构建一个应用程序 我感觉模拟器在一系列热重载后变得越来越慢 非常感谢您的回答 Dart 带有一个名为的调试器Observatory 它可以满足您所需的一切 从 CPU 内
  • 如何使用 Java 8 Streams 按对象属性分组并映射到另一个对象?

    假设我有一组碰碰车 它们的侧面有尺寸 颜色和标识符 汽车代码 class BumperCar int size String color String carCode 现在我需要将碰碰车映射到List of DistGroup对象 每个对象
  • HTML 5 音频当前位置

    将 HTML 5 与 DOM 一起使用 有没有办法获取用户正在播放音频文件的当前位置 并在稍后返回到该位置 See the HTML媒体元素 http dev w3 org html5 spec Overview html htmlmedi
  • 使用 **kwargs 将 **kwargs 参数传递给另一个函数

    我不明白下面的例子 假设我有这些功能 python likes def save filename data kwargs fo openX filename w kwargs lt 1 fo write data fo close pyt
  • Omniauth-facebook 登录无法正常工作

    当我尝试使用omniauth facebook 登录我的Rails 应用程序时 出现以下错误 这是在 localhost 3000 上测试时 不安全登录被阻止 您无法从不安全页面获取访问令牌或登录此应用程序 尝试将页面重新加载为 https
  • 命令设计模式 - 调用者是可选的吗?

    Command 设计模式中 Invoker 类是可选的吗 客户端需要实例化命令的具体命令和接收器 客户端是否总是需要实例化 Invoker 并将命令对象传递给 Invoker 对象 稍后 每当客户端需要执行命令时 客户端只需询问 Invok
  • FizzBu​​zz 列表理解

    当我学习 python 时 我正在摆弄一些不同的 fizzuzz 脚本 我发现这个效果很好 但我无法破译它是如何工作的 我知道正常的嘶嘶声如何与 for 循环和 if i 3 0 and i 5 0 一起工作 让我困惑的是如何 Fizz n
  • 批处理文件创建另一个批处理文件,如何在写入行时忽略命令?

    我正在编写的 Windows 批处理文件遇到了一些问题 我需要批处理文件将一些特定行写入另一个批处理文件 我一直使用的方法是 type NUL gt batchfile bat ECHO texttobewrittentofile gt g
  • Spark 2.x 的 Spark.sql.crossJoin.enabled

    我正在使用 预览 Google DataProc Image 1 1 和 Spark 2 0 0 为了完成我的一项操作 我必须完成笛卡尔积 从2 0 0版本开始 创建了一个spark配置参数 spark sql cross Join ena
  • Perl 抛出“参考键是实验性的”

    开发环境为OS X 10 10 3 Perl v This is perl 5 version 18 subversion 2 v5 18 2 built for darwin thread multi 2level with 2 regi
  • lambda 表达式中的枚举的编译方式不同;重载解析改进的结果是什么?

    在尝试 Visual Studio 2015 RC 时 我收到了先前工作代码的运行时错误 给定 lambda x gt x CustomerStatusID CustomerStatuses Active 它被传递给一个函数作为Expres
  • 在 Google Market 上发布一款应用的多个版本

    我有一个 Android 应用程序 我想用它来显示高质量的图像 然而 有许多不同的屏幕尺寸和比例 我知道有一些过滤器可以在市场中显示仅适用于小 中 大屏幕设备的应用程序 如果我将两种尺寸的图像放入 1 个应用程序中 应用程序的大小将会增加一
  • 在 RSA 下解码有效负载后未获得相同的会话密钥

    使用以下使用 crypto 库的函数对其进行编码和解码后 我没有获得相同的会话密钥 CryptoPP RSA PrivateKey RSA master privKey CryptoPP RSA PublicKey RSA master p
  • 启动/广播接收器重启问题

    这是一个相当常见的问题 但我失去了理智 我想我已经彻底满足了要求 我希望 BroadcastReceiver 在手机重新启动时执行某些操作 我的广播接收器 用于启动 public class BootReceiver extends Bro
  • Python 闭包和单元格(封闭值)

    Python 的机制是什么使得 lambda x for x in range 5 2 is 4 将 x 的副本绑定到每个 lambda 表达式以使上述表达式等于 2 的常用技巧是什么 我的最终解决方案 for template model
  • 如何让 Chrome 浏览器版本现在与 Python 一起运行? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在使用 selenium 运行一个应用程序 并且在运行 Chrome 驱动程序之前我想知道安装的实际 chrome 浏览器版本 以避免出
  • 如何在 LLVM 中将 genericValue 转换为 Value?

    我从事口译工作 我在内存中有一个变量的地址 我设法从它中获取实际值 并使用 LoadValueFromMemory 函数将其放入 genericValue 中 现在我需要创建一个 StoreInst 并希望将获得的值放入 Value 对象中
  • 带有 where 子句的 SQL 窗口函数?

    我正在尝试为用户关联两种类型的事件 我想查看所有事件 B 以及该用户在 A 事件之前的最新事件 A 如何实现这一目标呢 特别是 我正在尝试在 Postgres 中做到这一点 我希望可以在窗口函数中使用 where 子句 在这种情况下 我基本
  • Flutter:读取 BloC 状态的 Stream 数据,如果发生变化则重新渲染 UI

    我在使用 BloC 模式并结合使用 Dio 显示下载过程时遇到问题 谁能告诉我 如何从 dio 获取 onUploadProgress 进入块状态并在状态内的进度更新时显示它 目前我有 UI BloC 和 API 类 我需要将我的块传递到