首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么当ListView.builder包含在列中时,context.select只更新UI

当ListView.builder包含在列中时,context.select只更新UI的原因是因为context.select是基于InheritedWidget机制的,而InheritedWidget在widget树中传递数据的范围是有限的。

在Flutter中,widget树中的每个节点都可以有一个InheritedWidget作为它的祖先节点,该祖先节点负责传递数据给它的子节点。当数据发生变化时,只有祖先节点的数据发生改变,InheritedWidget才会通知其子节点重新构建。

当ListView.builder包含在列中时,ListView.builder是一个具有动态子节点的widget,它的子节点数量是根据列表数据的长度动态生成的。而列(Column)是一个具有静态子节点的widget,它的子节点数量是固定的。

当使用context.select去选择特定的数据并更新UI时,context.select只会监听它所在的当前widget的祖先节点中的InheritedWidget数据的改变。由于ListView.builder是动态生成的子节点,它的祖先节点中的InheritedWidget并没有改变,因此context.select不会触发更新UI的操作。

解决这个问题的方法是将InheritedWidget放在ListView.builder之上的祖先节点中,以保证ListView.builder所在的位置能够监听到InheritedWidget的数据改变。可以考虑将ListView.builder所在的列(Column)包裹在一个InheritedWidget的子节点中,这样当InheritedWidget的数据发生变化时,context.select就可以监听到并更新UI。

关于InheritedWidget的更多信息和使用示例,可以参考Flutter官方文档:InheritedWidget

同时,腾讯云提供了丰富的云计算产品,可以满足各种开发需求。具体推荐的产品和介绍链接地址可以根据具体场景和需求来选择,以下是一些常用的腾讯云产品:

  1. 云服务器(CVM):提供可扩展的计算能力,支持多种操作系统,适用于部署应用程序和托管网站。详情请参考:腾讯云云服务器
  2. 云数据库 MySQL 版(CDB):可提供稳定可靠、可弹性扩展的数据库服务,适用于各种规模的应用。详情请参考:腾讯云云数据库 MySQL 版
  3. 腾讯云对象存储(COS):提供安全、高可用的对象存储服务,适用于图片、音视频、文档等多媒体文件的存储和管理。详情请参考:腾讯云对象存储

这些产品可以帮助开发人员构建稳定、可靠的云计算应用,并提供了丰富的功能和性能优势。具体选择适合自己需求的产品可以参考腾讯云官网的相关文档和产品介绍。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Flutter 刷新页面:通过下拉刷新提升用户体验

当用户下拉页面,这个函数被调用,它的任务是拉取新的数据并更新我们应用状态。很重要的一点是,这个函数返回 Future 来保持刷新指示器可见,直到新数据被下载且页面被更新。...在 RefreshIndicator 挂件的 onRefresh 回调会执行这个方法,确保状态更新,并且 UI 上映射了新数据。...数据被拉取,setData 使用新数据来更新 UI。 实现 Refresh Indicator 逻辑 Flutter 的 RefreshIndicator 在用户获取数据过程中提供视觉反馈。...这在微调 pull-to-refresh 功能特别有用,因为我们可以快速迭代设计和功能。 为了充分利用热加载,请使用模块化构建代码,在不同函数或者类中分离获取刷新数据逻辑和更新 UI。...处理复杂的数据和状态,考虑使用流 streams 或者 FutureBUilder 挂件来更新 UI新数据反应可用时。这保证在应用程序当前状态, UI 还是同步的,即使数据被拉取和更新

22510

FlutterDojo设计之道—状态管理之路(七)

通过setState来更新数据,其原理就是在Future完成之后,使用setState刷新UI。核心代码如下所示。 获取数据。...占据整个UI界面,这样其实最简单也不太会影响效率。...List内容固定时,不需要刷新整个List,只需要更新改变的Item。...如果List的数据会发生改变,则Selector的使用则会存在问题,举个例子,我们大部分APP的List使用场景都包含刷新数据、加载分页数据这样两个过程,所以List的数据源是一直在变化的,首页数据加载...列表数据不固定时,刷新整个List 列表数据固定时,刷新更新的Item 有了这样的思路,就可以理解前面的Model为什么需要一个shouldListRebuild变量了吧,剩下的代码如下所示。

93510
  • Flutter 应用性能优化最佳实践

    因此,将 setState() 的调用转移到其 UI 实际需要更改的 Widget 子树部分。...如果改变的部分仅包含在 Widget 树的一小部分,请避免在 Widget 树的更高层级调用 setState()。 重新遇到与前一帧相同的子 Widget 实例,将停止遍历。...1.2 仅需要的时候才应用效果 由于代价很大,请谨慎使用效果。一些效果的背后调用了性能代价很大的 saveLayer() 方法。 为什么 saveLayer 代价很大?...将内容绘制到离屏缓冲区可能会触发渲染目标切换,这些切换在较早期的 GPU 特别慢。 一些在使用效果的通用规则: 能不用 Opacity Widget,就尽量不要用。... 120fps 的设备普及之后,便需要在 8ms 之内完成每一帧的渲染来保证流畅平滑的体验。 如果你想弄明白为什么 60fps 会带来平滑的视觉体验,请看视频 Why 60fps2.

    2.3K20

    Flutter 侧滑栏及城市选择UI的实现方法

    Flutter简介 Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。...SliderBar 实现 侧边是一个支持手势滑动的SliderBar,一个自定义的StatefulWidget.可以观察到,手势在侧边滑动,中央显示选中的标签....(color: Colors.orange, fontSize: 40.0)))), slide ], ); 手势数据处理 Flutter 提供 手势处理类 GestureDetector,手势开始滑动是更新中央...{"A":[{"name":"澳门","id":"***","fullWord":"aomen","first":"am","isShow":"true"}]} 数据解析使用到dart:convert,...${json.encode(name)}':'null'}}'; } } 将首字母,城市数据存入CityList里,并将首字母列表传入到SliderBar,记录字母索引所在的位置 class CityListUtils

    2K31

    Flutter响应式编程:Streams和BLoC

    您将某物插入管道,它会在管道内流动并从另一端流出。...只要至少有一个活动侦听器,Stream就会开始生成事件,以便每次都通知活动的StreamSubscription对象: 一些数据来自流, 一些错误发送到流流关闭。...换句话说,UI组件应该关心UI事物而不关心业务, 依赖Streams独家使用输入(Sink)和输出(流), 保持平台独立, 保持环境独立。...此页面现在仅负责: 显示计数器,现在在必要刷新(即使页面不必知道) 提供按钮,按钮按下,将会在counter面板上请求一个动作 此外,整个业务逻辑集中在一个单独的类“IncrementBloc”...此外,GridView.builder和ListView.builder在认为必须在视口中呈现某个项目(索引)才调用itemBuilder。

    4.2K90

    Flutter跨平台移动端开发丨SingleChildScrollView、ListView......

    ---- SingleChildScrollView(可滑动 View) SingleChildScrollView 类似 Android 的 scrollview ,且同样的可包含有一个子元素...默认情况下,Flutter会根据具体平台分别使用不同的ScrollPhysics对象,应用不同的显示效果,如滑动到边界,继续拖动的话,在iOS上会出现弹性效果,而在Android上会出现微光效果。...默认情况下,Flutter会根据具体平台分别使用不同的ScrollPhysics对象,应用不同的显示效果,如滑动到边界,继续拖动的话,在iOS上会出现弹性效果,而在Android上会出现微光效果。...addAutomaticKeepAlives:表示是否将列表项包裹在 AutomaticKeepAlive widget 。(在懒加载,如果设置了包裹那么在此列表项滑出屏幕外不会被GC。...ListView.builder listview 的列表项较多或数量未知,就需要使用 ListView.builder 来构建列表了 import 'package:flutter/material.dart

    8.7K51

    UITableView在Flutter是什么?

    前面我们学习了文本、图片和按钮这些基本元素,这些基本元素需要进行排列组合,才能构成我们看到的UI视图。...那么,这些基本元素的排列布局超过屏幕显示尺寸(即超过一屏),我们就需要引入列表控件来展示视图的完整内容,并根据元素的多少进行自适应滚动展示。...在这个例子,我们一次性创建了6个子Widget。但是从上图的运行效果可以看到,由于屏幕的宽高有限,同一间用户只能看到3个Widget。...列表滚动到相应位置,ListView会调用该方法创建对应的子Widget。 itemCount,表示列表项的数量,如果为空,则表示ListView为无限列表。...ListView的组件控制器是ScrollController,我们可以通过它来获取视图的滚动信息,更新视图的滚动位置。

    5.6K10

    干货 | 携程火车票Flutter最佳实践

    在开发过程,实时地看到界面改动。生产AOT编译,将代码编译成 ARM 二进制,从而既可以享受运行时又具有原生语言相近的运行效率。 ?...Model,UI就会自动更新,不用在状态改变后再去手动调用setState()来显示更新页面。...调用 setState() ,RenderObject 就会往上的父节点去查找,根据 isRepaintBoundary是否为 true,会决定是否从这里开始往下去触发重绘,来确定要更新哪些区域。...3.4 实战性能技巧 1)懒加载ListView 推荐使用ListView.builder()构建List,这样Item滚入屏幕才创建Item,而不是ListView-children,这样会立刻创建所有的...错误分析 出现这个问题的原因在于使用Text.rich来展示多个Span组件,如果设置了最大行数,组件超过最大行数,有别的组件未成功展示,再次点击当前widget,使它接受时间,就会导致crash

    2.2K30

    三段代码打造好看的流式布局,flutter之wrap【flutter20个实例之七】

    一、老套路,先看样式 左起图一是我业务的样式,左起图二是下方源码展示样式(复制可直接运行,无额外组件引入) ? ?....每一个item的设置 这里通过column来设置,一个组件就是标题,第二个组件就是wrap流式布局 4.wrap流式布局 我们重要来说这个 Wrap可以为子控件进行水平或者垂直方向布局,且当空间用完,...direction: Axis.vertical, ... ) alignment属性控制主轴对齐方式,crossAxisAlignment属性控制交叉轴对齐方式,对齐方式只对有剩余空间的行或者起作用...,例如水平方向上正好填充完整,则不管设置主轴对齐方式为什么,看上去的效果都是铺满。...TextStyle(fontSize: 12, color: Colors.black), ), ) ], ), ); } } 支持更新

    1.1K20

    Flutter 实践 MVVM

    在做flutter开发,刚学习写的很随意,什么东西都写一起,也不去考虑解耦等问题。但是实际生产开发是不能这样做的,否则项目稍大就无法维护。...在Flutter,一切UI皆Widget,那么View层也很明确了,就是Widget部分。...但是ViewModel就需要考虑了,因为MVVM一个很重要的特性就是双向绑定,Model数据的更新会及时的反馈到View上,View上的更新也会及时的反馈给Model。...StreamBuilder也是一个Widget,其作用就是监听指定的Stream,一旦这个Stream中有数据来了,就调用builder的闭,用新的数据,重新构建这个widget。...的Sink对象被add数据后,StreamBuilder会监听到这个变化,然后重新通过builder参数传入的闭来重新构建这个widget。

    10K70

    Flutter性能调优、复杂业务保证Flutter的高性能高流畅

    此部分的核心代码是:flutter仓库下的flutter package,以及sky_engine仓库下的io,async,ui(dart:ui库提供了Flutter框架和引擎之间的接口)等package...了解了这三棵树,我们再来看下页面刷新的时候具体做了哪些操作 需要更新UI的时候,Framework通知Engine,Engine会等到下个Vsync信号到达的时候,会通知Framework进行animate...是不可改变,需要重新创建一颗新树,build开始,然后对上一帧的element树做遍历,调用他的updateChild,看子节点类型跟之前是不是一样,不一样的话就把子节点扔掉,创造一个新的,一样的话就做内容更新...debugPrintEndFrameBanner:打印每帧开始和结束 实例分析 了解这些工具下面我们来看个简单的demo具体分析下,一个由Column、Container、ListView嵌套的布局,其中有个定时器控制Text显示的文本实时更新...,因为widget在页面刷新的过程随时会通过build重建,build调用频繁,我们应该处理跟UI相关的逻辑 2.减少saveLayer(ShaderMask、ColorFilter、Text Overflow

    1.2K31

    Flutter 视图布局(二)

    english_words: ^3.1.0 在添加完新的依赖后,当你进行保存 VS Code 会自动进行依赖更新和下载,还是比较方便的,就不需要手动进行更新命令了。...BouncingScrollPhysics 的话就是大家都熟悉的回弹效果了,操作列表到达可视范围尽头还可以继续超出一定的空间,失去焦点后回到尽头的位置,这样就能给予用户一个良好的使用体验。...源码说到 ListView 有4设置子元素的方式: List ListView.builder ListView.separated ListView.custom 第一种 List... itemCount 设置为 null 就可以实现无限下拉列表。少侠小伙伴们可以在代码尝试修改一下看看效果。...其实 separated 和 builder 差别并不大,这里我做了简单的修改就实现了分割线。

    3K10

    Flutter可滑动组件

    因为默认构造器接收了一组明确的Widget,构造这组Widget时会一次性将所有子组件都初始化,而不是初始化那些可见的Widget,即默认构造器不存在懒加载功能。...列表滚动到具体的index位置,会调用该构建器构建列表项。 itemCount:列表项的数量,如果为null,则为无限列表。...子Widget即将被展示到屏幕,itemBuilder函数才会被调用。...GridView 2.1 GridView介绍 GridView常用于多行多地展示,比如直播应用的主播列表、电商的商品列表等等。...比如视图滚动到底部,我们可能希望做上拉加载更多;比如滚动到一定位置显示一个回到顶部的按钮,点击回到顶部的按钮,回到顶部;比如监听滚动什么时候开始,什么时候结束; 在Flutter监听滚动相关的内容由两部分组成

    7.1K30

    干货 | 携程酒店Flutter性能优化实践

    控制UI绘制的范围是通过改变widget树层级实现的。MVVM数据触发UI更新的方式有很多,我们的业务主要用到了Provider机制,这是一种观察者模式设计。...图5 酒店详情页周边内容运用懒加载减少构建次数 f) 分帧渲染 错峰加载方案使用分帧渲染,分帧渲染的原理是将一棵Widget树的部分绘制时间较长的节点在第一帧占位不绘制,等到下一帧开始,节点替换占位...我们的flutter业务代码采用MVVM的结构,将服务请求的结果处理完的数据放入ViewModel,ViewModel的数据更新通过Provider机制触发页面UI更新。...页面上的数据可以由服务更新,也可以由用户交互更新。业务的ViewModel依赖这个通用缓存,数据更新会触发页面UI更新。...下图的第一是类名,第二、三是实例数量,第四、五是对应分配的字节数。

    2K10

    给Android开发者Flutter上手指南

    如何知道点击了列表哪个item? 如何动态更新ListView? LinearLayout 在Flutter中等价于什么(Android)?...在Flutter,布局主要由专门设计用于提供布局的小部件定义,并结合控件widget及其样式属性。 例如, 和 行 widgets 控制一个数组的条目 并且 分别垂直和水平对齐它们。...在 iOS ,你给 view 包裹上 ScrollView 来允许用户在需要滚动你的内容。在 Flutter ,最简单的方法是使用 ListView widget。...它得到你的 ListView ,它会使用一个 == 判断,并且发现两个 ListView 是相同的。没有什么东西是变了的,因此更新不是必须的。...虽然这样很简单,但数据集很大,并不推荐这样做,来一起看个demo: import 'package:flutter/material.dart'; void main() { runApp(SampleApp

    2K20
    领券