Completer

来源:7-6 实战--实现页面导航管理(四)

demonCry

2022-09-08

为什么要在popRoute里complete一个push里产生的Completer呢?

这样插入一个Completer的意义是什么呢 我们即使能在 await pushpush().then 中接受到这个在popRoute里complete的value 又有什么意义呢?

而且我们可能是连续调用了两次push或者多次push, 然后再调用一次popRoute, 这样这个complete的Completer不是就很难确定是哪次push插入的Completer了嘛…

另外能详细讲下这个Completer吗?没见过… 我是凭借前端js里的promise来理解dart里的这个future的, Completer 类似于 new Promise() ?

写回答

1回答

马超老师

2022-09-08

大概分3个问题来回答:

1、Completer在Route中的作用

这里在popRoute里面加Completer是为了传递参数。可以观察一下在popRoute里面使用completer的时候有以下代码:

completer.complete(params)

这行代码会传递一个params。比如页面A跳转到页面B,然后B返回的时候需要给A一个参数,这时候就需要这个completer帮忙完成。

举个例子,后面的课程会讲到一个图片选择器,页面A设置头像,会跳转图片选择器,这时候页面A是要等待用户选图片的,所以自然就用到了await push的方式。然后等待用户选择完,通过completer来结束这个await,并且拿到用户选择的结果。

所以综上,如果只是页面的跳转不涉及参数返回,那不用这个completer也可以。但是如果有页面的返回,因为这个返回值是异步的,所以需要completer来传递;


2、Completer的用法

Completer可以帮助我们做一些异步的操作,比如你需要调用一个函数,但是这个函数不能立马给你返回值,而是需要再某个特定时机返回给你,这时候就可以用Completer帮助我们完成。

dart里的Future就类似js里的promise,而Completer是dart中创建future实现异步的一种方式;


3、多次Push会不会混乱

不会。

因为每次push的时候都会创建一个新的Completer,所以每次push都是不同的实例。这样最后在pop的时候只有对应一处调用push的地方能收到这个回调,最后从回调中拿到params。


希望有帮到你,如果有解释不清楚的欢迎留言

1
1
demonCry
非常感谢老师的回答!完美切中我困惑的点
2022-09-09
共1条回复

基于Flutter 3.x 实战跨平台仿抖音App混合开发

以短视频APP为例,快速上手原生/Flutter 混合开发

507 学习 · 124 问题

查看课程