althaf
03/21/2022, 10:23 AMprivate val _quickLinks = MutableLiveData<List<UIQuickLink>>()
val quickLink: LiveData<List<UIQuickLink>> = _quickLinks
So that, quickLink access are only observed than posted with new values from UI, here update to quickLink happens from only view modelf.babic
03/21/2022, 10:24 AMState
instead of a MutableState
using a second property.
You could also do it with a function instead of a propertyalthaf
03/21/2022, 10:32 AMval _registeredUsers = mutableStateListOf<UIRegisteredUser>()
val registeredUser: State<UIRegisteredUser> = _registeredUsers
val _registeredUsers = mutableStateListOf<UIRegisteredUser>()
val registeredUser: SnapshotStateList<UIRegisteredUser> = _registeredUsers
SnapshotStateList
Is mutable 😕f.babic
03/21/2022, 10:36 AMmutableStateListOf
instead of mutableStateOf
?
We're using the latter in our code and seems to work fine, haven't had issues per se.althaf
03/21/2022, 10:50 AMprivate val _registeredUsers = mutableStateOf<List<UIRegisteredUser>>(value = listOf())
val registeredUser: State<List<UIRegisteredUser>> = _registeredUsers
This above appears to work , however following use case we are not able to accomplish with above approach, where as with mutableStateListOf() these worked fine, however, object became insecure
init {
_registeredUsers.value.toMutableStateList().addAll(mockRegisteredUsers)
}
fun onUserSelected(user: UIRegisteredUser) {
viewModelScope.coroutineContext.run {
_registeredUsers.value.toMutableStateList().let { userList ->
userList.find { it.isSelected }?.let {
userList.indexOf(it).also { index ->
userList.remove(it)
userList.add(index, it.copy(isSelected = false))
}
}
userList.find { it == user }?.let {
userList.indexOf(it).also { index ->
userList.remove(it)
userList.add(index, it.copy(isSelected = true))
}
}
}
}
}
f.babic
03/21/2022, 10:55 AM_registeredUsers.value.toMutableStateList().addAll(mockRegisteredUsers)
You could have:
_registeredUsers.value = _registeredUsers.value + mockRegisteredUsers
Basically, instead of havign a mutable list that can be changed anywhere, you use immutable lists but make sure to add/remove items from the given list and producing a new list instead.
That gives you control in the ViewModel of whatever you want to do, but the rest of the world won't be able to mutate incorrectlyalthaf
03/21/2022, 10:57 AMprivate val _registeredUsers = mutableStateOf<ArrayList<UIRegisteredUser>>(value = arrayListOf())
val registeredUsers: State<List<UIRegisteredUser>> = _registeredUsers
fun onUserSelected(user: UIRegisteredUser) {
viewModelScope.coroutineContext.run {
_registeredUsers.value.let { userList ->
userList.find { it.isSelected }?.let {
userList.indexOf(it).also { index ->
userList.remove(it)
userList.add(index, it.copy(isSelected = false))
}
}
userList.find { it == user }?.let {
userList.indexOf(it).also { index ->
userList.remove(it)
userList.add(index, it.copy(isSelected = true))
}
}
}
}
}
f.babic
03/21/2022, 11:00 AM_registeredUsers.value = newValue
when you mutate the list within those find
calls, you need to make sure to push the new state to the UIalthaf
03/21/2022, 11:09 AMSelectLoginUsersScreenContent(registeredUsers = loginViewModel.registeredUsers.value, onUserSelected = onUserSelected)
fun onUserSelected(user: UIRegisteredUser) {
viewModelScope.coroutineContext.run {
_registeredUsers.value.let { userList ->
userList.find { it.isSelected }?.let {
userList.indexOf(it).also { index ->
userList.remove(it)
userList.add(index, it.copy(isSelected = false))
}
}
userList.find { it == user }?.let {
userList.indexOf(it).also { index ->
userList.remove(it)
userList.add(index, it.copy(isSelected = true))
}
}
_registeredUsers.value = userList
}
}
}
f.babic
03/21/2022, 11:19 AMval registeredUsers by loginViewModel.registeredUsers
SelectLoginUsersScreenContent(registeredUsers = registeredUsers, onUserSelected = onUserSelected)
Basically the way we expose state in our VMs is the following:
private var threadMessagesState: MessagesState by mutableStateOf(MessagesState())
And then we just fetch it using an exposed property or somethingalthaf
03/21/2022, 11:31 AMval registeredUsers by loginViewModel.registeredUsers
SelectLoginUsersScreenContent(
registeredUsers = registeredUsers,
onUserSelected = onUserSelected
)
😭 didnt work @f.babicAlbert Chang
03/21/2022, 11:42 AMprivate val _registeredUsers = mutableStateListOf<UIRegisteredUser>()
val registeredUsers: List<UIRegisteredUser> = _registeredUsers
althaf
03/21/2022, 11:44 AMAlbert Chang
03/21/2022, 11:45 AMalthaf
03/21/2022, 11:48 AMprivate val _registeredUsers = mutableStateListOf<UIRegisteredUser>()
val registeredUsers: List<UIRegisteredUser> = _registeredUsers