Compose學(xué)習(xí) - remember瀑梗、mutableStateOf的使用

一、需求

在顯示界面中裳扯,數(shù)據(jù)變動抛丽,界面刷新是非常常見的操作,所以使用compose該如何實現(xiàn)呢饰豺?

二亿鲜、remember、mutableStateOf的使用

我們可以借助標(biāo)題的兩個概念 remember冤吨、mutableStateOf來完成蒿柳。這里先不寫定義,定義看完也不是很明白漩蟆,從例子中去學(xué)習(xí)垒探,先看段code:

@Composable
fun AutoIncrementTest1() {
    var count = 0
    Row(
        modifier = Modifier.padding(20.dp),
        verticalAlignment = Alignment.CenterVertically
    ) {
        Text(
            text = "$count",
            Modifier.padding(horizontal = 15.dp)
        )

        Button(onClick = { count++ }) {
            Text(text = "auto-increment ")
        }
    }
}

這段代碼是顯示一個Text和一個Button,點擊Button后怠李,count變量自增圾叼,然后在Text中顯示出來。

但是實際測試的時候捺癞,點擊按鈕Text顯示數(shù)字是不會變化的夷蚊,原因是 Compose 并未跟蹤此變量更改。也就是說髓介,這個變量不會觸發(fā)界面的刷新惕鼓。

為了解決上面的問題就可以使用 mutableStateOf 函數(shù),來看下修改后的代碼:

State 和 MutableState 是兩個接口唐础,它們具有特定的值箱歧,每當(dāng)該值發(fā)生變化時夫否,它們就會觸發(fā)界面更新(重組)。

setContent {
     ComposeTestTheme {
      Surface(
             color = MaterialTheme.colors.background,
         ) {
            AutoIncrementTest2()
         }
     }
}

@Composable
fun AutoIncrementTest2() {
    var count = mutableStateOf(0)
    Row(
        modifier = Modifier.padding(20.dp),
        verticalAlignment = Alignment.CenterVertically
    ) {
        Text(
            text = "${count.value}",
            Modifier.padding(horizontal = 15.dp)
        )
        
        //用到的時候需要.value獲取
        Button(onClick = { count.value++ }) {
            Text(text = "auto-increment ")
        }
    }
}

我們把變量改成使用mutableStateOf函數(shù)叫胁,但是我點擊按鈕凰慈,Text的顯示依然不會改變,為啥呢驼鹅?

原因是在count改動的時候微谓,Surface接收的這個Composable函數(shù)就會重繪,即將這個AutoIncrementTest2函數(shù)從頭調(diào)用一遍输钩,每次調(diào)用時候豺型,走到第一行語句,count就又賦值為0买乃,所以看起來就是沒有改變姻氨,依然是0。

在這種情況下剪验,假如還想記住上一次變量值肴焊,就要用到remember,來看下修改后的代碼:

setContent {
     ComposeTestTheme {
      Surface(
             color = MaterialTheme.colors.background,
         ) {
            AutoIncrementTest2()
         }
     }
}

@Composable
fun AutoIncrementTest3() {
    var count = remember {
        mutableStateOf(0);
    }
    Row(
        modifier = Modifier.padding(20.dp),
        verticalAlignment = Alignment.CenterVertically
    ) {
        Text(
            text = "${count.value}",
            Modifier.padding(horizontal = 15.dp)
        )
        
        //用到的時候需要.value獲取
        Button(onClick = { count.value++ }) {
            Text(text = "auto-increment ")
        }
    }
}

這時候功戚,在點擊按鈕的時候娶眷,Text上顯示的就是自增的數(shù)字。

您可以將 remember 視為一種在組合中存儲單個對象的機制啸臀,就像私有 val 屬性在對象中執(zhí)行的操作一樣届宠。

當(dāng)然我們還可以優(yōu)化下,上面每次使用count的時候乘粒,都需要用.value來獲取豌注,這里再引入一個關(guān)鍵字by,修改后的代碼如下:

setContent {
     ComposeTestTheme {
      Surface(
             color = MaterialTheme.colors.background,
         ) {
            AutoIncrementTest2()
         }
     }
}

@Composable
fun AutoIncrementTest3() {
    var count by remember {
        mutableStateOf(0);
    }
    Row(
        modifier = Modifier.padding(20.dp),
        verticalAlignment = Alignment.CenterVertically
    ) {
        Text(
            text = "${count}",
            Modifier.padding(horizontal = 15.dp)
        )
        
        Button(onClick = { count++ }) {
            Text(text = "auto-increment ")
        }
    }
}

使用by實現(xiàn)了屬性委托灯萍,就是屬性的 set轧铁、get 的操作交給另一個對象器完成。我們可以間接讀取 count 并將其設(shè)置為可變竟稳,而無需每次都顯式引用 MutableState 的 value 屬性属桦。

總結(jié):

mutableStateOf: 表明某個變量是有狀態(tài)的,對變量進行監(jiān)聽他爸,當(dāng)狀態(tài)改變時聂宾,可觸發(fā)重繪。
remember :記錄變量的值诊笤,使得下次繪制執(zhí)行的時候系谐,不會再次進行初始化。

三、rememberSaveable 的使用

remember 函數(shù)僅在可組合項包含在組合中時起作用纪他。旋轉(zhuǎn)屏幕后鄙煤,整個 activity 都會重啟,所有狀態(tài)都將丟失茶袒。當(dāng)發(fā)生任何配置更改或者進程終止時梯刚,也會出現(xiàn)這種情況。

可以使用 rememberSaveable薪寓,而不使用 remember亡资。這會保存每個在配置更改(如旋轉(zhuǎn))和進程終止后保留下來的狀態(tài)。

 var shouldShowOnboarding by rememberSaveable { mutableStateOf(true) }

運行應(yīng)用向叉,旋轉(zhuǎn)屏幕锥腻,更改為深色模式,或者終止進程母谎。除非您之前退出了應(yīng)用瘦黑,否則系統(tǒng)不會顯示初始配置屏幕。

————————————————
版權(quán)聲明:本文為CSDN博主「孔小樂」的原創(chuàng)文章奇唤,遵循CC 4.0 BY-SA版權(quán)協(xié)議幸斥,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/kongqwesd12/article/details/132556890

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冻记,一起剝皮案震驚了整個濱河市睡毒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冗栗,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件供搀,死亡現(xiàn)場離奇詭異隅居,居然都是意外死亡,警方通過查閱死者的電腦和手機葛虐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門胎源,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屿脐,你說我怎么就攤上這事涕蚤。” “怎么了的诵?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵万栅,是天一觀的道長。 經(jīng)常有香客問我西疤,道長烦粒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮扰她,結(jié)果婚禮上兽掰,老公的妹妹穿的比我還像新娘。我一直安慰自己徒役,他們只是感情好孽尽,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忧勿,像睡著了一般泻云。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狐蜕,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天宠纯,我揣著相機與錄音,去河邊找鬼层释。 笑死婆瓜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贡羔。 我是一名探鬼主播廉白,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乖寒!你這毒婦竟也來了猴蹂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤楣嘁,失蹤者是張志新(化名)和其女友劉穎磅轻,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逐虚,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡聋溜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了叭爱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撮躁。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖买雾,靈堂內(nèi)的尸體忽然破棺而出把曼,到底是詐尸還是另有隱情,我是刑警寧澤漓穿,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布嗤军,位于F島的核電站,受9級特大地震影響器净,放射性物質(zhì)發(fā)生泄漏型雳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纠俭。 院中可真熱鬧沿量,春花似錦、人聲如沸冤荆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钓简。三九已至乌妒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間外邓,已是汗流浹背撤蚊。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留损话,地道東北人侦啸。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像丧枪,于是被迫代替她去往敵國和親光涂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容