在 StreamBuilder 中使用选择器(提供程序)时重建不必要的小部件

2023-12-26

我正在使用一个Selector当 Bloc 中的数据发生更改时会重建。这很好,但是当数据发生变化时,它会重新加载整个树,而不仅仅是选择器内的构建器。

就我而言,选择器位于 StreamBuilder 内。我需要这个,因为流已连接到 API。因此,在流中我正在构建一些小部件,其中之一是选择器。Selector重建依赖于流中的数据的小部件。

这是我的代码。我不希望一次又一次地调用 Stream。 Stream 也会被调用,因为build每次选择器小部件重建时都会被调用。

main.dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:provider_test/data_bloc.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MultiProvider(providers: [
        ChangeNotifierProvider<DataBloc>(
          create: (_) => DataBloc(),
        )
      ], child: ProviderTest()),
    );
  }
}

class ProviderTest extends StatefulWidget {
  @override
  _ProviderTestState createState() => _ProviderTestState();
}

class _ProviderTestState extends State<ProviderTest> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          Text("Outside Stream Builder"),
          StreamBuilder(
            stream: Provider.of<DataBloc>(context).getString(),
            builder: (_, AsyncSnapshot<String> snapshot) {
              if (snapshot.hasData) {
                return Column(
                  children: <Widget>[
                    Text("Widget Generated by Stream Data"),
                    Text("Data From Strem : " + snapshot.data),
                    RaisedButton(
                        child: Text("Reload Select"),
                        onPressed: () {
                          Provider.of<DataBloc>(context, listen: false).changeValue(5);
                        }),
                    Selector<DataBloc, int>(
                        selector: (_, val) =>
                            Provider.of<DataBloc>(context, listen: false).val,
                        builder: (_, val, __) {
                          return Container(
                            child: Text(val.toString()),
                          );
                        }),
                  ],
                );
              }

              return Container();
            },
          )
        ],
      ),
    );
  }
}

块.dart

import 'package:flutter/foundation.dart';

class DataBloc with ChangeNotifier {

  int _willChange = 0;

  int get val => _willChange;

  void changeValue(int val){
    _willChange++;
    notifyListeners();
  }

  Stream<String> getString() {
    print("Stream Called");
    return Stream.fromIterable(["one", "two", "three"]);
  }

}

另外,如果我删除 StreamBuilder 那么Selector行为就像它应该做的那样。为什么 StreamBuilder 在这种情况下会重建?有什么办法可以防止这种情况发生吗?


根据您共享的代码,您可以在 initState 上创建 Stream 的侦听器,该侦听器更新保留最新版本数据的变量,然后使用该变量填充您的小部件。这样,Stream 将仅在 Widget 第一次加载时订阅,而不是在重建时订阅。我无法直接测试它,因为我没有你的项目。但请尝试一下。

基于您的代码的代码示例

class ProviderTest extends StatefulWidget {
  @override
  _ProviderTestState createState() => _ProviderTestState();
}

class _ProviderTestState extends State<ProviderTest> {
  String _snapshotData;

  @override
  void initState() {
    listenToGetString();
    super.initState();
  }

  void listenToGetString(){
    Provider.of<DataBloc>(context).getString().listen((snapshot){
      setState(() {
        _snapshotData = snapshot.data;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          Text("Outside Stream Builder"),
          Column(
            children: <Widget>[
              Text("Widget Generated by Stream Data"),
              Text("Data From Strem : " + _snapshotData),
              RaisedButton(
                child: Text("Reload Select"),
                onPressed: () {
                  Provider.of<DataBloc>(context, listen: false).changeValue(5);
                }
              ),
              Selector<DataBloc, int>(
                selector: (_, val) =>
                  Provider.of<DataBloc>(context, listen: false).val,
                builder: (_, val, __) {
                  return Container(
                    child: Text(val.toString()),
                  );
                }
              ),
            ],
          )
        ],
      ),
    );
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 StreamBuilder 中使用选择器(提供程序)时重建不必要的小部件 的相关文章

  • 日期时间时区反序列化

    我为我的应用程序开发了一个 Rest API 它以以下格式发送到应用程序日期2018 09 07T17 29 12 02 00 我猜 2 00 代表我的时区作为一个对象的一部分 在我的 Flutter 应用程序中 一旦我反序列化接收到的对象
  • 使用 Dio download 下载大视频会导致内存不足

    我正在尝试制作一个具有从 url 下载视频功能的 flutter 应用程序 并且视频预计会很大 至少 1 到 2 小时的 720p 我为此使用了 Dio 但它尝试将完整的视频存储在 RAM 中 这会导致内存不足错误 这是我使用的代码 有什么
  • Flutter:设置AppBar的高度

    我怎样才能简单地设置高度AppBar在颤振中 栏的标题应保持垂直居中 即AppBar 您可以使用首选尺寸 https api flutter dev flutter widgets PreferredSize class html clas
  • Flutter sqflite 插入列表

    我正在尝试将列表插入到 flutter 中的 sql 数据库中 但我不知道该怎么做 有人可以帮助我吗 当我初始化 mi 数据库时 我有这个 Directory documentsDirectory await getApplicationD
  • cmd:找不到服务:活动#Error:ADB 在 flutter 中退出,退出代码为 1

    更新 android studio 后 我运行我的 flutter 程序 错误表明 Launching lib main dart on AOSP on IA Emulator in debug mode Running Gradle ta
  • Flutter Google 日历 Api 列表事件

    Flutter Google 日历 API v3https pub dartlang org packages googleapis https pub dartlang org packages googleapis Works Futu
  • 将下拉项定位在按钮 Flutter 下方

    我正在拼命寻找一种方法将项目放置在按钮下方 正如您所看到的 如果先前选择了第一项 则列表顶部与按钮处于同一级别 但是 如果我之前选择了最后一项 则下拉列表的位置使列表在按钮级别结束 这不是我想要的行为 我希望它始终位于第一个屏幕截图中 即使
  • 在flutter中从cloud_firestore删除文档

    我正在返回一个streamBuilder在streamBuider内部 它返回一个小部件 现在我已经用可忽略的方式包装了一个小部件 以便我可以从 cloud firestore 的集合中删除该文档 showingTheSelectedDat
  • SingleChildScrollView 内垂直居中的小部件

    我是 Flutter 新手 所以我通过制作一个简单的表单来训练自己 我意识到当我在 iPhone 上调试时 虚拟键盘触发了一个错误 A RenderFlex overflowed by 29 pixels on the bottom 我通过
  • 将元素大小调整为屏幕宽度/高度的百分比

    是否有一种简单的 非 LayoutBuilder 方法来调整元素相对于屏幕尺寸 宽度 高度 的大小 例如 如何将 CardView 的宽度设置为屏幕宽度的 65 不能在里面完成build方法 显然 因此必须推迟到构建后 是否有一个首选的地方
  • 如何在不影响背景内容的情况下弯曲底部导航栏角?扑

    我创建了一个带有颤动的自定义底部导航栏 但我仍然可以看到白色填充了弧角后面的背景 我想看看背景内容 这就是底部导航栏的样子 正如你所看到的 角落里充满了白色 这是我的底部导航栏代码 bottomNavigationBar Container
  • flutter:如果禁用应用程序委托调配,则 UIApplicationDelegate 收到的远程通知需要转发到 FIRAuth

    当我想在 firebase 中使用短信验证时 该应用程序仅在 iOS 上失败 APN 证书已在 firebase 上配置并且FirebaseAppDelegateProxyEnabled是 NOInfo plist 在 verifyPhon
  • 无法使用 flutter 访问移动应用程序中 iframe 内的 Webview 元素

    我正在尝试使用 flutter 访问移动应用程序中的登录表单 网络视图 来编写我的自动化测试用例 原生元素是可以访问的 但是当我尝试访问框架内的 web 视图上的元素时 它不允许我访问该元素 如果有人遇到类似问题 请提供帮助 我尝试使用以下
  • Flutter-iOS 当应用程序更新/重新编译时存储的图像丢失

    嗨 请原谅我的英语 也是 flutter iOS 的新手 我在 iOS 上有一个关于 flutter 的应用程序 用户可以从他们的相机和图库中拍摄照片和视频 我正在使用 image picker 包 这没有问题 然后我将其保存在在其应用程序
  • 有没有办法将标签文本垂直放置在 flutter Charts_flutter: ^0.8.1

    我正在尝试使用创建一个图表charts flutter 0 8 1颤振中的包 这是我的代码 我已经添加了SlidingViewport and PanAndZoomBehavior in behaviour charts BarChart
  • 在应用程序开发中缩放字体大小的理想方法是什么?

    我知道这个问题可能听起来有点奇怪 我是 Flutter 开发的新手 在使我的应用程序响应时 我在缩放文本时总是遇到问题 如果我保持字体大小不变 例如 10 或 20 有时在高分辨率设备上看起来太小 在小手机上看起来太大 然后我尝试根据屏幕尺
  • 如何在 Flutter 中显示 Android Activity?

    我目前正在开发一个在 flutter 中使用 Google Maps Api 的应用程序 由于支持不完整 我只能使用静态地图 点击它会导致 Android 活动没有用 我需要的是一张地图 我可以在其中搜索位置并向该位置添加标记 那么是否可以
  • 最终变量是否有性能提升? [复制]

    这个问题在这里已经有答案了 是的 标题 写作时有什么区别 显然除了设计之外 final or not 对于 Flutter 中构建的应用程序 final 和 const 关键字都可以提高性能并减少 APK 大小 常量 Widget具有不同的
  • 在 Dartlang 中下载大文件

    我需要使用 dartlang 从浏览器下载较大的文件 我一直在使用 data uri 来下载 但已经达到了该方法的大小限制 想知道最好的方法是什么 我研究了使用 HTML5 文件系统 API 但它已被弃用 显然在大多数浏览器中从未真正实现过
  • 当 AppLifeCycleState.detached 被调用时?

    I ve class PageState extends State

随机推荐

  • Blazor 服务器和 SignalR 以及 Azure AD

    我正在使用 Blazor Server Net 5 开发一个 Web 应用程序 在我的索引页面上 我需要显示通过 Azure AD 登录网站的在线用户数量 首先 用户访问 Web 它会被重定向到 Azure AD 一旦用户在 AD 中通过身
  • 查询地理位置附近的事物?

    我有一个查询试图在某个地理位置内查找内容 但它返回的结果有点 奇怪 我之前发布过此帖子 社区帮助我找到了我需要的公式 MySQL中经纬度查询 https stackoverflow com questions 4687312 queryin
  • NSArray(和其他 Cocoa 类型)@property 值

    在调试同事编写的代码的过程中 我偶然发现了以下让我感到困惑的内容 NSMutableArray array NSMutableArray array NSUInteger arrayCount array count 为什么这有效 它也适用
  • 如何让单个小部件在 Django 中设置 2 个字段?

    我得到了一个包含 2 个字段的模型 纬度和经度 现在它们是 2 个 CharField 但我想制作一个自定义小部件以在管理中设置它 正在考虑显示 Google 地图 然后获取标记的坐标 但是我可以用 1 个小部件 单个地图 来设置 2 个不
  • Python中isnumeric和isdecimal的区别

    字符串的 isnumeric 和 isdecimal 函数有什么区别 https www tutorialspoint com python3 python strings htm https www tutorialspoint com
  • 取自 .mp4 的 H.264 解码器配置记录的格式

    我正在检查从 Android 设备录制的 mp4 视频文件中包含的解码器配置记录 有些设备的解码器配置记录中写入了奇怪或不正确的参数 以下是来自 Galaxy Player 4 0 的示例 该示例是不正确的 DecoderConfigura
  • MYSQL 和 Phpmyadmin 没有显示相同的数据库

    我正在运行 XAMMP 我通过 Homebrew 安装了 MYSQLbrew install mysql 然而当我跑步时show databases 登录后在终端中mysql u root 我明白了 Database information
  • 查找 PHP 服务器的可用端口

    PHP 5 4 带有一个用于开发目的的内置服务器 这是我已经等待了几个月的事情 因为到目前为止 我不得不编写一个 PHP 脚本来侦听传入的连接并处理它们 因为我不想惹麻烦 以及安装实际服务器的开销 我要担心的主要事情是 如何分配端口 在我的
  • 如何将现有的nodejs服务器应用程序连接到Azure SQL数据库

    任何人都可以请建议 我有一个在 azure 上运行的现有 Nodejs 服务器 在 Linux 上运行节点 10 14 项目代码位于 github 上 当我推送更改时 它们会自动推送到 azure 我已经通过Azure门户设置了数据库服务器
  • 为什么 Facebook 淹没了我的网站?

    每个半小时我都会收到大量的请求http www facebook com externalhit uatext php http www facebook com externalhit uatext php 我知道这些请求意味着什么 但这
  • Django url 调试器

    我正在开发一个 Django 应用程序 随着时间的推移 URL 不断增长 我现在有很多这样的视图 由于我做了一些改变 一个视图开始出现故障 当我尝试获取时http example com foo edit profile http exam
  • 将 C 字符串转换为二进制表示形式

    在 ANSI C 中 我们如何将字符串转换为二进制字节数组 所有的谷歌搜索和搜索都给了我 C 和其他而不是 C 的答案 我的一个想法是将字符串转换为 ASCII 然后将每个 ASCII 值转换为其二进制 呃 我知道这是最愚蠢的想法 但我不确
  • React-Native-Video -> 如何保存视频

    我目前正在使用react native video 并通过该包播放HLS 视频流 有人知道如何将视频下载到手机图库吗 查看该包没有任何方法 并且想知道是否还有另一个包可以使用 Thanks 在我的应用程序中 我使用以下命令下载视频RNFS
  • Azure 中的 Web 应用服务每天重新启动多次,日志中没有错误

    我正在 Azure Web 应用服务中运行 ASP Net Web API 2 应用程序 Web 服务每天会重新启动多次 5 6 次 而不会提前发出任何通知或错误消息 我扩展到两个实例 始终不依赖于负载 并且两个实例同时重新启动 我确实设置
  • Sql 服务器表分区 - 我可以跨服务器分配表吗?

    我读过很多网站 指南等 另请注意 我无法测试我所要求的内容 因为没有两台计算机 表分区简单地意味着表被逻辑划分 这样特定范围仅由特定分区处理 从而减少负载并允许并行性 提到分区位于不同的硬盘上 但从未提到分区位于不同的计算机上 那可能吗 例
  • 每行具有不同标准差的 Numpy 数组

    我想要一个NxM矩阵 其中每行中的数字是从不同正态分布生成的随机样本 相同mean但标准差不同 以下代码有效 import numpy as np mean 0 0 same mean stds 1 0 2 0 3 0 different
  • Kendo UI 中单击自定义工具栏时如何调用函数?

    我想创建一个自定义工具栏 这是我的代码 toolbar text Go to Add User Page className k grid custom imageClass k add function createUser alert
  • 不包括程序集版本的 WCF 扩展

    正如所讨论的here http marcgravell blogspot com 2009 11 controlling wcf protobuf net at html 我正在尝试添加 WCF 端点扩展 我已经让它工作了 但我需要包含完整
  • 哪个是支持代码重新加载的简约 python wsgi 开发服务器? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 据我所知 wsgiref 无需重新加载代码 CherryPy 不仅仅是服务器 mod wsgi 所有 apache 开销 Paste https
  • 在 StreamBuilder 中使用选择器(提供程序)时重建不必要的小部件

    我正在使用一个Selector当 Bloc 中的数据发生更改时会重建 这很好 但是当数据发生变化时 它会重新加载整个树 而不仅仅是选择器内的构建器 就我而言 选择器位于 StreamBuilder 内 我需要这个 因为流已连接到 API 因