Flutter局部刷新优化性能

发布时间 - 2025-07-14 00:00:00    点击率:

局部刷新是优化flutter应用性能的重要手段。下面是对上述内容的伪原创处理:

Flutter中的状态类有两种:

  • 无状态类(StatelessWidget):此类组件一旦创建后,其界面状态无法更改。
  • 有状态类(StatefulWidget):当状态发生变化时,通过调用setState()方法可以触发UI的更新。继承StatefulWidget的子类需要重写createState()方法。

下面是一个普通刷新的示例代码:

class TestRoute extends StatefulWidget {
  @override
  _TestRouteState createState() => _TestRouteState();
}

class _TestRouteState extends State {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return FlatButton(
      onPressed: () {
        setState(() => count++);
      },
      child: Text('$count'),
    );
  }
}

在这个有状态类的例子中,定义了一个变量,并在按钮事件中通过setState来刷新该变量,从而实现界面的更新。

接下来,我们通过GlobalKey实现局部刷新,仍然使用上面的例子,但这次我们只刷新Text组件:

class TestRoute extends StatefulWidget {
  @override
  _TestRouteState createState() => _TestRouteState();
}

class _TestRouteState extends State {
  int count = 0;
  GlobalKey textKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        TextWidget(textKey), // 需要更新的文本组件
        FlatButton(
          onPressed: () {
            count++; // 仅更改数值,状态刷新由Key处理
            textKey.currentState.onPressed(count);
          },
          child: Text('按钮 $count'),
        ),
      ],
    );
  }
}

// 封装的文本组件
class TextWidget extends StatefulWidget {
  final Key key;
  TextWidget(this.key);

  @override
  State createState() => TextWidgetState();
}

class TextWidgetState extends State {
  String _text = "0";

  @override
  Widget build(BuildContext context) {
    return Text(_text);
  }

  void onPressed(int count) {
    setState(() => _text = count.toString());
  }
}

通过这种方式,可以看到按钮上的count值没有变化,但需要更新的文本组件已经成功更新了值,实现了局部刷新的效果。

实现原理:textKey是一个类型为GlobalKey的键,其泛型为TextWidgetState(封装的文本组件且为有状态类)。因此,该键可以通过currentState方法调用类内部的onPressed方法,而onPressed方法恰好调用了setState来刷新局部状态。


# ai  # count  # 封装  # 子类  # 继承  # 泛型  # 事件  # flutter  # ui  # 是一个  # 在这个  # 并在  # 可以通过  # 此类  # 可以看到  # 重写  # 有两种  # 为有 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 原生JS实现图片轮播切换效果  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  焦点电影公司作品,电影焦点结局是什么?  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  高防服务器:AI智能防御DDoS攻击与数据安全保障  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  敲碗10年!Mac系列传将迎来「触控与联网」双革新  如何在腾讯云服务器快速搭建个人网站?  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  JavaScript实现Fly Bird小游戏  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  简单实现Android文件上传  Laravel如何为API生成Swagger或OpenAPI文档  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  简单实现jsp分页  如何快速上传建站程序避免常见错误?  如何在香港服务器上快速搭建免备案网站?  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  网页设计与网站制作内容,怎样注册网站?  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  如何注册花生壳免费域名并搭建个人网站?  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  用yum安装MySQLdb模块的步骤方法  *服务器网站为何频现安全漏洞?  Android中AutoCompleteTextView自动提示  SQL查询语句优化的实用方法总结  Android Socket接口实现即时通讯实例代码  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  微信小程序 五星评分(包括半颗星评分)实例代码  如何为不同团队 ID 动态生成多个独立按钮  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  制作旅游网站html,怎样注册旅游网站?  Laravel集合Collection怎么用_Laravel集合常用函数详解  实例解析Array和String方法  大同网页,大同瑞慈医院官网?  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册