LocalClosureContainer
A DispatchClosure.Element, that handles local changes of a DispatchClosure.
Generally, this mechanism is not required to know in normal usage. However, it might be useful to introduce some new special mechanisms to the store.
LocalClosureContainer has following properties:
It doesn't affect the closure that is a part of. Therefore, it must be accessed directly by DispatchClosure.local` to receive locally changed values. Original closure always remains the same.
It works only for a time of dispatch call. Therefore, accessing it outside of dispatch function returns unchanged values.
It's hierarchical. Nested dispatch calls receive accumulated local closures.
Every change is identified by Slot.
These properties are not only determined by the implementation of this interface, but also by the convention. Therefore, it is important to use this mechanism according to the documentation and attached examples. Any local change should occur through withLocalClosure. Manual slots manipulation it's not recommended.
Interactions with a store
By default, store contains an instance of LocalClosureContainer (created by LocalClosureContainer()). It applies changes to the original closure field, so accessing local closure without local changes, returns values from the original one. Because local changes remains only for a time of dispatch call, accessing them from coroutines launched by a middleware, doesn't work.
Example
How to perform DispatchClosure change:
fun DispatchScope<*>.customDispatch(action: Action) {
withLocalClosure(ClosureElement()) {
dispatch(SomeAction)
}
}
How to access changed values:
fun customMiddleware(): Middleware<AppState> = {
var element = closure.local[ClosureElement] // outside of dispatch - returns values from the original closure
dispatchFunction {
element = closure.local[ClosureElement] // direct access to local closure in dispatch
// properly returns local changes
element = closure.local[ClosureElement] // direct access to original closure
// returns values from the original closure
}
}
Types
Functions
Returns closure with local changes applied.
Returns Element associated with the key or throws MissingClosureElementException.
Returns a closure without the element with a given key
Registers a new frame that creates a new hierarchy of local changes.
Registers local change of a closure.
Removes a frame along with local changes that occurred.
Undo local change associated with a slot
Returns elements form this DispatchClosure as a Map.
Properties
Inheritors
Extensions
Launches a foreground job using this closure. By default, it's launched in a scope provided by DispatchCoroutineScope. This behaviour might be changed by dispatchJobIn or joinDispatchJob. Because this function uses local closure, calling it outside dispatch should not be done, because it might result in unexpected behaviour.
Returns this closure with local changes.
Runs block that must register a foreground job. It adds SingleForegroundJobRegistry to local closure to allow proper job registration. Local closure change creates a new frame if newFrame is true.
Changes LocalClosureContainer with a given closure for a time of block execution.