Returns true only if the action finished with no errors.
In other words, if the methods before, reduce and after all finished executing
without throwing any errors.
If this returns true, the action will not be dispatched: before, reduce
and after will not be called, and the action will not be visible to the
StoreTester. This is only useful under rare circumstances, and you should
only use it if you know what you are doing.
This is an optional method that may be overridden to run during action
dispatching, after reduce. If this method throws an error, the
error will be swallowed (will not throw). So you should only run code that
can't throw errors. It may be synchronous only.
Note this method will always be called,
even if errors were thrown by before or reduce.
An async reducer (one that returns Future<AppState?>) must never complete without at least
one await, because this may result in state changes being lost. It's up to you to make sure
all code paths in the reducer pass through at least one await.
This is an optional method that may be overridden to run during action
dispatching, before reduce. If this method throws an error, the
reduce method will NOT run, but the method after will.
It may be synchronous (returning void) ou async (returning Future<void>).
You should NOT return FutureOr.
The reduce method is the action reducer. It may read the action state,
the store state, and then return a new state (or null if no state
change is necessary).
If any error is thrown by reduce or before, you have the chance
to further process it by using wrapError. Usually this is used to wrap
the error inside of another that better describes the failed action.
For example, if some action converts a String into a number, then instead of
throwing a FormatException you could do:
You may wrap the reducer to allow for some pre or post-processing.
For example, if you want to abort an async reducer if the state
changed since when the reducer started: