Flutter中回调函数

2023-11-08

一、前言

如果对回调函数概念了解的话可以跳过本段内容和第二段内容

在实际开发工作中,有些时候会需要用到回调函数。对应实际生活中的例子,就好像你在网上定了个外卖,然后外卖会在某个时刻送到你手里。在这期间你可以做其他的事情,也不需要关注外卖是怎么做的,怎么送到你手里。

所以回调函数常常用在对某个事件执行时间不确定,需要在这个事件出结果后能主动通知自己的程序逻辑。在程序中的例子就好像是,去执行了一段逻辑,但是不知道这个逻辑什么时候返回结果,需要在逻辑执行完后告诉自己结果再进行下一步操作。

在Flutter中的话可以举这样一个例子,假如有个功能是一个类似于音乐播放器的功能(这个音乐播放器一般来说都是一个单独的模块,使用系统的或者第三方的,反正很少自己去写)。我们需要在音乐播放完毕的时候告诉我们音乐放完了。因为我们不知道音乐什么时候会播放完,所以这时候就需要使用回调函数了。

下面根据这个功能做一个简单的演示程序(这个演示程序没有页面,可以在https://dartpad.cn/ 中进行测试)。后续的几种接口回调的方式都是不同的接口回调的改写

二、示例代码

这个示例代码是一个音乐播放器的代码,三秒后音乐播放停止触发接口回调。

main(){
 MediaPlayer mediaPlayer = MediaPlayer();
    mediaPlayer.setCompleteCallbackListener((){
      print("播放结束了");
    });
    mediaPlayer.start();
}

//播放器
class MediaPlayer{

  Function completeCallback;


  start(){
    print("开始播放音乐");

    //以下为延迟3秒后停止音乐播放器
    Future.delayed(Duration(seconds: 3))
        .then((value) => 
                     completeCallback()
                   );

  }

  setCompleteCallbackListener(Function completeCallback){
    this.completeCallback = completeCallback;
  }

}

二、函数

一般来说回调函数都是使用函数来写的,在Dart中,函数是的类型使用Function进行表示。简单示例如下(关于函数的详细解释不是本篇重点):

//省略返回值
test1(){
  print('111111');
}
//携带返回值
void test2(){
  print('22222222');
}

三、定义一个函数变量:

Dart中可以将函数定义为一个变量,代码如下:

import 'package:flutter_test/flutter_test.dart';
main(){
   test('测试函数', (){
      function1();
   });
}
final Function function1 = (){
  print('YM---->函数调用');
};

四、函数回调的写法1-Function:

Dart里面可以把函数作为形参使用,因此回调函数可以使用以下写法:

import 'package:flutter_test/flutter_test.dart';

main(){
   test('测试函数', (){
     testF((){
       print('YM---->回调函数触发');
     });
   });
}

void testF(Function callBack){
  callBack();
}

根据上述知识可以将函数变量赋值与调用的地方分开,来满足实际开发中业务的需要,代码如下:

import 'package:flutter_test/flutter_test.dart';

main(){
   test('测试函数', (){
     testF((){
       print('触发回调函数');
     });
     testF1();
   });
}

Function function1;

void testF(Function callBack){
  function1 = callBack;
}

void testF1(){
  function1();
}

在实际业务中有时候会在函数中传递一些参数,所以代码可以改写为以下方式:

import 'package:flutter_test/flutter_test.dart';

main(){
   test('测试函数', (){
     testF((int result){//添加参数,类型为int
       print('触发回调函数:$result');
     });
     testF1();
   });

}

Function function1;

void testF(Function callBack){
  function1 = callBack;
}

void testF1(){
  function1(10);
}

五、函数回调的写法2-typedof:

通过上述方式可以发现,函数回调无法限定参数和返回值,这样在编码中容易出现很多潜在的错误,因此可以使用typedof进行限制,代码如下:

ps:typedef的含义是给某一种特定的函数类型起了一个名字,可以认为是一个类型的别名。这样在使用过程中就会进行类型检查

import 'package:flutter_test/flutter_test.dart';

main(){
   test('测试函数', (){
     testF((int result){//添加参数,类型为int
       print('触发回调函数:$result');
     });
   });
}

// typedef FunctionTest = Function();//定义成这样也是可以的
typedef Function2<int> = void Function(int result);//限定参数和返回值

void testF(Function2<int> function2){
  function2(12);
}

六、函数回调的写法3-系统默认:

以上的代码属于Dart中的写法,可以说各个平台都可以使用,不过在日常开发中Flutter也提供了一些默认的回调函数,使我们日常开发更加简洁,这里简单举几个例子,代码如下:

VoidCallback无参回调

这里要注意导入相应包import 'package:flutter/cupertino.dart';

import 'package:flutter/cupertino.dart';
import 'package:flutter_test/flutter_test.dart';

main(){
   test('测试函数', (){
     testF((){
       print('触发回调函数');
     });
     testF2();
   });

}

VoidCallback _voidCallback;

void testF(VoidCallback callback){
  _voidCallback = callback;
}

void testF2(){
  _voidCallback();
}

ValueChanged有参回调

这里要注意导入相关的包import 'package:flutter/cupertino.dart';

import 'package:flutter/cupertino.dart';
import 'package:flutter_test/flutter_test.dart';

main(){
   test('测试函数', (){
     testF((int result){
       print('触发回调函数:$result');
     });
     testF2();
   });

}

ValueChanged<int> _valueCallback;

void testF(ValueChanged<int> callback){
  _valueCallback = callback;
}

void testF2(){
  _valueCallback(10);
}

关于系统更多的回调函数,可以查看系统源码.

ps: 以上定义的参数类型可以省略,只写参数名,不过为了规范以及减少错误,最好写上

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter中回调函数 的相关文章

随机推荐

  • 基于时间序列的回归问题(4)——时间序列预测的基本思路

    前言 大家好 这个系列之前以及写了几篇博客 都是对于时间序列回归预测的一些前期准备知识 相信很多人 包括笔者在内 第一次接触这种项目 可能大体的思路方案都不是很清楚 那么 这么博客将为大家梳理一下做基于时间序列数据回归预测问题的大体思路 1
  • 线性代数——矩阵的初等变换

    矩阵的初等变换 矩阵的初等变换分为初等行变换和初等列变换 初等变换矩阵与矩阵之间用箭头连接 不能用等号 初等行变换 交换两行 用k k 0 乘以某一行 某一行的1倍加到某一行上去 定理1 任何矩阵都可通过初等变换化为标准形 行变换和列变换都
  • eclipse实用配置

    在eclipse打开当前文件在本地电脑中所在的路径配置 Run gt External Tools gt External Tools Configurations new 一个 program location 里面填 C WINDOWS
  • 一文带你从零到一深入透析 @RefreshScope 结合 Nacos 动态刷新源码

    嗨 您好 我是 vnjohn 在互联网企业担任 Java 开发 CSDN 优质创作者 推荐专栏 Spring MySQL Nacos Java 后续其他专栏会持续优化更新迭代 文章所在专栏 Nacos 我当前正在学习微服务领域 云原生领域
  • 学生php实训个人总结300字,实训总结300字通用版5篇

    导语 实训目的要明确 在理论上验证定理 公式 算法 并使实验者获得深刻和系统的理解 在实践上 掌握使用实验设备的技能技巧和程序的调试方法 一般需说明是验证型实验还是设计型实验 是创新型实验还是综合型实验 无忧考网为大家整理的实训总结300字
  • 使用 AWK 去掉文本文档中的空白行

    在 Linux 操作系统中 可以使用 AWK 命令高效地处理文本文档 AWK 命令通过执行使用 AWK 语言编写的脚本程序 处理文本文档 AWK 脚本程序是由模式 patterns 与相关操作 corresponding actions 组
  • 基于空间平滑MUSIC算法的相干信号DOA估计(2)

    空间平滑MUSIC算法 2 继续上一篇博客 继续讲后向空间平滑和前 后向空间平滑MUSIC算法 基于空间平滑MUSIC算法的相干信号DOA估计 1 2 3 后向空间平滑算法 后向空间平滑更准确的说是共轭后向空间平滑 它是对后向子阵列地共轭接
  • mysql数据库用户管理和权限控制

    文章目录 1 用户管理 1 1 查询用户 1 2 创建用户 1 3 修改用户密码 1 4 删除用户 2 权限控制 2 1 查询用户权限 2 2 授予权限 2 3 取消权限 2 4 多个权限用逗号隔开 1 用户管理 1 1 查询用户 USE
  • 【转】在 Bash 中使用 -exec 选项和 find 命令搜索文件

    转自 https www delftstack com zh howto linux linux find exec 我们可以使用带有 exec 选项的 find 命令来查找包含我们要搜索的文本的文件 主要概念是使用 find 命令获取工作
  • 关于HTML页面跳转的5种方法分享。

    转自 微点阅读 https www weidianyuedu com 五个例子来详细说明 这几个例子的主要功能是 在5秒后 自动跳转到同目录下的hello html 根据自己需要自行修改 文件 1 html的实现 1 2 3 4 5 6
  • TCP的Ack和Seq和len的关系

    详细可以看 不抓包 如何学得了 TCP这篇文章 关系 发送数据包 数据的序号Seq和数据的长度Len 发送seq len 确认包 Ack 收到的数据包的序号Seq Len ack seq len 发送数据包的
  • 十大排序算法

    十大排序对比表格 中文名称 英文名称 平均时间复杂度 最坏时间复杂度 最好时间复杂度 空间复杂度 稳定性 选择排序 Selection O O O O 1 不稳定 冒泡排序 Bubble O O O O 1 稳定 插入排序 Insertio
  • selenium中隐藏元素如何定位

    1 什么是隐藏元素 前端通过一些属性来控制元素隐藏 type hidden style display none margin设为负值 z index控制元素堆叠顺序 2 定位隐藏元素 定位隐藏元素与定位普通元素没什么区别 from sel
  • ActiveMQ 反序列化漏洞(CVE-2015-5254)漏洞复现vulhub

    ActiveMQ 反序列化漏洞 CVE 2015 5254 Apache ActiveMQ是美国阿帕奇 Apache 软件基金会所研发的一套开源的消息中间件 它支持Java消息服务 集群 Spring Framework等 Apache A
  • 从工具了解大数据之Kettle

    最近沉迷Python爬虫学习 很有意思 即时刹车 坚持一步一学习 一步一整理 Kettle目前工作用于数据库搬运 例如Oracle定时搬运到mysql中间表 以便于加速查询 1 相关学习资料 尚硅谷 大数据技术之Kettle视频教程 网盘资
  • /libcublas.so.11: symbol cublasLtHSHMatmulAlgoInit version libcublasLt.so.11 not defined in file lib

    GLUE root cd163c5c74c9 cd root miniconda3 GLUE root cd163c5c74c9 miniconda3 ls LICENSE txt bin compiler compat conda met
  • Aruba为边缘赋“能”

    点击上方关注我们 我们不断重复着 万物互联 万物智能 那些曾在电影中多次出现的带有科幻意味的 智能 今天已经在生活中变成现实 而我们似乎已经对此见怪不怪 我们有充足的理由相信 云 AI 5G 将再次颠覆整个世界 哦 对了 必须再加上一个 边
  • Zotero插件「Better BibTex」实现自定义导出格式

    Better BibTex插件设置 介绍 实现 最近在撰写论文时 由于发现Zotero Better BibTex导出参考文献时 会与Google Scholar上有诸多不一致 引起了很多不必要的麻烦 奈何网上关于如何自定义导出格式的教程寥
  • Python数据分析,学习路径拆解及资源推荐(附详细思维导图)

    关于Python数据分析 其实网上能够找到的学习资源很多 主要分为两类 一类是提供各种资源的推荐 比如书单 教程 以及学习的先后顺序 另一类是提供具体的学习内容 知识点或实际案例 但很多繁琐而又杂乱的内容 除了给初学者增加理解和认识的噪音外
  • Flutter中回调函数

    文章目录 一 前言 二 示例代码 二 函数 三 定义一个函数变量 四 函数回调的写法1 Function 五 函数回调的写法2 typedof 六 函数回调的写法3 系统默认 一 前言 如果对回调函数概念了解的话可以跳过本段内容和第二段内容