五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網 會員登陸 & 注冊

【安卓開發(fā)】問題記錄,關于LaunchedEffect的調用,以及Composable的跳過

2023-09-10 17:30 作者:スレーブ_スレイヤー  | 我要投稿


這是一個啟動旋轉動畫的LaunchedEffect,當狀態(tài)改變成播放,就會被重啟,設置之前記錄的播放進度,開始無限旋轉。

本來這段代碼完美地執(zhí)行著,但是在我修改了布局結構以后,LaunchedEffect就開始直接不調用了,就讓人有點匪夷所思,花了一個晚上差不多把原因搞清楚了。


我的第一個反應肯定是沒有觸發(fā)重組,因為LaunchedEffect是在重組完成時調用的,而Compose的會盡量跳過不必要的重組,打了日志一看,果然是這樣。

但是以前并沒有這個問題,在經過各種控制變量以后,我確信問題出在一個地方:

調試。

調試模式跟發(fā)布模式,Compose的行為以及性能會有一些變化,我上一次遇到過一樣的問題,但是發(fā)布模式編譯以后就沒問題了,所以就沒管。

本來是這么想的。但是這次,就算以發(fā)布模式編譯,最終還是有問題。

最后唯一的變量就是,我更新了Compose的版本,用的是最新的測試版,以前用的是2022年3月的穩(wěn)定版。然后我想了想,可能以前的代碼能夠運行,是一個BUG呢?

Compose判斷一個Composable能否被重組,是通過參數有沒有改變,而對于我最外層的Composable來說,參數一定是不變的。只是,常識上大家都把LaunchedEffect寫在最外層,就覺得只能這樣,所以

解決方案1:

? ? 把LaunchedEffect移到內層。最終這么做了以后,成功解決了,但就總還是不夠優(yōu)雅。

于是解決方案2:

????自己開協(xié)程。LaunchedEffect的執(zhí)行一定在我點擊按鈕以后,那我直接在onClick里面開協(xié)? ? ? 程,做一樣的操作就行了。這個方案也行,但是不方便管理,約定好所有動畫的控制都使用LaunchedEffect比較好。

于是解決方案3:

????更改key。LaunchedEffect自身也是一個Composable,它自身參數的變化也會觸發(fā)重組,

????那我給一個state做key就好了。然后完美解決。


這里我想強調的是,我以前對Compose的跳過是模糊的,不知道哪些組件會被跳過,哪些不會,但是現在很明確了:

參數值不變的Composable就會被跳過。

明確理解了這一點以后,我才有了解決方案3,所以寫下來強化一下記憶。

參考資料:

https://skyyo.medium.com/performance-in-jetpack-compose-9a85ce02f8f9

https://chrisbanes.me/posts/composable-metrics/#default-parameter-expressions-that-are-dynamic

https://juejin.cn/post/7110208846051672095



【安卓開發(fā)】問題記錄,關于LaunchedEffect的調用,以及Composable的跳過的評論 (共 條)

分享到微博請遵守國家法律
巴青县| 南丰县| 林甸县| 达孜县| 长沙市| 大埔县| 平陆县| 洛阳市| 梧州市| 安福县| 平凉市| 高台县| 仁怀市| 龙海市| 阜新市| 伊吾县| 奉新县| 大足县| 珲春市| 民乐县| 柏乡县| 安化县| 淮安市| 交口县| 芮城县| 酒泉市| 沐川县| 岑溪市| 高清| 庆城县| 封开县| 石嘴山市| 永州市| 定西市| 南华县| 衡水市| 札达县| 宁远县| 陆良县| 巨鹿县| 荆州市|