百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT文章 > 正文

flutter CustomScrollView sliverList内数据变化会导致每个item都会重新build flutter的listview

chenpack 2025-06-27 02:00 36 浏览 0 评论

让Flutter 应用程序性能提高 倍的 个技巧

Flutter 应用程序以其精美的设计和流畅的功能而闻名,但性能问题会很快破坏用户体验。借助这 个优化性能的专家技巧,将您的应用提升到一个新的水平。


使用 WidgetsBindingObserver 跟踪应用程序的生命周期

使用“WidgetsBindingObserver”来跟踪您的应用程序的生命周期。此观察器允许您在应用程序恢复、暂停或不活动时接收回调,这可以帮助您识别性能瓶颈并优化应用程序的行为。

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  @override
  void initState() {
    WidgetsBinding.instance.addObserver(this);
    super.initState();
  }
  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    // Handle state changes here
  }
  //...
}

复制


使用 RepaintBoundary 小部件隔离应用程序的各个部分

使用“RepaintBoundary”小部件来隔离导致性能问题的应用程序部分。“RepaintBoundary”小部件可用于包装导致性能问题的小部件,以便应用程序的其余部分可以继续平稳运行。

RepaintBoundary(
  child: MyExpensiveWidget(),
);

复制


使用 InheritedWidget 获取数据

将“InheritedWidget”用于向下传递到小部件树的数据。“InheritedWidget”是一种特殊的小部件,可用于将数据向下传递到小部件树中,这有助于减少重建次数并提高性能。

class MyInheritedWidget extends InheritedWidget {
  final int myData;

  MyInheritedWidget({
    Key key,
    @required this.myData,
    @required Widget child,
  }) : super(key: key, child: child);

  @override
  bool updateShouldNotify(MyInheritedWidget old) => myData != old.myData;

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

复制


使用 StreamBuilder 而不是 FutureBuilder

尽可能使用“StreamBuilder”而不是“FutureBuilder”。“StreamBuilder”允许您在更新发生时接收更新,这有助于减少重建次数并提高性能。

StreamBuilder(
  stream: myStream,
  builder: (BuildContext context, AsyncSnapshot snapshot) {
    if (snapshot.hasData) {
      return Text(snapshot.data);
    } else if (snapshot.hasError) {
      return Text(snapshot.error);
    }
    return CircularProgressIndicator();
  },
);

复制


使用 CustomScrollView 而不是 ListView

尽可能使用“CustomScrollView”而不是“ListView”。“CustomScrollView”比“ListView”更高效,因为它只构建当前在屏幕上可见的小部件。

CustomScrollView(
  slivers: <Widget>[
    SliverList(
      delegate: SliverChildBuilderDelegate(
        (BuildContext context, int index) {
          return MyListItem(data: myData[index]);
        },
        childCount: myData.length,
      ),
    ),
  ],
);

复制


使用 AnimationController 来控制动画

使用“AnimationController”来控制动画。“AnimationController”允许您控制动画的时间和进度,这有助于减少重建次数并提高性能。

class MyAnimationWidget extends StatefulWidget {
  @override
  _MyAnimationWidgetState createState() => _MyAnimationWidgetState();
}

class _MyAnimationWidgetState extends State<MyAnimationWidget>
    with SingleTickerProvider{
    AnimationController _controller;

    @override
    void initState() {
    _controller = AnimationController(vsync: this, duration: Duration(seconds: 2));
    super.initState();
    }

    @override
    void dispose() {
    _controller.dispose();
    super.dispose();
    }

    @override
    Widget build(BuildContext context) {
        return AnimatedBuilder(
        animation: _controller,
        builder: (context, child) {
        // Use _controller.value to control the animation
        return Transform.translate(
        offset: Offset(0, _controller.value * ),
        child: child,
        );
        },
        child: MyChildWidget(),
        );
    }
}

复制


使用 Wrap 小部件而不是 ListView 小部件

尽可能使用“Wrap”小部件而不是“ListView”小部件。“Wrap”小部件比“ListView”更高效,因为它只构建当前在屏幕上可见的小部件。

Wrap(
  children: myChildren.map((child) => MyChildWidget(child)).toList(),
);

复制


使用 CustomPainter 小部件绘制复杂图形

使用“CustomPainter”小部件绘制复杂的图形。“CustomPainter”小部件允许您直接在画布上绘制,这比构建大量嵌套的画布要高效得多

class MyCustomPainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    // Draw complex graphics on the canvas
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return false;
  }
}

复制


使用 PerformanceOverlay 小部件查看应用程序性能的实时可视化。

使用“PerformanceOverlay”小部件查看应用程序性能的实时可视化。此小部件可以帮助您识别应用程序中可能导致性能问题的区域,并为您提供有关如何优化它们的想法。

PerformanceOverlay(
  enabled: true,
  overlayRect: Rect.fromLTWH(0, 0, , ),
  children: [
    // Your widgets
  ],
);

复制


使用 Dart 内置的 Profile 和 Release 模式来测试性能

使用 Dart 内置的“Profile”和“Release”模式来测试性能。配置文件模式为您提供详细的性能信息,发布模式优化应用程序的性能和速度,这将帮助您识别和修复性能问题。

flutter run --profile

或者

flutter run --release

请注意,这些只是代码的示例。

相关推荐

RouterOS 端口映射 (远程桌面)

一款功能强大的路由器系统-软路由-RouterOS推荐一款路由器系统,头条有很多喜欢使用软路由伙伴可能有很多都不知道RouterOS这个路由系统是,RouterOS是由拉脱维亚MikroTik...

神经网络中的编码器 神经网络视频编码

神经网络算法-一文搞懂Transformer(总体架构&三种注意力层)本文将从Transformer的本质、Transformer的原理、Transformer的应用三个方面,带您一...

必备资料103个WindowsXP运行命令

Windows中CMD最全命令行CMD命令:开始->运行(或者Windows+R)->键入cmd或command(在命令行里可以看到系统版本、文件系统版本)CMD命令锦集1.gpedit...

固态硬盘无法格式化怎么办

Windows中固态硬盘无法格式化怎么办?固态硬盘(简称SSD)是一种数据存储设备,与传统机械硬盘相比,它在许多方面表现得更好。因此,越来越多的用户希望使用固态硬盘,但是当人们购买固态硬盘后准备将其格...

手机信令数据分析_手机信令数据分析过程代码

清华大学公共管理学院刘志林教授:探索手机信令数据在城市治理中的应用中国发展网讯日前,由中国人民大学首都发展与战略研究院(以下简称“首发院”)主办的首都大讲堂(第7期)暨地方治理工作坊第二期在京举办。...

python开发ping工具 ipad python开发工具

python之ping主机#coding=utf-8frompythonpingimportpingforiinrange,):ip=&#;.&#;+str(i)...

云容灾关键技术点简介_云容器技术

阿里云发布企业级云灾备解决方案:一键容灾、成本节省%5月日,阿里云对外发布了企业级云灾备解决方案。据介绍,此次发布的灾备解决方案来自阿里巴巴IT基础设施云化的灾备经验,完全省去灾备机房的建设规划,可大...

域名泛解析设置_域名解析包括泛域名解析

如何降低域名被恶意泛解析的风险买车用车不想被忽悠,就请关注缸微信号:kf12gang←长按可复制。我们每天将免费为您解答选车用车的相关问题。作者:QQ126058域名被恶意泛解析是域名安全最常见的问...

人人通云平台怎么注册 人人通云教学登录账号

世界那么大,她看到了:一个心理咨询师的十年心灵之旅来源:环球网“世界那么大,我想去看看。”十年前的那个春天,十个字的辞职信,戳中了无数国人的心,激起了无数个“诗和远方”的小梦想,被称为“史上最具情怀...

民用远程监控手机软件_民用远程监控手机软件下载

屏幕监控软件有哪些?3款好用的监控软件分享!管控摸鱼小case!作为企业管理者,我深知员工工作效率和信息安全的重要性。在日常管理中,我时常会遇到这样的难题:员工是否在认真工作?有没有利用公司资源做与工...

重量级!Maven史上最全教程,看了必懂

对8个MCP服务器框架的比较作者:FrankGoortani编译:小兰引言模型上下文协议(MCP)是一种新标准,用于以统一方式将AI助手(如LLM)与外部数据源和工具连接起来。自推出以来,各种框架已...

面试字节跳动,收到offer后我却拒绝了 ,给面试人的一些忠告!

面试字节跳动,我被面试官狂怼全过程!来源:https://www.zhihu.com/question//answer/人们都说,这个世界上有两种人注定单身,一种是太优秀的,另一种是太平凡的。我一听呀...

ps1手柄 python Ps1手柄真假

别再花冤枉钱!教你一分钟辨别“真假”超皮秒▌什么是超皮秒?皮秒激光,就是每个激光发射的脉冲持续时间(脉宽)达到皮秒级别的激光;1ps等于的负次方秒,超皮秒其实是一种商业名称,本质上也是皮秒激光设备,我...

路由器接交换机UPLINK还是

最全攻略!网络小白也能看懂的交换机连接方法号主:老杨丨年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部中午好,我的网工朋友。在网络设备的世界里,交换机是不可或缺的存在。不同的连接方法...

tempdb 清理 tempdb可以删除吗

无需改代码,提高SQLSERVER数据库性能的个最简单方法众所周知SQLSERVER是微软的数据库拳头产品,有着图形化友好界面、操作门槛低、部署难度小,一键式安装的特点,受到全球开发者及企业的青睐...

取消回复欢迎 发表评论: