一、循环 Event Loop 机制
1、事件循环的流程
在main中直接执行,优先于Microtask和Event
2、事件循环实际场景
Event Loop2.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视频,讲解十分细致。
网友评论