Flutter | 使用 typedef 让回调更优雅

news2024/11/28 18:53:31

今天来谈谈 Flutter 的 typedef

一. 熟悉的 VoidCallback

之前看 setState 源码的时候,发现它的参数是 VoidCallback

void setState(VoidCallback fn) {}

VoidCallback 其实是一个自定义类型的无参数无返回值的匿名函数:

/// Signature of callbacks that have no arguments and return no data.
typedef VoidCallback = void Function();

不得不说 Flutter 官方的命名就是好,光看名字就知道它是做什么的:void 回调(狗头)。

看到它的第一眼我想到的是 OC 的 dispatch_block_t

源码:

typedef void (^dispatch_block_t)(void);

文档:

The type of blocks submitted to dispatch queues, which take no argument and have no return value.

也是无参数无返回值的回调。

不能说完全一样,只能说一模一样,毕竟思想都是相通的嘛。

二. 有什么用?

想知道有什么用,先看看官方怎么用,再想想官方为什么这么用。

除了那个 setState,Flutter 源码中 VoidCallback 的身影经常出现,要么做属性,要么做参数。

为什么要用 VoidCallback?直接 void Function() 不行吗?

不是不行,VoidCallback 相对 void Function(),更加简洁,可读性也更强。

因为这种无参数无返回值的回调会经常使用到,所以官方设计了这个自定义类型。

说白了就是代码封装,方便使用。

VoidCallback 相当于是对那种无参数无返回值的回调进行了一层封装,并且给它取了一个名字,下次使用,直接叫它的名字。

三. 举例说明

比如选择城市页面,选择了城市需要执行回调,将城市名传出去,回调可以这样写:

/// 选择了城市的回调
typedef ChosenCityCallback = void Function(String city);

使用:

class ChooseCityPage extends StatefulWidget {
  final ChosenCityCallback chosenCityCallback;
  ChooseCityPage({
    Key? key,
    required this.chosenCityCallback,
  }) : super(key: key);

  @override
  _ChooseCityPageState createState() => _ChooseCityPageState();
}

回调:

ChooseCityPage(chosenCityCallback: (city) {
  print(city);
});

四. 官方推荐

不要使用弃用的 typedef 语法

优先使用内联函数类型

注意:如果函数类型特别长或经常使用,那么还是有必要使用 typedef 进行定义。

学废了吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mybatis之配置优化and映射器

环境配置: mybatis可以配置成适应多种环境,但是要记住,尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境。 虽然,MyBatis 中有两种类型的事务管理器:type("[JDBC|MANAGED]")…

Web进阶:Day3 移动端特点、百分比布局、Flex布局、实战演练

Web进阶:Day3 Date: January 7, 2023 Summary: 移动端特点、百分比布局、Flex布局、实战演练 移动端特点 移动端和PC端网页不同点 PC端网页和移动端网页的有什么不同? PC屏幕大,网页固定版心 手机屏幕小, 网页宽度多数为100%…

【Docker】(五)使用bind mounts修改Docker容器中的Nginx配置

1.前言 本系列文章记录了从0开始学习Docker的过程,Docker系列历史文章: (一)基本概念与安装使用 (二)如何使用Docker发布一个SpringBoot服务 (三)使用registry远程镜像仓库管理镜像…

axios拦截器、ElementUI

一、axios拦截器 1、axios模块的作用 是对基于http请求的封装。在浏览器对异步请求对象XMLHttpRequest进行封装 2、拦截器 ​ (1)请求拦截器:对客户端发起的请求进行统一的前期处理(token、时间戳、cookie等) ​ …

linux系统中利用QT实现绘制图和图标的方法

大家好,今天主要和大家聊一聊,如何使用QT进行绘图和图标的方法。 第一:绘图和图表简介 绘图与图表在嵌入式里有的比较多,尤其是图表,我们常在股票里看到的“图表折线/曲线图/饼状图等”都可以用 Qt 的图表来实现。绘图…

生产制造业如何谋求数字化转型?需要哪些信息化系统做支撑?

生产制造业数字化转型有什么思路?生产制造业需要哪些信息化系统做支撑? 近年来,围绕新产品新模式新业态,国家重点部署了7个方向,包括数字化管理、平台化设计、智能化生产、网络化协同、个性化定制、服务化延伸、新型智…

Revit图纸问题:设置dwg图纸显示顺序和批量图纸编号

一、Revit中设置导入的dwg图纸的显示顺序 我们在实际工作中经常需要将各种DWG图纸导入到revit中进行参考,有时候希望它盖住已有模型,有时候又需要它在模型以下显示,即实现类似于CAD的图层显示顺序功能,应该如何才能实现呢&#xf…

Window Server 2022 无法安装网卡驱动 1219-v

安装过win10的朋友都知道,win10基本上不用自己下载驱动. 插上网线就能用. 但是今天在server2022上,死活无法安装成功. 原因有很多,网上也有很多资料. 重点: 其实不需要修改驱动配置, 只需要在驱动中选择对应驱动,比如: 1219[x]-LM,x标识很多版本,选择一个低一点的就可以了. …

MySQL - explain 执行计划详解

explain显示了MySQL如何使用索引来处理select语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句。 explain 查询结果如下: 字段说明: 列名说明id id列的编号是select的序列号,有几个select就有几个id,并…

IPEmotion的NVH噪声测试模块——坎贝尔图

德国IPETRONIK的IPEmotion软件除了可以对之前介绍的热管理试验及热管理台架试验、电性能试验和道路试验等各种进行基本的温度、模拟量和数字信号的采集分析外,无论专业版、开发版还是分析版均支持噪声分析模块。该模块支持噪声数据离线后处理,包括Campbe…

如何通过大数据赋能产业园区高质量发展

2022年年底,中共中央、国务院印发了《关于构建数据基础制度更好发挥数据要素作用的意见》(以下简称《数据二十条》),以《数据二十条》出台为标志,我国数字经济发展从技术引领进入到数据驱动的新阶段,加快构建数据基础制度&#xf…

LINUX提权之第三方服务提权篇

前言 上一篇文章讲了一下环境变量提权不知道大家学习的怎么样了,今天给大家带来新的提权知识——“第三方服务提权”,本文会深入浅出讲解一下第三方服务提权的原理以及例子。 第三方服务 所谓的第三方服务可以大致理解为系统中安装的软件(…

机器人中的数值优化|【二】最速下降法,可行牛顿法的python实现,以Rosenbrock function为例

机器人中的数值优化|【二】最优化方法:最速下降法,可行牛顿法的python实现,以Rosenbrock function为例 在上一节中提到了我们详细探讨了数值优化/最优化理论中的基本概念和性质,现在开始使用python对算法进行实现。上一节链接&am…

CVE-2021-25296 复现

# 漏洞描述 名称&#xff1a;Apache OFBiz rmi反序列化漏洞 cve编号&#xff1a;cve-2021-25296 危害&#xff1a;未授权远程命令执行 影响版本&#xff1a;Apache OFBiz < 17.12.06 OFBiz是一个非常著名的电子商务平台&#xff0c;是一个非常著名的开源项目&#xff0…

Python识别屏幕题目并模拟做题

前言 马上就要过年了&#xff0c;有许多小伙伴们本本还没拿到&#xff0c;还在苦苦刷题&#xff0c;一直及格不了&#xff0c;现在&#xff0c;我们用Python模拟做题&#xff0c;看看效果。 环境使用 python 3.9pycharm 模块使用 requestsreselenium谷歌驱动 import reimpor…

动态规划|474. 一和零

题目看上去很唬人&#xff0c;但是恰恰是这样说明该题设计的目的很强&#xff0c;指向dp的01背包&#xff0c;就是为了考01背包设计的。 像极了中学时代的那种看上去花里胡哨&#xff0c;实质上是根据考点设计出题的题目。&#xff08;这种题看破出题意图&#xff0c;往往都很简…

电脑是自动获取ip,VMware安装linux时候,设置固定ip并且能访问外网

首先虚拟机网络模式是NAT模式。设置主机名和打开网络&#xff0c;也可以不设置主机名&#xff1a;安装好后&#xff0c;设置linux的ip地址。执行vi /etc/sysconfig/network-scripts/ifcfg-ens33&#xff0c;修改里面的ip配置&#xff1a;注意IP的范围。查看ip的范围的方法如下图…

Day 5 Spring的后处理器

1 Spring后处理器Spring的后处理器是Spring对外开发的重要扩展点&#xff0c;允许我们介入到整个Bean实例化流程中来&#xff0c;以达到动态注册BeanDefinition&#xff0c;动态修改BeanDefinition&#xff0c;以及动态修改Bean的作用。BeanFactoryPostProcessor: Bean工厂后处…

基于蜜蜂算法求解电力系统经济调度(Matlab代码实现)

目录 1 蜜蜂优化算法 1.1 蜂群觅食机制 1.2 蜜蜂算法 1.3 流程 2 经济调度 3 运行结果 4 参考文献 5 Matlab代码实现 1 蜜蜂优化算法 蜜蜂算法( Bees Algorithm&#xff0c;BA) 由英国学者 AfshinGhanbarzadeh 和他的研究小组于 2005 年提出。该算法是一种有别于蚁群…

学习使用php获取数组最大值并返回对应键名max和array_search函数,最后一个元素的值使用end函数

在php中&#xff0c;可以使用max函数和array_search函数获得数组的最大值&#xff0c;同时获得最大值对应的键名解决方案打印结果解决方案 使用max函数获得数组的最大值&#xff0c;并使用array_search函数找到最大值对应的键名&#xff0c;键名保存在$key变量中。 end() 函数…