返回顶部
首页 > 资讯 > 移动开发 >Flutter中使用setState时的6个简单技巧总结
  • 399
分享到

Flutter中使用setState时的6个简单技巧总结

2024-04-02 19:04:59 399人浏览 安东尼
摘要

目录前言setState 有什么用??技巧 1:保持## widgets小!?技巧 2:不要在构建方法中调用 setState?技巧 3:不要在 initState 方法中调用 se

前言

setState 函数是在 Flutter 应用程序中管理状态的最基本方法。以下是一些保持应用可维护性的最佳实践。

StatefulWidget 的 setState 函数是一种在 Flutter 应用程序中管理状态的简单方法。但是,当您希望您的应用程序正常工作和高性能时,您需要避免几个陷阱。以下是您应该坚持的一些最佳实践。

setState 有什么用?

setState 是Flutter发出 rebuild (重建)当前 widget 及其后代的方式。在 rebuild 过程中,最新的变量值将被用于创建用户界面。比方说,一个用户将一个开关从打开切换到关闭。该开关有一个存储该值的支持变量,所以在改变之后,它被设置为 false。开关本身并不反映这一变化,直到它被重建为新的支持字段值。

  • 更改值
  • 调用 setState()
  • 用户界面已更新

?技巧 1:保持## widgets小!

setState 触发了对你当前所在的小组件的重建。如果你的整个应用程序只包含一个widget,那么整个widget将被重建,这将使你的应用程序变得缓慢。请看下面的例子。

import 'package:flutter/material.dart';

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  State<Home> createState() => _State();
}

class _State extends State<Home> {
  bool _tile1 = false;
  bool _tile2 = false;
  bool _tile3 = false;
  bool _tile4 = false;
  bool _tile5 = false;

  @override
  Widget build(BuildContext context) {
    print("built method Home"); // <-- setState triggers build here!
    return Scaffold(
        appBar: AppBar(title: const Text("Demo")),
        body: Center(
            child: Column(
                crossAxisAlignment: CrossAxisAlignment.center,
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
              SwitchListTile(
                  activeColor: Colors.green,
                  inactiveThumbColor: Colors.red,
                  title: Text("Switch is ${_tile1 ? "on" : "off"}"),
                  value: _tile1,
                  onChanged: (_) {
                    setState(() {
                      _tile1 = !_tile1;
                    });
                  }),
              SwitchListTile(
                  activeColor: Colors.green,
                  inactiveThumbColor: Colors.red,
                  title: Text("Switch is ${_tile2 ? "on" : "off"}"),
                  value: _tile2,
                  onChanged: (_) {
                    setState(() {
                      _tile2 = !_tile2;
                    });
                  }),
              SwitchListTile(
                  activeColor: Colors.green,
                  inactiveThumbColor: Colors.red,
                  title: Text("Switch is ${_tile3 ? "on" : "off"}"),
                  value: _tile3,
                  onChanged: (_) {
                    setState(() {
                      _tile3 = !_tile3;
                    });
                  }),
              SwitchListTile(
                  activeColor: Colors.green,
                  inactiveThumbColor: Colors.red,
                  title: Text("Switch is ${_tile4 ? "on" : "off"}"),
                  value: _tile4,
                  onChanged: (_) {
                    setState(() {
                      _tile4 = !_tile4;
                    });
                  }),
              SwitchListTile(
                  activeColor: Colors.green,
                  inactiveThumbColor: Colors.red,
                  title: Text("Switch is ${_tile5 ? "on" : "off"}"),
                  value: _tile5,
                  onChanged: (_) {
                    setState(() {
                      _tile5 = !_tile5;
                    });
                  })
            ])));
  }
}

这里我们在一个 Column 中有 5 个 SwitchListTile 小部件,它们都是同一个小部件的一部分。

如果您切换任何控件,整个屏幕都会被重建。 Scaffold, AppBar, Column, ... 但只要重建已更改的小部件就足够了。让我们看下一个代码示例:

import 'package:flutter/material.dart';

class Home2 extends StatefulWidget {
  const Home2({Key? key}) : super(key: key);

  @override
  State<Home2> createState() => _State();
}

class _State extends State<Home2> {
  @override
  Widget build(BuildContext context) {
    print("built method Home2");
    return Scaffold(
        appBar: AppBar(title: const Text("Demo")),
        body: Center(
            child: Column(
                crossAxisAlignment: CrossAxisAlignment.center,
                mainAxisAlignment: MainAxisAlignment.center,
                children: const <Widget>[
              Switch(),
              Switch(),
              Switch(),
              Switch(),
              Switch()
            ])));
  }
}

class Switch extends StatefulWidget {
  const Switch({Key? key}) : super(key: key);

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

class _SwitchState extends State<Switch> {
  bool _value = false;

  @override
  Widget build(BuildContext context) {
    print("build method Switch"); // <-- setState triggers build here!
    return SwitchListTile(
        activeColor: Colors.green,
        inactiveThumbColor: Colors.red,
        title: Text("Switch is ${_value ? "on" : "off"}"),
        value: _value,
        onChanged: (_) {
          setState(() {
            _value = !_value;
          });
        });
  }
}

在这里,我们将 SwitchListTile 包装在单个 StatefulWidget 中。页面看起来相同,但如果您单击此示例中的任何开关,则只有单击的小部件将重建。

?技巧 2:不要在构建方法中调用 setState

来自 Flutter api 文档

这个方法有可能在每一帧中被调用,除了建立一个小部件外,不应该有任何副作用。

build 方法旨在构建小部件树,因此我们应该保持这种方式。不要在这里做花哨的事情,它会减慢你的应用程序。对setState的调用可能会触发额外的重建,在最坏的情况下,你可能最终会出现一个异常,告诉你目前有一个重建正在进行。

?技巧 3:不要在 initState 方法中调用 setState

initState 将在完成后触发重建,因此无需在此方法中调用 setState。此方法旨在初始化与状态相关的属性,例如设置默认值或订阅流。不要在这里做任何其他事情!

?技巧4:setState()和setState(...)是相等的

像这样使用 setState 没关系

setState((){
  _text = “Hello”;
});

或者像这样

_text = “Hello”;
setState((){});

结果是一样的。

?技巧 5:setState(...) 代码必须很小

不要在setState内做任何大的计算,因为它将阻止你的应用程序重绘。请看下面的示例代码:

setState(() {
  for (var i = 0; i < 10000; i++) print(i);
  _value = true;
});

只有在打印语句之后,小部件才会重建。在这段时间里,你的应用程序不会对用户的操作做出反应,它将在之后执行这些操作。因此,如果用户因为没有视觉反馈而多次点击一个控件,多次重建就会堆积起来,会使应用程序的速度更慢。

一个更好的方法是在执行一个长期运行的操作时显示一个进度指示器,这样用户就知道正在发生一些事情,他需要等待完成。

?技巧 6:setState(...) 代码不能是异步的

运行代码时

setState(() async {
  await Future.delayed(const Duration(seconds: 5));
});

你最终会得到一个类似这样的异常信息:

在方法之外执行异步操作,然后调用它。

结束

我希望这些见解能帮助你更好地理解Flutter中setState的机制。坚持这些技巧,你会有更少的问题和更快的应用程序。源代码例子可以在GitHub上找到。

到此这篇关于Flutter中使用setState时的6个简单技巧的文章就介绍到这了,更多相关Flutter使用setState的技巧内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Flutter中使用setState时的6个简单技巧总结

本文链接: https://lsjlt.com/news/149748.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Flutter中使用setState时的6个简单技巧总结
    目录前言setState 有什么用?技巧 1:保持## widgets小!技巧 2:不要在构建方法中调用 setState技巧 3:不要在 initState 方法中调用 setSt...
    99+
    2024-04-02
  • Android开发组件flutter的20个常用技巧示例总结
    目录 1.map遍历快速实现边距,文字自适应改变大小2.使用SafeArea 添加边距3.布局思路4.获取当前屏幕的大小5.文本溢出显示省略号6.一个圆角带搜索icon的搜...
    99+
    2024-04-02
  • java中Callback简单使用总结
    1、什么是Callback,什么时候需要使用Callbackcallback是回调的意思,一般我们需要2个类需要相互掉用,一个类把数据动态传递给另外一个类的时候,可以用这种方式,比如Android里面的Launcher类和LauncherM...
    99+
    2023-05-31
    java callback ava
  • 总结分享10个超棒的JavaScript简写技巧
    目录1.合并数组2.合并数组(在开头位置)3.克隆数组4.解构赋值5.模板字面量6.For循环7.箭头函数8.在数组中查找对象9.将字符串转换为整数10.短路求值补充几点编码习惯1....
    99+
    2024-04-02
  • Android中Glide库的使用小技巧总结
    简介在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。https://githu...
    99+
    2023-05-30
    android glide库 使用技巧
  • 优化SQL SELECT语句性能的6个简单技巧分别是什么
    本篇文章给大家分享的是有关优化SQL SELECT语句性能的6个简单技巧分别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。SELECT语...
    99+
    2024-04-02
  • Linux系统中sudo命令的十个技巧总结
    前言 在linux和其他类Unix操作系统中,只有root用户可以运行所有命令并在系统上执行某些关键操作,如安装和更新,删除包,创建用户和组,修改重要的系统配置文件等。 然而,承担root用户角色的系统管理员可以允...
    99+
    2022-06-04
    linux sudo命令 linux的sudo命令 linux中sudo命令
  • 一些让Python代码简洁的实用技巧总结
    目录前言1. 使用Lambda来修改Pandas数据框中的值2. 使用f-string来连接字符串3. 用Zip()函数对多个列表进行迭代4. 使用列表理解法5. 对文件对象使用wi...
    99+
    2024-04-02
  • Vue项目中常用的实用技巧总结
    本篇内容主要讲解“Vue项目中常用的实用技巧总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue项目中常用的实用技巧总结”吧!目录前言 使用 $attrs 和 $listeners 进行多层...
    99+
    2023-06-20
  • dos批处理命令的使用技巧总结
    本篇内容介绍了“dos批处理命令的使用技巧总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!截取字符串: set var=10203040 ...
    99+
    2023-06-08
  • Python数据处理的26个Pandas实用技巧总结
    目录从剪贴板中创建DataFram将DataFrame划分为两个随机的子集多种类型过滤DataFrameDataFrame筛选数量最多类别处理缺失值一个字符串划分成多列Series扩...
    99+
    2024-04-02
  • Win7系统组策略的几个常用技巧总结
    第一.限制、隐藏磁盘分区 为了使用方便,我们有时也在多人共用的公用电脑中存放一些属于个人隐私级别的数据资料,为了保证这些数据的安全,可以通过对磁盘分区进行限制或隐藏来实现对数据的保护。 在打开的“组策略&rd...
    99+
    2023-05-29
    win7 组策略 常用 技巧 Win7
  • Tomcat配置必备的10个小技巧用法总结
    目录一、配置系统管理(Admin Web Application)二、配置应用管理(Manager Web Application)三、部署一个web应用四、配置虚拟主机(Virtu...
    99+
    2023-05-19
    Tomcat 配置技巧总结 Tomcat 配置技巧 Tomcat 配置
  • 简单总结SpringMVC拦截器的使用方法
    SpringMVC拦截器 拦截器类似于Filter过滤器,它是springMVC特有的,它可以预处理和后处理,我们可以定义一些拦截器来实现特定的业务。 过滤器与拦截器本质区别: (1...
    99+
    2024-04-02
  • 28个JavaScript常用字符串方法以及使用技巧总结
    目录前言1. 获取字符串长度2. 获取字符串指定位置的值(1)charAt()(2)charCodeAt()3. 检索字符串是否包含特定序列(1)indexOf()(2)lastIn...
    99+
    2024-04-02
  • 81个必看的Win8使用技巧大总部
    Windows8新一代操作系统已经发布了,现在有一部分偿鲜的网虫开始使用了,但因为现在市场上还没有合适的教程,就是在图书馆里找一本像样的Win8教材都找不到,今天在逛网的时候找到一个收集必看的81个Win8...
    99+
    2022-06-04
    必看 使用技巧 总部
  • Windows命令提示符使用技巧总结(以备不时之需)
      点击“开始→程序→附件→命令提示符”或“开始→运行”,再输入“CMD”进入命令即可提示符状态。   或者...
    99+
    2023-06-04
    windows 命令提示符 Windows 技巧 使用
  • Go应用中优雅处理Error的技巧总结
    目录前言用户自定义类型上下文数据原因(Causes)组件(Component)响应类型(ResponseType)重试GoError 接口抽象error结论前言 Go语言很强大并且现...
    99+
    2024-04-02
  • 6个使用KeePassX保护密码的技巧分别是什么
    本篇文章为大家展示了6个使用KeePassX保护密码的技巧分别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。虽然安全是个深奥的主题,但是你可以遵循几个简单的日常习惯来减小攻击面。本文将解释确保...
    99+
    2023-06-04
  • 一个简单的toolabar结合drawlayout使用方法
    本文实例为大家分享了toolabar结合drawlayout使用方法,供大家参考,具体内容如下package alice.bw.com.day03toolabardrawlayout;import android.support.v7.ap...
    99+
    2023-05-30
    toolabar drawlayout
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作