异步

作者: woniu | 来源:发表于2022-08-22 00:00 被阅读0次

一、循环 Event Loop 机制

1、事件循环的流程

在main中直接执行,优先于Microtask和Event

image.png
2、事件循环实际场景
Event Loop
2.1 直接运行
Future.sync():同步,立刻执行
Future.value() :传给value一个值,立刻封装成Future
Future().then():then在Future完成的瞬间,立刻执行
then直接执行
2.2 Microtask

重点:Future.completed.then() ,必须是在Future完成之后调用的then,会被添加到Microtask队列中。

scheduleMicrotask()
Future.microtask()
Future.completed.then() 
2.3 Event
Future():纯函数调用
Future.delayed():延时

二、Future

三种状态:未完成、有错误、没错误

1、打印的结果是先Hello,再zhangsan
// 延时调用,例如网络请求后获取数据,需要用Future修饰
Future<String> getFuture(){
  return Future(() => "zhangsan");
}
//方法调用
void _incrementCounter(){
  getFuture().then((value) => print(value));
  print("Hellow");
}

三、FutureBuilder

FutureBuilder组件,主要用于跟踪future的变化并自动重绘。每次重绘时,AsyncSnapshot会描述future的最新动态,其中ConnectionState可用于判断future是否已经完成,而error与data属性则会包含一个已经完成的future内部的值。
FutureBuilder的好处之一就是你不再需要setState()方法,直接在build里面就可以了。
异步操作注意三个点:等待、正常、出错三种状态。
initialData:初始值
snapshot:Future异步返回值。
error和Data只有一个有值。


image.png

四、Stream和StreamBuild

Stream是在active的时候获取到数据,Future在done的时候获取数据。

1、listen方法

每隔一秒监听打印一次。


image.png
2、StreamBuilder组件监听

扩展:DefaultTextStyle可以修改子视图的所有文字类型。
通过snapShot的connectionState获取状态,snapshot.data获取数据。


image.png
3、用StreamController创建一个Stream

StreamController创建一个Stream可以实现更精准的控制。

1、创建stream
final contrller = StreamController(); //会缓存数据,不会再次build
final contrller = StreamController.broadcast()//不会缓存数据
2、dispose移除
void dispost (){
  contrller.close();
}
3、添加事件
controller.sink.add(10)
4、可以在init中监听
void initState(){
    contrller.stream.listen((event){
      print("event:$event");
      },
      onError:(error) => print("$error")
      onDone:() => print("done")
)
}
image.png

where:条件过滤
map:对事件进行处理
distinct:去重,一样的数据不需要再build了。


4、单Stream和广播Stream

单Stream可以在一个页面中控制状态,因为只能有一个订阅者,因此只能做局部状态的控制。
广播Stream使用boardcast,可以有多个订阅者,当发布一个事件后,存在的多个订阅者就都可以收到消息。

作为王叔的铁杆粉,在此极力推荐王叔的flutter视频,讲解十分细致。

相关文章

网友评论

    本文标题:异步

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