allan.conda
10/27/2020, 11:06 PM/**
* Convenience property delegate for accessing and setting the live data value
*/
class LiveDataDelegate<T> : MutableLiveData<T> {
constructor(value: T) : super(value)
constructor() : super()
operator fun getValue(thisRef: Any?, property: KProperty<*>): T? = value
operator fun setValue(thisObj: Any?, property: KProperty<*>, value: T?) {
this.value = value
}
}
So then I could do:
// In Some ViewModel
private val stateDelegate = LiveDateDelegate(SomeState())
private var _state by stateDelegate
private val state: LiveData<SomeState>
get() = _state
fun onSomeUserEvent() {
// no need to call state.value
_state = _state.copy(
// update the state
)
}
Opinions are welcomeAdam Powell
10/27/2020, 11:17 PMinline operator fun <T> LiveData<T>.getValue(thisObj: Any?, property: KProperty<*>): T = value
inline operator fun <T> MutableLiveData<T>.setValue(thisObj: Any?, property: KProperty<*>, value: T) {
this.value = value
}
allan.conda
10/27/2020, 11:20 PMAli Albaali
10/28/2020, 6:05 PMAdam Powell
10/28/2020, 7:48 PMAdam Powell
10/28/2020, 7:49 PMAli Albaali
10/28/2020, 8:30 PMAdam Powell
10/28/2020, 9:08 PMsnapshotFlow
might be interesting to you: https://developer.android.com/reference/kotlin/androidx/compose/runtime/snapshots/package-summary#snapshotflowallan.conda
10/29/2020, 12:02 AMIf you do that then how can you observe/collect it? (edited)Thinking along these lines
// ViewModel
private val mutableStateFlow = mutableStateFlow(state)
private var _state by mutableStateFlow
val state: StateFlow<State>
get() = _state
fun someFun() {
_state = _state.copy(
loading = true
)
}
// Composable View
viewModel.state.collectAsState()
allan.conda
10/29/2020, 12:07 AMcombine(
loading,
items,
// grows down
) { loading, items -> // grows
State(
loading = loading,
items = items,
// grows again
).collect {
_state.value = it
}
}