Completer
来源:7-6 实战--实现页面导航管理(四)
demonCry
2022-09-08
为什么要在popRoute里complete一个push里产生的Completer呢?
这样插入一个Completer的意义是什么呢 我们即使能在 await push 或 push().then 中接受到这个在popRoute里complete的value 又有什么意义呢?
而且我们可能是连续调用了两次push或者多次push, 然后再调用一次popRoute, 这样这个complete的Completer不是就很难确定是哪次push插入的Completer了嘛…
另外能详细讲下这个Completer吗?没见过… 我是凭借前端js里的promise来理解dart里的这个future的, Completer 类似于 new Promise() ?
1回答
-
大概分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。
希望有帮到你,如果有解释不清楚的欢迎留言
112022-09-09