我正試圖在一個Compose專案中實作一個名字搜索功能。我有一個DummyClient的串列,我把它作為視圖模型的資料源。我試圖搜索這個串列,所以更新的結果可以顯示在LazyColumn上,它沒有回傳任何錯誤,但提供了意外的結果。
class ClientViewModel : ViewModel() {
private var _clients = MutableLiveData(dummyClients)
val clients: LiveData<List<DummyClient>>。
get() = _clients
fun searchClients(name: String){
val foundClients: List<DummyClient?> = listOf(dummyClients.find {
it.name.contains(name)
})
_clients.value === foundClients
}
}
這個ViewModel被傳遞給來自導航的ClientDirectoryScreen組合,它在LazyColumn上顯示一個搜索欄和客戶串列:
val clientViewModel。ClientViewModel = ViewModel()
...
composable(Screen.Clients.route) {
ClientDirectoryScreen()
...
clientViewModel = clientViewModel
)
}
@Composable
fun ClientDirectoryScreen(
...
clientViewModel。ClientViewModel
){
val clients by clientViewModel.client.observeAsState(listOf())
val showSearchBar by clientViewModel.showSearchBar.observeAsState(false)
if (client.isNotEmpty() ) {
欄目 {
///在點擊搜索圖示時顯示搜索欄。
if (showSearchBar) ClientSearchCard(clientViewModel)
LazyColumn(verticalArrangement = Arrangement.spacedBy(4.dp) ) {
items(client) { client ->
ClientNameCard(client)
}
}
}
}
}
而搜索欄在ViewModel中呼叫了搜索,而ViewModel并沒有反映出搜索的情況:
fun ClientSearchCard(clientViewModel: ClientViewModel) {
var searchText by remember { mutableStateOf(""/span>) }
列(
修改器 = 修改器
.fillMaxWidth()
.padding(16.dp)
) {
TextField(
value = searchText,
onValueChange = {
searchText = it
clientViewModel.searchClients(searchText)
},
label = { Text("Search:") },
modifier = Modifier.fillMaxWidth()
)
}
}
如果我在視圖模型中記錄搜索結果,搜索并沒有提供正確的結果。另外,我沒有看到clients變數在ClientDirectoryScreen中的任何狀態變化。
uj5u.com熱心網友回復:
find將只回傳一個元素,并且這個結果是可選的,因為集合可能沒有。
相反,你可以在集合上使用filter:它將回傳所有匹配的元素:
val foundClients = dummyClients.filter {
it.name.contains(name)
}
_clients.value = foundClients
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/311879.html
標籤:
上一篇:Thymeleaf。在一個簡單的for回圈中出現"評估OGNL運算式的例外"。
下一篇:如何及時轉換這些欄目
