• GGL
    2019-11-03
    // 第一段
      Future(() => print('f6'))
        .then((_) => Future(() => print('f7')))
        .then((_) => print('f8'));

    执行结果为:f6 f7 f8

      // 第二段
      Future(() => print('f6'))
      .then((_) {
          Future(() => print('f7'));
        })
      .then((_) => print('f8'));

    执行结果为:f6 f8 f7

    老师,上面这两段代码为什么执行结果不一样呢?
    展开

    作者回复: 单行箭头函数是Future,和函数体里有Future不是一回事

     3
     2
  • lk
    2019-08-29
    Future(() => print('f1'))
          .then((_) async => scheduleMicrotask(() => print('f2')))
          .then((_) => print('f3'));
      Future(() => print('f4'));

    作者回复: 赞👍另外建议把await加上

    
     2
  • jerry
    2019-10-29
    您好老师,单线程模型是指的事件队列模型,和绘制界面的线程是一个吗

    作者回复: 我们所说的单线程指的是主Isolate。而GPU绘制指令有单独的线程执行,跟主Isolate无关。事实上Flutter提供了4种task runner,有独立的线程去运行专属的任务:
    1.Platform Task Runner:处理来自平台(Android/iOS)的消息
    2.UI Task Runner:执行渲染逻辑、处理native plugin的消息、timer、microtask、异步I/O操作处理等
    3.GPU Task Runner:执行GPU指令
    4.IO Task Runner:执行I/O任务
    除此之外,操作系统本身也提供了大量异步并发机制,可以利用多线程去执行任务(比如socket),我们在主Isolate中无需关心(如果真想主动创建并发任务也可以)

    
     1
  • Geek_keyi
    2019-09-25
    对Dart单线程模型理解还是迷惑,请教一下:假如有一个任务(读写文件或者网络)耗时10秒,并且加入到了事件任务队列中,执行单这个任务的时候不就把线程卡主吗?

    作者回复: 文件I/O和网络调用并不是在Dart层做的,而是由操作系统提供的异步线程,他俩把活儿干完之后把结果刚到队列中,Dart代码只是执行一个简单的读动作。

     3
     1
  • (Jet)黄仲平
    2020-02-05
    老师好,请问“await 与 async 只对调用上下文的函数有效”。这里的“上下文”要如何理解
    
    
  • ssala
    2020-01-15
    老师,dart从事件循环中获取事件并处理,那谁负责向事件队列中添加事件呢?或者说我们的异步任务是在何时以何种方式加入到事件队列的呢?
    
    
  • 有灯无月不娱人
    2020-01-09
    老师,你这文档没有关于flutter和native通信的内容介绍?
    
    
  • 有灯无月不娱人
    2020-01-09
    老师,flutter和native的通信是不是也只是在主isolate里实现的?一个 channel的话,在遇到并发通信的时候是不是就可以用future预防通道被阻塞?
    
    
  • cv0cv0
    2019-12-24
    compute 函数是什么包?自动导入找不到这个函数。

    作者回复: import 'package:flutter/foundation.dart';

    
    
  • Geek_20f143
    2019-12-10
    Future(() => print('a1'))
            .then((_) {
          Future(() => print('a2'));
        }).then((_) => print('a3'));


    Future(() => print('a1'))
            .then((_) => Future(() => print('a2')))
            .then((_) => print('a3'));

    老师,为什么第一部分打印顺序是a1 a3 a2... 第二部分打印顺序是a1 a2 a3
    a2区别那部分不是只是语法糖吗?
    展开

    作者回复: 你把第一个语句的then加个return再试试
        Future(() => print('a1'))
            .then((_) {
          return Future(() => print('a2'));
        }).then((_) => print('a3'));

    
    
  • 满大大
    2019-12-06
    await 的上下文函数并不包含调用栈,因此 func 后续代码继续执行,打印“func after”。这里怎么理解?

    作者回复: 就是await只等待当前的语句,并不是以把整个调用栈都锁死的方式进行等待。

    
    
  • 菜头
    2019-11-19
    1、因为两个 SendPort 的作用不一样
    第一个 SendPort 是为了让并发 Isolate 回传一个 SendPort
    第二个 SendPort 是为了让并发 Isolate 回传结果
    可以改造成一个
    监听第一个 SendPort 的回调,根据结果类型复用这个 SendPort
    并且在计算结果完成之后关掉 SendPort 即可
    展开

    作者回复: 可以的,赞👍

    
    
  • 菜头
    2019-11-03
    老师上面的例子中有一个疑问
    //声明了一个匿名Future,并注册了两个then。第一个then是一个Future

    Future f6 = Future(() => print('f6'))

    f6.then((_) => f7 = Future(() => print('f7')); return f7)
    .then((_) => print('f8'));

    老师这块儿的调用时序为什么不是 f6 f8 ..... f7

    f7 会被放到事件队列里面了 但是f6的第二个 .then(() =>print('8')) 为什么也会被放到事件队列中
    展开

    作者回复: 1.你这个代码编译不通过吧
    2.单行箭头函数的then是Future,和函数体内有Future不是一回事

    
    
  • 菜头
    2019-11-03
    老师上面的例子中有一个疑问
    //声明了一个匿名Future,并注册了两个then。第一个then是一个Future

    Future f6 = Future(() => print('f6'))

    f6.then((_) => f7 = Future(() => print('f7')); return f7)
    .then((_) => print('f8'));

    老师这块儿的调用时序为什么不是 f6 f8 ..... f7
    Future 执行的 then 不是和 Future 一个事件循环吗
    展开

    作者回复: f7这个 then 是一个 Future 异步任务,因此这个 then,以及后续的 then 都被放入到事件队列中了

    
    
  • Geek_869250
    2019-10-28
    老师可以和JS的event loop做个比较吗

    作者回复: 基本上一样,因为Dart的单线程模型就是借鉴的js

    
    
  • 巫山老妖
    2019-10-18
    第一个思考题,是因为isolate是单向通信的,要达到双向通信需要回传一个发送通道,所以需要两个SendPort。

    作者回复: 不对哦,注意看其实我在并发Isolate中发了两次SendPort

    
    
  • 舒大飞
    2019-10-03
    老师,还是有点困惑,希望解答下,你说的:文件IO和网络调用并不是在dart层做的,而是由操作系统提供的异步线程,这句话怎么理解,是因为dart里的文件IO和网络调用是这样封装实现的吗?如果不是,那其它语言,比如Android开发中为什么要单独开线程去做IO和网络请求,Android开发中的IO和网络请求不是操作系统提供的异步线程吗

    作者回复: 1.文件I/O和网络调用这类底层服务调用,只是Embedder层做了一次封装,底层有专门的线程处理这些任务;
    2.两者设计理念不同而已,原生Android更底层。你也可以试着增加一层,用线程池模拟出类似Dart的Isolate机制,实现I/O、网络调用的异步化。

    
    
  • C
    2019-09-03
    有个疑问:
    Future(() => print("f1"))
      ..then((_) => Future(() => print("f2")))
      ..then((_) => print("f3"));
    Future(() => print("f4"));
    这样打印出来的结果为什么是 f1 f3 f4 f2
    展开

    作者回复: Future f = Future(() => print('f1'));
    f.then((_) => Future(() => print('f2')));
    f.then((_) => print('f3'));
    Future(() => print('f4'));
    这么看明白了么

     2
    
  • 楼外楼
    2019-08-30
    Dart 中的 await 并不是阻塞等待,而是异步等待,这句话是不是有问题,await 就是阻塞后面代码执行,等待异步代码返回。难道我理解有误?

    作者回复: await阻塞的是当前上下文的后续代码执行,并不能阻塞其调用栈上层的后续代码执行

    
    
  • 小水滴
    2019-08-29
    还有一个疑问,并发Isolate中可以操作widget吗

    作者回复: 不可以,因为资源完全隔离

    
    
我们在线,来聊聊吧