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

如果widget多次调用InheritedWidget.of(),是否会产生性能问题?

在Flutter中,InheritedWidget 是一种用于高效传递数据的机制,它允许子组件访问父组件中的数据,而不需要通过每个中间组件手动传递。InheritedWidget.of() 方法用于获取最近的祖先 InheritedWidget 实例。

如果 widget 多次调用 InheritedWidget.of(),通常情况下不会产生显著的性能问题。这是因为 InheritedWidget.of() 的实现是高效的。当调用此方法时,Flutter 框架会沿着组件树向上查找最近的 InheritedWidget 实例,并缓存结果。这意味着对于同一组件树中的多次调用,框架只会执行一次实际的查找操作。

然而,如果存在以下情况,可能会对性能产生一定影响:

  1. 频繁重建组件:如果组件树频繁重建,每次重建都会触发新的查找操作。这可能会导致性能下降,尤其是在大型组件树中。
  2. 深层嵌套:如果 InheritedWidget 被深层嵌套在组件树中,查找操作可能需要遍历更多的组件层级,这会增加一些开销。

为了优化性能,可以采取以下措施:

  • 尽量减少不必要的重建:使用 const 关键字创建不可变的组件,以避免不必要的重建。
  • 合理设计组件结构:避免过深的组件嵌套,以减少查找操作的层级。
  • 使用 ConsumerSelector:这些小部件可以帮助你只在相关数据变化时才重建组件,而不是整个组件树。

下面是一个简单的示例,展示了如何使用 InheritedWidgetConsumer

代码语言:txt
复制
class MyInheritedWidget extends InheritedWidget {
  final int data;

  MyInheritedWidget({required this.data, required Widget child}) : super(child: child);

  static MyInheritedWidget? of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
  }

  @override
  bool updateShouldNotify(MyInheritedWidget oldWidget) => oldWidget.data != data;
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MyInheritedWidget(
      data: 42,
      child: Consumer<MyInheritedWidget>(
        builder: (context, myInheritedWidget, child) {
          return Text('Data: ${myInheritedWidget.data}');
        },
      ),
    );
  }
}

在这个示例中,MyInheritedWidget 是一个自定义的 InheritedWidget,它传递了一个整数数据。Consumer 小部件用于监听 MyInheritedWidget 的变化,并只在数据变化时重建文本组件。

总之,多次调用 InheritedWidget.of() 通常不会导致性能问题,但在某些情况下,通过优化组件结构和减少不必要的重建,可以进一步提高性能。

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

相关·内容

干货 | Flutter在携程复杂业务的高性能之旅

经过一年多的开发、维护 ,总结了一套行之有效的性能优化方案。本文主要介绍结合性能分析工具,来识别、区分、定位一些性能问题,并且能够找到具体的方法和代码位置,帮助更快地解决问题。...此外,也会分享我们做的一些性能优化案例和体验上的优化,希望能够给你带来一些启发。 二、渲染优化 Flutter 渲染性能问题主要可以分为 GPU 线程问题和 UI 线程(CPU)问题两种。...有时候Widget树的构建很简单,但是GPU线程的渲染却很耗时,就要考虑是否过度渲染,缺少组件缓存,涉及到Widget的裁剪、蒙层这类多视图叠加的渲染。...,如果网络较差或者服务端返回时间过长,会导致数据展示错乱的问题,在刷新列表时要取消掉还未返回数据的请求。...六、总结 本文介绍了遇到Flutter页面渲染问题,结合Performance Overlay 性能分析工具来确定是 UI线程的性能问题,还是GPU 线程的性能问题。

1.6K20

C++17 深入解析:巧用 noexcept 提升代码质量

一方面,异常的抛出和捕获可能会导致程序的执行流程变得复杂难懂;另一方面,频繁的异常处理机制可能会对程序的性能产生负面影响。...这些优化措施可以显著减少函数调用的开销,尤其是在那些频繁调用函数的场景中,性能提升效果尤为明显。改进内存管理:在某些情况下,编译器可以利用 noexcept 信息来优化内存管理策略。...在一些性能敏感的代码段中,这种开销的减少可能会带来显著的性能提升。优化代码生成:编译器在知道函数不会抛出异常后,可以生成更高效的机器代码。...vec.reserve(2); // 预分配内存,避免多次重新分配 vec.push_back(Widget()); // 使用 noexcept 移动构造函数 vec.push_back...noexcept 运算符会根据 expression 的异常属性返回一个布尔值,如果 expression 是 noexcept 的,则返回 true;否则返回 false。

10500
  • Flutter漫说:组件生命周期、State状态管理及局部重绘的实现(Inherit)

    build 主要是返回需要渲染的 Widget ,由于 build 会被调用多次,因此在该函数中只能做返回 Widget 相关逻辑,避免因为执行多次导致状态异常,注意这里的性能问题。...deactivate 在组件被移除节点后会被调用,如果该组件被移除节点,然后未被插入到其他节点时,则会继续调用 dispose 永久移除。 dispose 永久移除组件,并释放组件资源。...重点注意要实现updateShouldNotify函数,通过名字可以知道这个函数决定InheritedWidget的Child Widget是否需要刷新,这里我们判断如果与之前改变了才刷新。...InheritedWidget会解决多余的刷新问题,比如在一个页面中有多个属性,同样有多个Widget来使用这些属性,但是并不是每个Widget都使用所有属性。...这时候如果data改变,遍历它的所有依赖时,会通过每个依赖的Widget获取它对应的标记集dependencies,然后触发updateShouldNotifyDependent判断该Widget是否刷新

    1.6K21

    Chapter 4: Smart Pointers

    p,少一次会造成内存泄露,多一次会造成未定义行为 通常无法对 p 判断其是否是悬空指针 C++11 中的四种智能指针 std::auto_ptr (在 C++98 以后被 std::unique_ptr...std::shared_ptr ,那么就会出现多个独立的控制块,也会造成多次资源释放 auto pw = new Widget; ......(WidgetID id); 如果 loadWidget 是一个调用代价较高的函数,一个合理的优化是在内部缓存每次查询的结果,但是每次请求 Widget 都要缓存的话会导致性能问题,因此另一个合理的优化是当...原因是:上面改写为只能指针的代码中,没有对 Widget 进行析构,因此编译器会自动生成析构函数,而在析构函数中,编译器会插入调用 std::unqiue_ptr 的析构函数代码,默认的析构器是 delete...为了解决这个问题,我们需要在析构函数调用时,确保 Widget::pImpl 是一个完整的类型,也就是当 Widget 的 Impl 在 Widget.cpp 中定义之后,类型是完整的,关键就是让编译器在看到

    1.6K20

    Flutter 2.5正式版发布,带来重大更新

    ,那么就需要调用多次 showMaterialBanner、ScaffoldMessenger ,兵手动维护一个队列,在前一个横幅已被关闭之后,再显示一个新横幅。...如果这些插件被标识为【Battery】,那么我们不再被积极维护,我们建议使用以下插件的 plus 版本: Flutter DevTools:性能、Widget 检查器和 Polish 此次, DevTools...现在,使用DevTools,我们可以更好地将跟踪事件与特定框架相关联,这有助于开发人员在出现问题后分析问题产生的原因。...此外,在跟踪应用程序中的 CPU 性能问题时,可能会被来自 Dart 和 Flutter 库或引擎本机代码的分析数据淹没,如果想关闭其他干扰,只专注于您自己的代码,您可以使用新的 CPU Profiler...并且,当选择一个 Widget 时,会自动获取 Widget 的属性。

    4.4K50

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

    为解决这些问题,我们选用了多个性能指标监控业务运行状态,借助性能检测工具定位问题,并查阅源码、文档等资源解决问题,形成了这篇文章。...这个闭包会注册到引擎的全局变量里面,如果Native调用了result的listener,这个Then的闭包会走到,然后会被清除掉。...如果某些case,Native没有调用,则这个闭包会泄露,如果这个闭包所属的Model能引用到页面对象的话,则会造成整个页面的泄露。...cancel();} 这种等待对异步调用的回调监听其实都可能存在类似问题,只不过如果是单纯在Dart中的异步调用一般不会存在这种不回调的情况。...这些订阅者如果在页面退出时不需要了,需要记得取消掉。否则也会造成内存泄漏,这种情况我们也应该避免。 五、小结 性能优化是一件不断持续,不断深入的事情。

    2K10

    Flutter 应用性能优化最佳实践

    如果改变的部分仅包含在 Widget 树的一小部分中,请避免在 Widget 树的更高层级中调用 setState()。 当重新遇到与前一帧相同的子 Widget 实例时,将停止遍历。...一些效果的背后调用了性能代价很大的 saveLayer() 方法。 为什么 saveLayer 代价很大? 调用 saveLayer() 会开辟一片离屏缓冲区。...如果在 profile 构建 状态下,每一帧渲染时间低于 16ms,你可能不必担心性能问题以及一些性能陷阱,但仍然应该致力于尽可能快地渲染每一帧。为什么?...如果你想弄明白为什么 60fps 会带来平滑的视觉体验,请看视频 Why 60fps2....以下行为可能会对您应用的性能产生负面影响。 避免使用 Opacity widget,尤其是在动画中避免使用。请用 AnimatedOpacity 或 FadeInImage 进行代替。

    2.4K20

    腾讯游戏社区 | Flutter全方位性能检测工具

    根据WidgetTree进行语义分析,判断Widget Node是否有使用低性能组件,快速帮助开发者发现问题及时优化。...图片检测主要针对asset、网络图片、file类型等图片、多帧动图(如GIF)等资源在程序中是否存在图像本身的大小是否与组件显示大小不匹配的问题,检测到大小不一会进行高亮提示,将原图大小和图片组件本身大小进行对比显示...channel掉调用会导致无法快速执行build进行UI渲染,影响体验。...如果一个没有result的channel方法以await同步的方式执行,在该语句后再执行channel调用,会发现后面的语句无法正常执行。为了防止疏漏影响程序正常功能,这个检测还是很有必要的。 ?...设计还原 项目开发过程中,视觉走查返工是不可避免的,往往需要开发、设计多次沟通检查代码核对信息,设计还原主要是针对这类问题提供自助检测,设计师可以根据颜色习惯以及标尺工具进行设计自助还原检查,针对还原问题截图定量反馈问题

    4.5K20

    新手开发怎么用Flutter快速发现问题?

    根据WidgetTree进行语义分析,判断Widget Node是否有使用低性能组件,快速帮助开发者发现问题及时优化。...图片检测主要针对asset、网络图片、file类型等图片、多帧动图(如GIF)等资源在程序中是否存在图像本身的大小是否与组件显示大小不匹配的问题,检测到大小不一会进行高亮提示,将原图大小和图片组件本身大小进行对比显示...channel掉调用会导致无法快速执行build进行UI渲染,影响体验。...如果一个没有result的channel方法以await同步的方式执行,在该语句后再执行channel调用,会发现后面的语句无法正常执行。为了防止疏漏影响程序正常功能,这个检测还是很有必要的。...设计还原 项目开发过程中,视觉走查返工是不可避免的,往往需要开发、设计多次沟通检查代码核对信息,设计还原主要是针对这类问题提供自助检测,设计师可以根据颜色习惯以及标尺工具进行设计自助还原检查,针对还原问题截图定量反馈问题

    1K20

    Flutter 2.5正式版发布,带来多项重大更新

    ,那么就需要调用多次 showMaterialBanner、ScaffoldMessenger ,兵手动维护一个队列,在前一个横幅已被关闭之后,再显示一个新横幅。...如果这些插件被标识为【Battery】,那么我们不再被积极维护,我们建议使用以下插件的 plus 版本: [在这里插入图片描述] Flutter DevTools:性能、Widget 检查器和 Polish...现在,使用DevTools,我们可以更好地将跟踪事件与特定框架相关联,这有助于开发人员在出现问题后分析问题产生的原因。...此外,在跟踪应用程序中的 CPU 性能问题时,可能会被来自 Dart 和 Flutter 库或引擎本机代码的分析数据淹没,如果想关闭其他干扰,只专注于您自己的代码,您可以使用新的 CPU Profiler...[在这里插入图片描述] 并且,当选择一个 Widget 时,会自动获取 Widget 的属性。

    3.6K00

    智能指针在面试中得重要地位!

    operator bool() unique_ptr 指针可直接作为 if 语句的判断条件,以判断该指针是否为空,如果为空,则为 false;反之为 true。...reset(p) 其中 p 表示一个普通指针,如果 p 为 nullptr,则当前 unique_ptr 也变成空指针;反之,则该函数会释放当前 unique_ptr 指针指向的堆内存(如果有),然后获取...,即不再有 shared_ptr指涉到该资源,则std::shared_ptr会析构 /** 引用计数带来性能影响: 1,std::shared_ptr的尺寸使裸指针的两倍,其内部包含一个指涉到该资源的裸指针...*/ //问题1: //从同一个裸指针出发来构造不止一个 std::shared_ptr的话,会出现未定义的行为 //因为,这样依赖被指涉到的对象将会有多重的控制块,多重的控制块意味着多重的引用计数,而多重的引用计数意味着该对象被析构多次...std::shared_ptr对象中,即使compute产生异常, std::shared_ptr得析构函数也能知道他拥有得Widget已被析构 2, 如果 computePriority

    1K20

    从渲染原理剖析如何提高 Flutter 应用性能

    调用 Java 代码,然后再通过 Java 代码去调用 Skia 图形引擎,相较于 Flutter 多一层调用,所以性能也会存在丢失。...,再对上一帧的 Element 树做遍历,在 Element 类上有一个 updateChild 的方法,它可以对子节点进行比较并操作,通过查看当前的子节点类型和上一帧的子节点类型是否一致,如果不一致,...即: 如果 Element 节点的类型是 ComponentElement,会直接对 StatefulElement 和 StatelessElement 做更新,也就是执行 build 操作。...如果 Element 节点的类型是 RenderObjectElement 的话,则通过调用 RenderObjectWidget 的 updateRenderObject 方法来进行更新。...除此之外,在我们书写 Widget 的时候,如果能够给出 Widget 宽高的话,尽量给出来,因为在布局中,宽度的计算也会占用一定的时间。

    1.5K30

    老司机带路:15个Android撸代码常见的坑

    0x04 应用使用多进程应该注意的问题 Application 会被初始化多次,即 onCreate() 方法会执行多次。...这时候应该考虑使用主线程(例如 WebView.post() )来执行 loadUrl(); 通过 H5 调用本地方法时,如果 H5 是异步调用,那么也应该考虑把本地方法的实现放在主线程中。...0x07 UI 控件的样式出现了很奇诡的渲染,例如花屏、闪动等的问题 有些机型使用硬件加速出现了一些奇诡的UI问题,可以检查一下控件所在 Activity 是否配置了硬件加速,多数情况下去掉硬件加速就...0x10 GridView 中的 Item 无法居中问题 查看一下 GridView 的布局文件是否设置了 android:scrollbarStyle="outsideInset" 属性,如果有,去掉这个属性...但如果在 getView() 方法里构造 Spannable 对象,明显会影响列表的展示的效率,应该在线程中先这些 Spannable 数据构造好,而 getView() 尽量少做影响列表性能的操作。

    44410

    再也不用std::thread编写多线程了

    如果申请的软件线程数量多于系统可以提供的,调用std::thread会抛出异常,然而调用std::async时 系统不保证会创建一个新的软件线程,相反,它允许调度器把指定函数(doAsyncWork...如果那个线程是t,那就是说无法预知f是否运行 * 在与t不同的某线程之上 * * 3,连f是否允许这件起码的事情都是无法预知的,这个因为无法保证在程序的每条路径上,fut的get或wait都会得到调用...* * 但是,会导致效率问题嘛?...,假设在 push_back之前有个条件拦住了,没被复制,同样也会导致构造和析构newName的成本 //而如果采用了按引用途径,就不会有这种问题 //如果采用赋值来实施形参复制的话,情况更复杂了!...push_back,换句话是,看作是这样 vs.push_back(std::string("xyzzy"));//创建std::string型别的临时对象,并将其传递给push_back //但是,性能问题需要考虑

    2.4K40

    Flutter原理:三棵重要的树(渲染过程、布局约束、应用视图的构建等)

    Widget 是不可变,它的改变就意味着要重建,而其重建也非常频繁,如果我们将更多的任务都交给它将会对性能造成很大的损伤,因此我们把 Widget 组件当作一个虚拟的组件树,而真正被渲染在屏幕上的其实是...Elememt 这棵树,它持有其对应 Widget 的引用,如果他对应的 Widget 发生改变,它就会被标记为 dirty Element,于是下一次更新视图时根据这个状态只更新被修改的内容,从而达到提升性能的效果...Flutter 中的 Widget 一直在重建,每次重建之后,Element 都会采用相应的措施来确定是否我对应的新控件跟之前引用旧控件是否有所改变,如果没改变则只需要做更新操作,如果前后不同则会重创建...它会比较 Widget 以下两个属性: - 组件类型 - Widget 的 Key (如果有) 组件类型即前后控件的是否是同一个类所创建的,Key 即为每个控件的唯一标识。...这种约束会向下延伸,子组件也会产生约束传递给自己的孩子,一直到叶子结点。 第二的线性过程用来传递具体的布局信息。

    1.8K40

    Flutter学习之视图体系

    给定的widget可以零次或者多次被包含在树中,一个给定的widget可以多次放置在树中,每次将一个widget放入树中,他都会被扩充到一个Element,这就意味着多次并入树中的widget将会多次扩充到对应的...这里可以得出:如果涉及到widget的移动或者删除操作前,会根据widget的runtime和key进行对比。...关联的Widget可能会随时变化,例如,如果父widget重建并为此位置创建新的widget。...在某些情况下,父可能会更改用于配置此Element的Widget,例如因为父重新创建了新状态。发生这种情况时,framework将调用新的Widget的update方法。...高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

    1.5K30

    【Flutter】372- Flutter移动端实战手册

    ,一般都是因为xcode_backend.sh脚本导致的,可以检查一下FLUTTER_ROOT环境变量是否正确; 下面这种问题一般都是因为权限导致的,可以查看Build Phases的脚本写的是不是有问题...在开发过程中经常会涉及到网络请求和持久化的问题,如果混编的话可能会涉及到写两套逻辑,例如网络请求有一些公共参数,或返回数据的统一处理等,如果维护两套逻辑的话会容易出问题。...Native和Flutter的相互调用都需要设置一个名字,每一个名字对应一个MethodChannel对象,每一个对象可以发起多次调用,不同调用以invokeMethod做区分。...如果是绿色则表示不会影响界面渲染,如果是红色则有可能会影响界面的流畅性,如果出现红色线条,则表示当前执行的代码需要优化。...每次调用都会重新创建对应的Widget,进行调用时pushNamed函数会传入一个参数,这个参数就是定义Map时对应页面的key。

    1.2K40

    浅谈 Canvas 渲染引擎

    比如想画一个圆,直接调用封装好的绘制方法就行了,我们不需要关心是如何绘制的。 2. 性能 虽然封装之后的 API 很贴近 HTML 语法,但也意味着开发者很难去做一些底层的性能优化。...const rect = new Rect({ /... }); // 多次修改属性,可能会触发多次渲染 rect.x(100); rect.fill('red'); rect.y(100); 由于每次修改图形的属性或者添加...导致多次 render。...下次 batchDraw 的时候判断是否有缓存,如果有,那么直接走 drawImage 的形式。 这种离屏渲染的调用方式比较简单,Group 的粒度可以由开发者自己决定,但也有一定的问题。...虚拟列表 Widget 类适合多维表格这种业务,多个视图都需要有自己的滚动容器,不同视图都需要处理节点的回收、复用、新建,通过公用 Widget 可以一步到位去支持,也方便在内部去做更多性能优化。

    2.6K20
    领券