五月天青色头像情侣网名,国产亚洲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的跳過的評論 (共 條)

分享到微博請遵守國家法律
五莲县| 噶尔县| 泰和县| 扎赉特旗| 江山市| 富平县| 淮北市| 克什克腾旗| 富顺县| 萍乡市| 枣强县| 寿宁县| 扶沟县| 桑日县| 赣州市| 柞水县| 新化县| 沙雅县| 和龙市| 安化县| 沧州市| 昆山市| 锡林浩特市| 榆中县| 和硕县| 阳高县| 铁岭县| 时尚| 巴中市| 松滋市| 徐水县| 彭泽县| 那曲县| 延寿县| 大田县| 绥中县| 平原县| 聂荣县| 赤峰市| 新竹市| 博乐市|