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

這是一個啟動旋轉動畫的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