You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Currently, a RootStore's value is only updated (i.e. data flow emits a new value) if the Store receives a new value.
If the Store receives a value that is equal to the current value, no value is emitted.
This is due to the fact that a MutableStateFlow is used to keep track of the current value which is explicitly designed to behave this way.
Why this is problematic
Imagine a Lens that is used to strip illegal characters from an input (e.g. characters from a phone number). The expected behavior would be like this:
Add invalid characters to an input field with a valid input
Invalid characters get stripped by the Lens
The store is updated
The formatting Lens passes the sanitized value upstream to the input
The input field is updated to have the sanitized value
Instead, the following happens:
Add invalid characters to an input field with a valid input
Invalid characters get stripped by the Lens
The store is not updated since the sanitized input is the same as the current value
Nothing is passed upstream
The input field keeps the illegal input
Example code
val allowedCharacters ="abc".toCharArray().toSet()
val sanitizingLens:Lens<String, String> = lensOf(
format = { it },
parse = { it.filter { c -> c in allowedCharacters } }
)
val store = storeOf("").map(sanitizingLens)
div("space-y-4") {
input {
type("text")
}.changes.values() handledBy store.update
p {
store.data.renderText(into =this)
}
}
Proposal
Consider one of the following options:
Introduce a flag to explictly update the Store's data on any new input
Change the Store's default behavior to always emit a new value, regardless of the equality of the input
The text was updated successfully, but these errors were encountered:
This needs carefully investigation in order to keep the current and long time established behaviour stable. I am in favor of some flag or somehow "store"-overloading / variant / behaviour approach right now. On the other hand besides "legacy" code we want to support users with our framework to write idiomatic code. That would mean that the current behaviour should rather be treated and branded as deprecated, which in dead would mean some API change.
In an internal meeting @Lysander suggested to change the default behavior of the RootStore class and filter out identical values on the rendering level instead.
This way the stores would always update but identical contents would not be rendered multiple times.
Current behavior
Currently, a
RootStore
's value is only updated (i.e.data
flow emits a new value) if the Store receives a new value.If the Store receives a value that is equal to the current value, no value is emitted.
This is due to the fact that a
MutableStateFlow
is used to keep track of the current value which is explicitly designed to behave this way.Why this is problematic
Imagine a
Lens
that is used to strip illegal characters from an input (e.g. characters from a phone number). The expected behavior would be like this:Instead, the following happens:
Example code
Proposal
Consider one of the following options:
The text was updated successfully, but these errors were encountered: