91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android開發Compose?remember原理是什么

發布時間:2022-07-29 13:53:21 來源:億速云 閱讀:153 作者:iii 欄目:開發技術

本篇內容主要講解“Android開發Compose remember原理是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Android開發Compose remember原理是什么”吧!

隨機色文本

假設有這么一個“隨機底色文本”的需求:實現一個 Text,其背景色每次啟動都隨機產生,且生命周期內不變

用Compose可以實現如下:

private val items = arrayOf(Color.Red, Color.Gray, Color.Magenta, Color.Blue, Color.Green, Color.Cyan)
@Composable
fun ColorText(name: String) {
    val color = items.random()
    val clicked = mutableStateOf(0)
    Log.d("ct", "ui compose")
    Column {
        Text(
            text = "I'm colored: ${clicked.value}", modifier = Modifier
                .padding(16.dp)
                .background(color)
                .clickable {
                    Log.d("ct", "clicked")
                    clicked.value = clicked.value + 1
                }
        )
    }
}

Text 調用 Modifier.background,設置隨機從items中取的顏色,每次新的啟動,都可能不一樣

然而很遺憾,上面的背景色雖然是隨機產生,但是單次生命周期里,就可能發生變化

更奇怪的是,改變的 clicked 值,并沒有如預期一樣生效,一直是0

現象和代碼不一?

原因分析

首先,上述代碼中的“點擊計數” clicked,僅僅是為了測試而存在。因為它是一個 MutableState 對象,點擊后改變其值,會觸發Recomposition流程,于是組件刷新。這樣一來,color 的值將重新由隨機函數算出,我們就看到背景色在變化了

同理,雖然我們好像在點擊的時候改變了 clicked 的值,希望像view系統一樣,界面直接響應響應。但是,因為Recomposition的存在,它又被重新構造了,所以其值還是0

正確實現

要實現背景色的整個生命周期固定,但點擊文本后,點擊計數要更新,應該這么做:

@Composable
fun ColorText(name: String) {
    val color = remember { items.random() }
    val clicked = remember { mutableStateOf(0) }
    //...
}

僅僅將color和clicked由 remember 包裹起來就解決了問題

remember的原理剖析

前面功能的實現,全仗著remember的加持。它究竟是個啥?

我們先從顏色的remember著手,它調用的是這個:

@Composable
inline fun <T> remember(calculation: @DisallowComposableCalls () -> T): T =
    currentComposer.cache(false, calculation)

其注釋寫明了兩個關鍵點,這也是它的功能描述:

  • 記憶由calculation返回的值,僅在composition中執行

  • 在Recomposition過程中,不會重新計算,而是直接返回第1步的值

那么這又是怎么做到的呢?

進一步的相關代碼:

@ComposeCompilerApi
inline fun <T> Composer.cache(invalid: Boolean, block: () -> T): T {
    @Suppress("UNCHECKED_CAST")
    return rememberedValue().let {
        // 無效或Empty值時,走if流程,計算并保存值,否則直接返回
        // remember傳入的invalid為false,所以肯定走值判斷
        if (invalid || it === Composer.Empty) {
            val value = block()
            updateRememberedValue(value)
            value
        } else it
    } as T
}
// 要么返回Composer.Empty ,要么返回傳給updateRememberedValue的值
@ComposeCompilerApi
fun rememberedValue(): Any?
// 更新調用rememberedValue()后的值,且此值在下一次調用rememberedValue()時返回
@ComposeCompilerApi
fun updateRememberedValue(value: Any?)
interface Composer {
    // ....
    companion object {
        /**
         * 用于標記無值的狀態
         */
        val Empty = object {
            override fun toString() = "Empty"
        }
    }
}

從上述代碼注釋中,基本上已經對原理很清楚了,簡單地說就是:

  • 由composer作為存儲控制

  • 無值時,走初始化邏輯并返回值,同時存儲該值;有值時,直接返回已存儲的值

顏色的“值不變”清楚了,那點擊計數的“值變”又是怎么回事呢?

其實如出一轍,只是點擊計數remember的,不是普通值,而是一個 MutableState 類型。這樣一來,它就有兩層含義了:

  • MutableState對象本身在整個composition生命周期不變 &mdash;&mdash; 即類似普通值的狀態一致性

  • MutableState對象所存儲的實際值,可變 &mdash;&mdash; 這用以觸發Recomposition,并且獲取更新值

到此,相信大家對“Android開發Compose remember原理是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西贡区| 望奎县| 房产| 永康市| 湖南省| 孟津县| 七台河市| 望都县| 南投县| 随州市| 缙云县| 古丈县| 阳高县| 梓潼县| 晋州市| 庆元县| 汉寿县| 垫江县| 左云县| 武宁县| 望江县| 清丰县| 临高县| 津南区| 环江| 治多县| 腾冲县| 民丰县| 宝兴县| 巫溪县| 黄浦区| 伊金霍洛旗| 泾川县| 来凤县| 淮安市| 丽江市| 界首市| 普定县| 建湖县| 泾源县| 锡林浩特市|