Closed oyanyev closed 4 months ago
Yes this is known limitation of export implementation.
To make it possible some code analysis should be executed at export moment. To understand all possible lambda result values. But even then it will not work at scale, only in some simple cases that could be solved without running a code to pass all possible branches inside lambda functions.
I thought about other possible solution, to allow a user provide some meta information about such lambdas (saying what states the function can return). This is simple, but requires manual control.
You can offer something else.
Sad, but true
Alternatively, can suggest solution which can work for me. I am using transitionOn to take data not from transition, but from another (not parent state). Current implementation forces to use data form event:
if (this.parent == transitionParams.direction.targetState) {
when (val event = transitionParams.event) {
is DataEvent<*> -> assignData(event) <===
is WrappedEvent -> assignData(event.event)
is FinishedEvent -> assign(dataExtractor.extractFinishedEvent(transitionParams, event))
else -> assign(dataExtractor.extract(transitionParams))
}
Will it have sense to use custom DataExtractor prior to assignData(event)? And defaultDataExtractor() will be used as a fallback only
when (val event = transitionParams.event) {
is DataEvent<*> -> dataExtractor?.extract(transitionParams) ?: assignData(event) <===
is WrappedEvent -> assignData(event.event)
is FinishedEvent -> assign(dataExtractor.extractFinishedEvent(transitionParams, event))
else -> assign(defaultDataExtractor().extract(transitionParams))
}
This is partly solved in https://github.com/nsk90/kstatemachine/releases/tag/v0.26.0 by unsafeCallConditionalLambdas flag
When state transition is configured using GuardedTransitionOnBuilder, such a transition between states is not drawn in diagram