Flutter:流已被收听[重复]

2023-11-26

我正在使用 BLoC 从 Firestore 加载预设对象。这是我的块模型:

class StatisticsBloc extends BlocBase {

  List<Preset> _presets;

  StreamController<List<Preset>> _presetsController = new StreamController();

  Stream<List<Preset>> get getPresets => _presetsController.stream.asBroadcastStream();

  StatisticsBloc() {
    print('init Statistics Bloc');
    _presets = [];
    Firestore.instance.collection('Presets').snapshots().asBroadcastStream().listen(_onPresetsLoaded);
  }

  @override
  void dispose() {
    print('Disposed Statistics Bloc');
    _presetsController.close();
  }

  void _onPresetsLoaded(QuerySnapshot data) {
    _presets = [];
    data.documents.forEach((DocumentSnapshot snap) {
      Preset preset = Preset.fromDoc(snap);
      _presets.add(preset);
    });
    _presetsController.sink.add(_presets);
  }
}

然后我像这样显示列表:

class StatisticsPage extends StatelessWidget {

  StatisticsPage() {
    print('Created StatisticsPage');
  }

  @override
  Widget build(BuildContext context) {
    final StatisticsBloc statisticsBloc = BlocProvider.of<StatisticsBloc>(context);
    final List<Preset> _ = [];

    print(statisticsBloc.getPresets.isBroadcast);

    return Scaffold(
      appBar: AppBar(
        title: Text('Statistics'),
      ),
      body: StreamBuilder(
        stream: statisticsBloc.getPresets,
        initialData: _,
        builder: (BuildContext context, AsyncSnapshot<List<Preset>> snapshot) {
          if (snapshot.hasData) {
            return ListView(
              children: snapshot.data.map((Preset preset) {
                print(preset.name);
                return new ListTile(
                  title: new Text(preset.name),
                  subtitle: new Text(preset.id),
                );
              }).toList(),
            );
          } else {
            Text('No Data');
            print('No Data');
          }
        }
      )
    );
  }
}

问题是,我展示了StatisticsPage在选项卡栏中,因此当我切换选项卡并返回到它时,它将被多次构建。第一次访问时它可以工作,但是当我切换选项卡并返回到它时,小部件会重建并且出现错误:Bad state: Stream has already been listened to.。我试图声明getPresets作为 BroadcastStream 进行流式传输,如您所见StatisitcsBloc但这行不通。

另外作为次要问题:是否有更好的方法来转型Stream<QuerySnapshot>我从 Firestore 得到的Stream<List<Presets>>?


很简单,看看行为主体类 from RxDart 库.

默认情况下,BehaviorSubject 是一个广播(又名热)控制器,以履行 Rx subject 契约。这意味着主题的流可以被多次收听。

所以,只需更改线路

StreamController<List<Preset>> _presetsController = new StreamController();

to

StreamController<List<Preset>> _presetsController = new BehaviorSubject();

并删除所有

.asBroadcastStream()

就是这样!

官方文档中是这样的不建议使用 asBroadcastStream()

创建流控制器的一种更危险的方法是通过 asBroadcastStream() 查看单订阅控制器。调用 asBroadcastStream 基本上告诉单订阅流用户想要接管流的生命周期管理。与 cancelOnError 订阅者结合使用,这很容易导致单流订阅永远不会关闭,从而泄漏内存或资源。

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

Flutter:流已被收听[重复] 的相关文章

  • Firebase 云函数被多次调用

    您好 当我没有检查 previous exists 时 我的 firebase 云函数会被多次调用 我收到多个推送通知 if event data exists return if event data previous exists re
  • TextFormString 验证器的多行字符串

    In my TextFormString对于密码字段我有validator返回一个字符串 问题是这样的String太长了 不适合屏幕 我想让它成为多行 但我找不到如何做到这一点 我尝试设置宽度Container this TextFormS
  • 使用 Docker-Compose 运行 Google Firestore 模拟器

    我正在尝试运行我的 Node 项目以及 Firestore 模拟器docker compose在本地开发环境中 我的 Node 项目有一个 Dockerfile 如下所示 WORKDIR app ADD package json RUN n
  • 更改 Flutter Web 应用程序中的屏幕尺寸

    我正在使用 Flutter 构建一个 Web 应用程序 但我想模仿 iPhone 屏幕视图 我知道调整窗口大小可以达到这种效果 但是有没有办法将所有内容包装在手机屏幕图形的框架中 或者更改 MaterialApp 的尺寸 使其包含在手机屏幕
  • Flutter:如何在 Web 视图中启用手势?

    我想在 Flutter 中通过捏合和张开来放大我的网页视图页面 我在网上做了一些研究 我在某处发现了这个 虽然 WebView Android 和 UIWebView iOS 内置了捏合和缩放功能 但它们需要 打开 在Android中 插件
  • Flutter Firestore 查询嵌套子集合

    我正在尝试查询 Firebase 中的子集合 但我总是得到一个空列表 这是我的查询 Firestore instance collection messages where idFrom isEqualTo userID snapshots
  • FlutterJNI.loadLibrary 多次调用(FlutterJNI.prefetchDefaultFontManager、FlutterJNI.init)

    更新 Android Studio 和 flutter 和 kotlin 后 我收到此警告 错误 如何解决或者我可以忽略而不会导致错误 先感谢您 W FlutterJNI 23046 FlutterJNI loadLibrary calle
  • 导航到新屏幕时状态栏颜色

    我在我的中使用以下build 第一个屏幕更改状态栏颜色的方法 效果很好 1st screen s build method SystemChrome setSystemUIOverlayStyle SystemUiOverlayStyle
  • Firebase blaze 计划是否有 Spark 计划配额?

    Firebase Blaze 计划是否有 Spark 计划免费配额 我想将 Firebase 与 google 云平台一起使用 但仍希望有免费托管限制 我不关心其他服务 因为我不使用它们 更新 2018 03 13 Blaze 计划中的项目
  • Metro 遇到错误:尝试解析模块“firebase”时

    启动模拟器后出现此错误 我在图像下添加代码并在终端上出错 这是我的 App js 文件模拟器上的错误图像 https i stack imgur com pffip png 错误 错误 尝试解析模块时firebase从文件 Users ca
  • Flutter,在第1页时无法点击第2页

    我创建了一个PageView有 3 个页面 每个页面都有一个按钮 单击每个按钮应滚动到该页面 如果在第 2 页 则上一页和下一页都是可点击的 如果它位于第 3 页 则可以单击上一页 如果是在第一页 下一页不可点击 更新 当在 page1 上
  • 删除用户帐户时发生 firebase 错误“此操作很敏感,需要最近的身份验证。在重试此请求之前请重新登录。”

    当我想删除应用程序中的 Firebase 用户帐户时 如果用户最近登录过 则操作会正常通过 但在一段时间后 如果我尝试删除用户 则会收到此错误 此操作很敏感 需要最近的身份验证 在重试此请求之前请重新登录 通常情况下 firebase会自动
  • 在 Swift 应用程序中从 Excel 文档读取数据

    我有一个 Excel 文档 其中包含一些表格和大量数据点 我想从中读取内容以填充一些 UICollectionView 单元格和我的应用程序的其他部分 就像是 Country Temperature Cost Spain 23 80 Fra
  • Flutter firestore插件无法通过where和isEqualTo的组合来获取数据

    我在 Firestore 中有一个名为 trips 的集合 数据格式是这样的 我正在尝试使用下面的代码访问该集合的文档 第一种方式 try Firestore instance collection trips where createdB
  • Flutter 为什么环绕行时 Wrap 不起作用?

    我试图将一些内容包装在 flutter 中 但没有成功 我发现我无法像使用芯片或文本小部件那样换行 有人知道为什么吗 这是三组 Rows 每组都有一个图标和一个文本 并排放置 但在较小的屏幕中它会溢出 因为没有足够的空间 宽度 我希望当当前
  • 显示菜单位置 Flutter

    我有一个 GridView 小部件 其中包含一些用 GestureDetector 包裹的 GridTiles 当我长按它时 尝试显示一个菜单以删除 GridTile 一切都很好 除了我希望从我拥有的点开始显示该菜单点击的不是应用程序的顶部
  • 如何使用多重身份验证 - firebase?

    我有一个注册屏幕 其中包含 用户名 电子邮件 电话号码 密码 在本例中 我使用电话号码身份验证来验证号码 因此在用户验证他的号码后 我将他的数据保存到 firebase DB 中 所以在那之后 我将下摆导航到登录屏幕 应该包含电子邮件 密码
  • Firestore:发现名称 isText 的 getter 冲突

    我试图查看类似的问题 但它们对我来说没有用 我有一堂课 data class TextMessage val text String override val time Date override val senderId String o
  • Dart 是单线程的,但为什么它使用 Future 对象并执行异步操作

    在文档中 Dart 是单线程的 但为了一次执行两个操作 我们使用与线程相同工作的 future 对象 使用Future对象 futures 来执行异步操作 如果 Dart 是单线程的 那么为什么它允许执行异步操作 Note 异步操作是并行操
  • Flutter:未捕获的 ReferenceError:firebase 未定义

    我在 Flutter Web 应用程序中使用 Firebase 服务 但在加载 Firebase 脚本时遇到问题 当我使用扑动时运行 d chrome我看到有错误的空白页面 重新加载页面后加载正常 当我进行 flutter build we

随机推荐

  • 检查的保护参数包是否会导致程序格式错误?

    我不止一次 甚至在 SO 上 看到过这样的代码 template
  • 将图像转换为字符串(用于 Symfony2 Response)

    我正在 Symfony2 中构建一个用于调整图像大小的脚本 因为我希望能够使用标准 Symfony2 响应系统 headers array Content Type gt image png Content Disposition gt i
  • 在 C# 中保持 http 连接处于活动状态?

    如何在 C 中保持连接处于活动状态 我做得不对 我是否应该创建一个 HttpWebRequest 对象并使用它来访问我需要的任何 URL 除了 HttpWebRequest Create 静态方法之外 我没有看到访问 url 的方法 如何创
  • 使用 TypeScript,我可以输入 getProperty 的柯里化版本吗

    示例来自https www typescriptlang org docs handbook advanced types html function getProperty
  • 如何在具有 MySql 后端的 Django 中为 TextField 指定索引?

    我在 Django 中定义了一个模型 它 部分 看起来像这样 class Info models Model information models TextField max length 32 null True db index Tru
  • 使行号不可复制

    我正在努力添加行号支持Rainbow 一个语法荧光笔 但我不知道如何使行号不可复制 禁用选择通过user select none 使一个元素无法突出显示 但您仍然可以通过突出显示它周围的文本然后复制来复制其文本 这最终会复制行号和代码 这是
  • 什么是 WCF 代理以及它们有什么用处?

    我最近一直在自学 WCF 甚至使用 WCF 编写了一些生产服务 但直到最近我才真正深入了解 WCF 我知道 代理 设计模式的想法 我还知道 ASMX Web 服务中代理的使用 但我很难理解 WCF 代理是什么以及它是如何使用的 我已经彻底阅
  • 在同一页面上绘制多个ggplot2

    我有一个工作循环 它可以生成并保存目录中保存的每个文件的单独绘图 我想将所有返回的图绘制在单个文件中作为多个页面上的 2x2 网格 但无法做到这一点 我尝试将绘图对象保存在列表中 pltList lt list pltList for f
  • 在不同的配置中引用不同的程序集

    在提问之前 我阅读了this and this线程 那里没有帮助 我正在使用 Visual Studio 2003 这是我的雇主强制要求的 但我想 VS 更高版本的答案也可能有用 因此 假设我有两个 Net 项目 A 这是一个类库 B 这是
  • CXF RESTful 客户端 - 如何信任所有证书?

    我写过 Jersey RESTful 客户端 它使用了DumbX509TrustManager 和 HostnameVerifier 信任我们实验室系统上的所有 SSL 证书 以便更轻松地处理自签名证书 ClientConfig confi
  • 如何在 Safari 和 NSTextView 等 Web 视图中突出显示搜索结果 showFindIndicatorForRange:

    在 Safari 和 OSX 上的 NSTextView 中 搜索结果可以用带有一点动画弹出的亮黄色框突出显示 有没有什么方法可以在网络视图中做到这一点 而无需自己编码 我确实找到了一种方法来做到这一点 See 显示范围查找指示器
  • 四叉树最近邻算法

    我已经实现了 n 个点的四叉树结构以及返回给定矩形内的点数组的方法 我似乎无法找到一种算法来有效地找到最接近另一个给定点的点 我错过了一些明显的事情吗 我认为递归解决方案是正确的方法吗 我正在使用 Objective C 但伪代码就可以了
  • 之间的区别?

    每次我必须为带有 IIS7 的 ASP NET 添加处理程序或模块时 说明总是告诉我将其合并为两个部分 system web and system webserver
  • 尝试创建新的 Google API 项目时出现 FAILED_PRECONDITION

    我在尝试为 Google API 创建新项目时遇到错误https code google com apis console 我希望错误是暂时的 但我已经有几周无法创建新项目了 该错误似乎已发生变化 因为它过去包含服务器 IP 信息和许多其他
  • PHP - 摆脱大写撇号

    我试图摆脱卷曲的撇号 我想是从某种富文本文档粘贴的撇号 但我似乎遇到了障碍 下面的代码对我不起作用 word Today s search array 8222 8220 146 replace array word str replace
  • R 中 data.frame 长度不同的列表列表

    我在 SO 中读到了很多关于将列表列表转换为 df 的答案 但是 我注意到它们的列表长度 在主大列表内 都是相同的 我有一个不同的案例 h1 lt list USA c 10 13 17 11 RUSSIA NULL BRAZIL NULL
  • 如何更改禁用的文本框的字体颜色?

    有谁知道哪个属性设置禁用控件的文本颜色 我必须在禁用状态下显示一些文本TextBox我想将其颜色设置为黑色 NOTE 请参阅下面 Cheetah 的答案 因为它确定了使该解决方案发挥作用的先决条件 设置BackColor of the Te
  • 在 PHP 循环中构建逗号分隔的字符串

    大家好 我需要这样做 我有一个共同的循环 foreach stuffs as stuff echo stuff 假设 stuff 是我拥有的 mysql 表的 id 并且我不想在下一个结果中显示 所以我想构建一个像这样的字符串 1 23 5
  • 有人可以解释互斥体及其使用方法吗?

    我读了一些有关互斥体的文档 但我唯一的想法是它有助于防止线程访问已被另一个资源使用的资源 我从代码片段中获取并执行 效果很好 include
  • Flutter:流已被收听[重复]

    这个问题在这里已经有答案了 我正在使用 BLoC 从 Firestore 加载预设对象 这是我的块模型 class StatisticsBloc extends BlocBase List