最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

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

【安卓開發(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的跳過的評論 (共 條)

分享到微博請遵守國家法律
瓮安县| 凤城市| 华容县| 赣榆县| 清远市| 德格县| 宜良县| 炉霍县| 璧山县| 汕头市| 泗水县| 淮南市| 新民市| 南开区| 敦煌市| 麻栗坡县| 威远县| 贺州市| 大余县| 广德县| 苏尼特左旗| 固镇县| 闻喜县| 乌恰县| 桃江县| 伊金霍洛旗| 同心县| 松滋市| 盐山县| 衡阳市| 邯郸市| 衡阳县| 兴业县| 辛集市| 平果县| 重庆市| 阜新市| 孝昌县| 东乡族自治县| 茂名市| 疏勒县|