前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flutter局部刷新优化性能

Flutter局部刷新优化性能

作者头像
用户1974410
发布2022-09-20 16:27:16
1.3K0
发布2022-09-20 16:27:16
举报
文章被收录于专栏:flutter开发精选

局部刷新优化性能

Flutter状态类:

  • StatelessWidget:无状态类,没有状态更新,界面一经创建无法更改;
  • StatefulWidget:有状态类,当状态改变,调用setState()方法会触发StatefulWidget的UI状态更新,自定义继承StatefulWidget的子类须重写createState()方法。

案例:

当我们调用有状态类的setState方法时会遍历每一个子Widget的State.build刷新状态, 这将是一笔很大的性能开销,所以我们需要使用局部刷新来进行优化。

普通刷新方式

代码语言:javascript
复制
class TestRoute extends StatefulWidget {
  @override
  _TestRouteState createState() => _TestRouteState();
}

class _TestRouteState extends State<TestRoute> {
  int count = 0;

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

一个有状态类定义一个变量然后按钮的事件调用setState让这个变量进行刷新,

使用GlobalKey局部刷新方式

我们还是用上面的例子,只是通过GlobalKey的方式只刷新局部的Text,

代码语言:javascript
复制
class TestRoute extends StatefulWidget {
  @override
  _TestRouteState createState() => _TestRouteState();
}

class _TestRouteState extends State<TestRoute> {
  int count = 0;

  GlobalKey<TextWidgetState> textKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return new Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        new TextWidget(textKey), //需要更新的Text
        new FlatButton(
          onPressed: () {
            count++; // 这里我们只给他值变动,状态刷新交给下面的Key事件
            textKey.currentState.onPressed(count);
          },
          child: new Text('按钮 $count'),
        ),
      ],
    );
  }
}

// 封装的文本组件Widget
class TextWidget extends StatefulWidget {
  final Key key;

  // 接收一个Key
  TextWidget(this.key);

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

class TextWidgetState extends State<TextWidget> {
  String _text = "0";

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

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

效果:

可以明显的看到按钮的count并无变动,但需要更新的文本组件更新了值,已经完美实现了局部刷新。

实现原理:

textKey是一个GlobalKey类型的Key范型为TextWidgetState(封装的文本&&有状态类), 所以这个Key可以通过currentState方法调用到类里面的onPressed方法, 而onPressed方法刚好有调用setState来刷新局部状态。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 flutter开发精选 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 局部刷新优化性能
  • 普通刷新方式
  • 使用GlobalKey局部刷新方式
  • 效果:
  • 实现原理:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档