类似于Android中的Callback;iOS中的block;大致思路是一样的,需要自定义一个函数或者使用官方自己的也行,直接上代码:
先写一个按钮点击事件,然后监听点击事件;
import 'package:flutter/material.dart';
/*
* 按钮监听->回调
* */
//第一种自定义回调方法
typedef MyCallBackFuture = Future Function();
class MyCallBack extends StatelessWidget {
@required
VoidCallback onPress; //第二种:回调函数的签名,没有参数,也不返回数据。
//MyCallBackFuture myCallBackFuture;//自定义
MyCallBack(VoidCallback onPress) {
this.onPress = onPress;
}
// MyCallBack(MyCallBackFuture callBack) {
// this.myCallBackFuture = callBack;
// }
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: FlatButton(
onPressed: onPress, //或者 callBack
child: Text(
'按钮',
style: TextStyle(
fontSize: 16.0,
color: Colors.black,
),
),
color: Colors.green,
),
),
);
}
}
然后运行,在MyCallBack构造方法中传入相应函数,实现回调;
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
home: new MyCallBack(onPress),//或者click
// new MyHomePage(),
);
}
}
//第一种
Future click() {
//todo do some thing
print("click.......");
}
//第二种
void onPress(){
print("onPress.......");
}
总结:
俩种方法使用起来基本一样,其实官方还定义了好多回调方法,可以自行查看源码(window.dart);最主要是就是Future;
Dart是单线程编程语言,如果任何代码阻塞线程执行都会导致程序卡死(IO操作、延时执行等).异步编程防止出现阻塞操作.Dart使用Future对象表示异步操作.
Dart有自己的线程机制,叫isolate(隔离),App的启动入口main函数就是一个isolate,我们也可以通过导入import 'dart:isolate'创建自己的isolate,对于多核CPU来说,多个isolate可以提高运算效率,但应在合理范围内;Dart中的isolate之间无法直接共享内存,不同的isolate之间只能通过isolate API进行通信;
什么是Future
Future表示在将来某事获取一个值的方式.当一个返回Future的函数被调用的时候,做了俩件事:
1、函数把自己放入队列和返回一个未完成的Future对象.
2、之后当值可用时,Future带着值变成完成状态.
为了获取Future的值,有俩种方式:
1、使用async和await.
2、使用Future的接口.
说async和await
- await关键字必须在async函数内部使用;
- 调用async函数必须使用await关键字;
Dart线程中有一个消息循环机制(event loop)和俩个队列(event queue和microtask queue).
- event queue包含所有外来的事件:IO操作,手势、绘制、延时以及isolate之间的通信等.任意isolate中新增的event都会放入event queue中排队等待执行.
- microtask queue只在当前isolate的任务队列中排队,优先级高于event queue.
当事件循环正在处理microtask的时候,event queue会被堵塞.
Future就是event;
网友评论