Skip to content

Skyline渲染模式重新进界面wxs模块中数据不初始化 #209

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
202225feng opened this issue Oct 25, 2024 · 7 comments
Open

Skyline渲染模式重新进界面wxs模块中数据不初始化 #209

202225feng opened this issue Oct 25, 2024 · 7 comments

Comments

@202225feng
Copy link

发现个使用Skyline引擎时会出现的问题。做了一个点击计数的界面,使用Skyline后出现异常。原本WebView渲染重新进界面计数器归零,用Skyline渲染重新进界面次数保留。
代码片段连接:https://developers.weixin.qq.com/s/Bjb9iQmx7BUP
代码截图:
Wxml:
image
Wxs:
image
Js:
image
跳转到计数界面,点几下计数,反回初始界面再跳转到计数界面。运行结果:
WebView渲染:
微信截图_20241010181243
Skyline渲染:
微信截图_20241010181254
js中的数据是都归零的。原本用WebView引擎时wxs模块中的全局变量是归零的,只有Skyline引擎下没有归零。

@LastLeaf
Copy link
Member

LastLeaf commented Oct 28, 2024

webview 的 wxs 运行原理和 skyline 不同。简单来说, webview 上的 wxs 是需要在每个线程上分别执行的(每个页面是一个独立的线程), skyline 是纯粹的小程序生命周期内单实例的。

所以 wxs 中不应该保存状态。

@202225feng
Copy link
Author

现在的情况是WebView渲染时wxs不保存状态,但是skyline渲染时wxs保存状态。我的项目从WebView转成用Skyline后界面结果就与原来不一样了,费挺大劲才发现是这个原因。这算不算是Skyline的bug?

@LastLeaf
Copy link
Member

我不是很清楚 skyline 具体的细节,不过从基础架构上看应该就是这样的了。应该也没法改,属于是可预见的非兼容性变更。

已经请求相关同事 document 相关详情。

@LastLeaf
Copy link
Member

P.S. 考虑到 webview 在特殊情况下可能会刷新重启——刷新然后尝试根据 data 恢复到刷新前的状态。在 webview 中保存 wxs 状态也是不可靠的,可能会丢失。

@202225feng
Copy link
Author

@LastLeaf 您好,打扰了,最近又碰到这个问题导致的bug了,这次不得不在wxs中保存状态。我们的小程序有个界面需要拖动图片,最近小程序迁移到Skyline后,重进这个界面第一次拖动图片会闪烁到上次退出界面前的位置。找了半天问题,最后想到这个bug。问题的原因是Wxs里记录了图片当前位置坐标,重进界面后界面里图篇的位置重置了,wxs里的数据没重置,一触发拖动图片直接跑到上次的坐标了。
这部分功能的代码是参考官方给的示例:
官方文档链接,点页面下面更多示例请查看开发工具中预览效果导入该代码。或者用代码片段链接:https://developers.weixin.qq.com/s/L1G0Dkmc7G8a
这段代码直接导入到开发者工具,然后修改一下app.json改成Skyline,在Android预览就能复现bug。出问题的是movable部分。
复现过程,初始界面点movable进入问题界面,把红框随便拖到一个不是初始位置的地方,返回初始界面再重进该界面,第一次拖动图片的时候图片会闪现到上次的位置。
代码中出问题的部分,startX,startY,lastLeft和lastTop没重置:
Image
现在先暂时改成在js中记录图片位置,用setData修改图片位置了。但是与原来在wxs相比延迟有点高。
请问这个bug有修改的可能吗,或者有没有Skyline配置下的参考实现。麻烦您了,谢谢。

@202225feng
Copy link
Author

另外还有个现象,半glass-easel下,也就是只开glass-easel不开Skyline在Windows和Android端,wxs中用log打印这些坐标的值也有问题。重进后打印的是前一次的值,也没重置,但实际界面上重置了。就是log跟实际情况对不上,log跟Skyline时一样,但界面实际是正常的。只有在Skyline下会闪现。

@LastLeaf
Copy link
Member

wxs 中的全局量是线程全局的,具体请参考这条回复:

#208 (comment)

非常重要:

因为 wxs 中的全局量是线程全局的(小程序的冷/热启动都会带来表现上的差异),非常难控制。即使模板更新完全处理的如你预期,依旧会有很多意外情况。最典型的一个例子是,如果小程序被 reLaunch 重启动了, wxs 的量并不会被重置。

当然并不是完全不能保存状态的。有个接口:

https://developers.weixin.qq.com/miniprogram/dev/framework/view/interactive-animation.html

其中有个 getState 方法,可以把状态附着在节点上,这样状态就可以随着节点的生命周期销毁。(我没有仔细研究你的代码,粗看应该是可以解决这个问题的。)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants