A subflow may be passed input data from its parent flow when it is spawned.
Also, a subflow may pass back output data to its parent flow when it ends.
The FlowAttributeMapper strategy does this, and is used by the SubFlowState that manages spawning a subflow and resuming the parent flow when the subflow ends.
So with that said, a Flow has a contract. It is like a black box--a component. It should be self-contained, but may require input data to work and may produce output data other flows can take and do stuff with. If a Flow that requires some input doesn't get it, it needs to take an appropriate action: either throw a exception if it's a programmer error, or immediately end the flow with a error result if it's recoverable.
Core Spring Development Team