Flutter中的方法回调

作者: 哎呀啊噢 | 来源:发表于2019-07-17 18:04 被阅读0次

    类似于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;

    相关文章

      网友评论

        本文标题:Flutter中的方法回调

        本文链接:https://www.haomeiwen.com/subject/rdpclctx.html