我有大量的文本在一排,我想讓每一個文本在按下時改變文本裝飾
。(因此用戶可以注意到哪個文本/標簽已經被選中)
(未選擇的:TextDecoration.None,選擇的:TextDecoration:underlined)
(用戶可以按下選中的文本來取消選擇)
var tagsSelected = mutableListOf<String> ()
...
Text(text = "tech",
Modifier.clickable {
if (tagsSelected.contains("tech"/span>)) {
tagsSelected.remove("tech")
//RemoveTextDecoration?。
} else {
tagsSelected.add("tech")
// AddTextDecoration?
}
}.padding(5.dp))
...
我嘗試過使用變數(這不是一個好主意,因為它需要大量的變數),使用布林值的可變陣列(后來被觀察為狀態),這些都沒有給我帶來結果,
如果有任何幫助,我們將不勝感激,。謝謝 :)
uj5u.com熱心網友回復:
你在每次重構時都創建一個新的mutableListOf。這就是為什么新的值沒有被保存。看看你應該如何在編譯中存盤狀態。
rememberSaveable即使在螢屏旋轉后也會保存你的狀態(與remember不同),而mutableStateListOf是一個可變串列的變體,它將通知 Compose 有關的更新。如果您需要在離開螢屏并回來時也能保存狀態,請查看視圖模型。
此外,您還可以將您的添加/洗掉邏輯移到擴展中,這樣您的代碼就會看起來更簡潔:
fun <E> mutableList<E>. addOrRemove(element: E){
if (! add(element)) {
remove(element)
}
}
最后的變體:
val tagsSelected = rememberSaveable { mutableStateListOf<String> () }
文本(
text = "tech",
修改器 = 修改器
.clickable {
tagsSelected.addOrRemove("tech")
}
.padding(5.dp)
)
如果你有許多看起來相同的Text項,你可以使用forEach重復它們:
val tagsSelected = rememberSaveable { mutableStateListOf<String>() }
val items = listOf(
"tech1",
"tech2",
"tech3".
)
items.forEach { item ->
文本(
text = item,
修改器 = 修改器
.clickable {
tagsSelected.addOrRemove(item)
}
.padding(5.dp)
)
}
如果你只需要使用選擇狀態來改變文本裝飾,你可以很容易地把它移到其他可組合的地方并創建一個區域變數:
@Composable
fun ClickableDecorationText(
文本。String,
){
var selected by rememberSaveable { mutableStateOf(false) }
文本(
text = text,
textDecoration = if(selected) TextDecoration.underline else TextDecoration.None。
修改器 = 修改器
.clickable {
selected = !selected
}
.padding(5.dp)
)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/315144.html
標籤:
