局部刷新

我们在做项目的时候,都需要单独的去刷新一个值,而不是把整个界面都重绘。大家都知道setState是进行重绘的一个方法,他会执行生命周期的一个build,这将会使得整个界面来进行重绘。当然我们也会说把他进行状态管理,因为我个人不是很喜欢用provider进行状态管理,而是使用steam和event_bus进行传值和管理,当然自然的代码就会多了,所以我现在也在寻找provider更简单的方法,当然这里就不说了,在跟其他人聊的时候,都说好久没有更新了。那是因为有点忙,也变得懒了。现在刚好趁着过年这一段时间,把一些对于在进行Flutter开发中的一些技巧就给大家举个小例子。

Flutter状态类

相信进行过flutter开发甚至了解过flutter进行过小demo编写的人,都知道最基本的有两种状态。一种是StatelessWidget;另一种是StatefulWidget。

StatelessWidget是指没有状态的类,他在页面进行编写的时候就已经固定了,不能更改,所以就是没有相应的setState方法。

StatefulWidget是指有状态的类,当状态改变的时候,我们可以调用setState进行页面的重新build来进行页面状态的更新。

自然我们调用setState进行页面刷新重新build的时候,那么setState方法自然ju会遍历我们在build下面所写的每个Widget的State.build,这样我说起来,大家也就明白了,这样会是一个很大的性能开销,所以我们可以使用局部刷新的方式来进行优化。

普通的刷新方式

class _MyHomePageState extends State {

int count = 0;

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

title: Text('Demo'),

),

body: Container(

alignment: Alignment.center,

child: Column(

children: [

Text('$count'),

FlatButton(

color: Theme.of(context).accentColor,

onPressed: () {

count++;

setState(() {});

},

child: new Text('按钮 $count'),

),

],

),

),

);

}

}

可以看出我们进行刷新的时候,这count值全部发生变化了。这样我们需要上面的Text变化,下面的按钮不进行页面的重绘怎么办呢?

使用GlobalKey局部刷新方式

我们还是用上面的方式去实现,但是我们事先封装好一个widget,使用GlobalKey的方式来进行局部刷新Text。

class MyHomePage extends StatefulWidget {

@override

_MyHomePageState createState() => _MyHomePageState();

}

class _MyHomePageState extends State {

int count = 0;

GlobalKey<_textwidgetstate> textKey = GlobalKey();

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

title: Text('Demo'),

),

body: Container(

alignment: Alignment.center,

child: Column(

children: [

TextWidget(textKey), //需要更新的Text

FlatButton(

child: new Text('按钮 $count'),

color: Theme.of(context).accentColor,

onPressed: () {

count++; // 这里我们只给他值变动,状态刷新交给下面的Key事件

textKey.currentState.onPressed(count); //其实这个count值已经改变了 但是没有重绘所以我们看到的只是我们定义的初始值

},

),

],

),

),

);

}

}

//封装的widget

class TextWidget extends StatefulWidget {

final Key key;

const TextWidget(this.key);

@override

_TextWidgetState createState() => _TextWidgetState();

}

class _TextWidgetState extends State {

String text = "0";

void onPressed(int count) {

setState((){

text = count.toString();

});

}

@override

Widget build(BuildContext context) {

return new Text(text);

}

}

效果:

可以看出按钮的count值没有发生变化,但是需要更新的组件已经进行了局部刷新。

实现原理

textKey是通过一个GlobalKey使用currentState方法调用封装的widget里面的onPressed方法,刚好onPressed方法里面有setState用来刷新局部的widget状态。

到此这篇关于flutter局部刷新的实现示例的文章就介绍到这了,更多相关flutter 局部刷新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

flutter怎么手动刷新_flutter局部刷新的实现示例相关推荐

  1. 全局刷新和局部刷新的理解

    一.全局刷新和局部刷新 全局刷新:使用form.href等发起的请求是全局刷新 解释:用户发起请求,视图改变了跳转视图,使用新的数据填充页面. 缺点: 传递数据比较大,占用网络带宽 浏览器需要重新的渲 ...

  2. php验证码刷新_php验证码刷新与局部刷新

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 实现php 验证码调用时的刷新与局部刷新,这二种情况在网站开发中均有使用. 一.验证码刷新 代码示例: form meth ...

  3. java验证码局部刷新_JS局部刷新图形验证码

    开发过程当中,网络安全采取的方法之一,采用验证码功能.一般在注册.登录的程序当中见得比较多.其自己在实现这一功能时,静态页面有一段调用图形验证码的PHP文件,//,验证码是随机生成的,一般将生成的验证 ...

  4. js本地刷新和局部刷新

    最近做项目有个问题一直困扰了我很久了,今天灵机一动搞定了,就是jQuery的click事件我调用ajax后就不能二次点击了,本次做的是某个商品的启用和禁用,本来是用ajax调用后台程序,成功后局部刷新 ...

  5. Js控制页面刷新(局部刷新全页面刷新)

    局部刷新: 这个方法就多了去了,常见的有以下几种: $.get方法,$.post方法,$.getJson方法,$.ajax方法如下 前两种使用方法基本上一样  $.get("Default. ...

  6. vue实现页面刷新以及局部刷新的方法

    1.利用Vue里面的provide+inject组合,实现全页面刷新 通过在APP页面进行demo进行刷新,不会像前两种那样出现短暂的闪烁效果,提升用户体验,通常可以使用这种方式 (1)在APP页面中 ...

  7. vue 全局刷新与局部刷新

    首先说下区别: 全局刷新:是指页面整体刷新,会出现空白,闪烁的情况 局部刷新:是指某个进行重构加载,不会出现空白 全局刷新: App.vue <template><div id=&q ...

  8. html局部刷新数据,局部刷新.html

     局部刷新 $axure.utils.getTransparentGifPath = function() { return 'resources/images/transparent.gif'; ...

  9. js页面指定div刷新(局部刷新)

    页面全部刷新和指定一个div刷新的方法 <!DOCTYPE html> <html lang="en"><head><meta chars ...

最新文章

  1. 数据库 user schema sqlserver 关系
  2. iMeta期刊投审稿系统ScholarOne正式上线
  3. [摘录]遇见未知的自己(一)
  4. Hyperledger Fabric 核心模块(2)configtxgen configtx.yaml配置文件
  5. python series用法_如何使用Python中的Series字典创建数据框?
  6. 数学专业学计算机哪一行,计算数学
  7. linuxoracle查看用户权限_权限管理系统设计过程
  8. php5.6怎么安装,php5.6的安装
  9. 翻译:理解TCP/IP网络栈编写网络应用(上)
  10. linux 安装servlet环境_linux下一键搭建LAMP环境安装网站全教程
  11. sap中有关地址及电话的相关表
  12. 《软件工程导论》期末复习知识点总结(全)
  13. YOLOv2论文笔记
  14. springboot整合quartz定时任务
  15. 使用linux宝塔面板安装 魔方IDC管理系统 免费
  16. Windows卓越性能概念以及如何打开
  17. Kotlin学习系列之:协程的取消和超时
  18. 理财产品的收益率也抵不上通货膨胀
  19. MATLAB代码:考虑退化成本的混合储能微电网双层能源管理系统 可再生能源 (RES) 和储能系统 (ESS) 在微电网中的集成为最终用户和系统运营商提供了潜在的利益
  20. Freeswitch 对接 unimrcpserver ASR调用

热门文章

  1. LaTex 版面设计
  2. 《滚动数组》---滚动数组思想,运用在动态规划当中
  3. 【PC工具】Windows10开始菜单增强工具Stardock Start10
  4. 反激式开关电源中PC817与TL431的配合电路探讨
  5. showSoftInput不起作用
  6. 在大数据圈你不知道的15个新技术
  7. JavaWeb中post提交乱码之编码拦截器Filter
  8. 源码编译安装mysql,DDL数据定义语言的使用。
  9. 对Struts2的认识(-)
  10. Microsoft 和 Google 就Yahoo 收购一事展开口水战