由NavigationView引起的onAppear()执行两次及执行异步方法自动返回上一页的问题
所属分类:ios | 发布于 2023-04-19 16:55:16
事情是这样的,在做iOS内购的时候,有一个产品列表页面,当点击购买时,弹出付款弹窗的同时,页面自动返回了上一页。这个问题排查了很久,没找到原因,排查的过程又发现了,页面的onAppear()方法会被多次调用,真是奇了怪了。
我的页面结构时这样的DashbaordView->SettingsView->MemberProductView,在SettingsView页面使用NavigationLink跳转到MemberProductView页面,在MemberProductView页面的onAppear()方法里面加载商品,加载完成后在MemberProductView的ProductList里点击购买。
一、问题描述
1、当点击购买时,弹出了官方的购买窗口,但是MemberProductView页面自动关闭了,退回到了SettingsView页面。
2、在调试问题的的过程中发现,SettingsView页面进入MemberProductView页面的时候,会调用MemberProductView的onAppear()方法,这个是正常的,令人奇怪的是,当在MemberProductView页面调用dismiss()方法返回SettingsView页面的时候,MemberProductView的onAppear()方法又被调用了。
二、思考调试
1、因为购买方法是异步方法,就尝试把方法改成异步,各种改,无果。
2、NavigationLink有一个方法里面有个参数是isActive,改,还是没结果,看了文档,带isActive参数的NavigationLink方法已经不推荐使用了。
三、解决方法
使用bing搜索,果然有人遇到了同样的问题,翻了好多文章,有一个引起了我的注意,
解读:在外面的项目中,一般都是在最外面套一个NavigationView,然后子孙页面里面直接调用NavigationLink来实现跳转,所以解决方法就是给NavigationView增加.navigationViewStyle(.stack)的修饰器。
navigationViewStyle的具体参数就不深究了,因为iOS16以后就推荐使用NavigationStack来替代NavigationView了,到今年6月份,iOS17发布,根据自己的经验,app支持两个大的版本就行了的原则,后面的开发者,很快就不会遇到这个问题了。