问题
前几天QA给我提了一个bug,说一个弹窗总是无缘无故的自己退出,而且没有任何规律,无法准确复现。
我经过调查发现,我们有一个倒计时弹窗(在Flutter中弹窗其实也是页面),倒计时结束后关闭。但是在弹出倒计时后,由于一些业务逻辑又弹出另外一个弹窗,这时候如果倒计时结束调用pop,只会将新的弹窗关闭,而倒计时弹窗则无法关闭了。
因为这个弹窗不是必弹的,所以导致好像后一个页面是随机无故退出似的。
解决
通过上面的案例,我们可以看到虽然Flutter的路由管理很方便,push和pop就可以了,但是pop只能关闭栈顶的页面,在上面描述的场景中就显得力不从心了。
所以我们希望倒计时弹窗关闭自身,而不影响栈中其他页面。所以不能直接使用pop,而是用removeRoute,示例代码如下:
Navigator.of(context).removeRoute(ModalRoute.of(context)); 复制代码
这样就会仅仅只关闭自身页面,不会影响到其他页面。
Flutter的Navigator提供了更多样的路由操作,如下:
removeRouteBelow(Route<dynamic> anchorRoute)
移除anchorRoute下面的那一个页面popUntil(RoutePredicate predicate)
会一直pop页面,直到predicate返回true
当然push和replace也有类似的操作,大家可以自行查阅源码看看都支持哪些操作,这样在今后的开发过程中如果遇到相关问题或类似需求,就可以直接使用对应的函数即可,防止出现问题。