diff --git a/workflow-runtime/src/main/java/com/squareup/workflow1/RenderWorkflow.kt b/workflow-runtime/src/main/java/com/squareup/workflow1/RenderWorkflow.kt index 8f399a2503..86f4fee5ae 100644 --- a/workflow-runtime/src/main/java/com/squareup/workflow1/RenderWorkflow.kt +++ b/workflow-runtime/src/main/java/com/squareup/workflow1/RenderWorkflow.kt @@ -151,10 +151,12 @@ fun renderWorkflowIn( // It might look weird to start by consuming the output before getting the rendering below, // but remember the first render pass already occurred above, before this coroutine was even // launched. - runner.nextOutput() - ?.let { onOutput(it.value) } + val output = runner.nextOutput() + // After receiving an output, the next render pass must be done before emitting that output, + // so that the workflow states appear consistent to observers of the outputs and renderings. renderingsAndSnapshots.value = runner.nextRendering() + output?.let { onOutput(it.value) } } } diff --git a/workflow-runtime/src/test/java/com/squareup/workflow1/RenderWorkflowInTest.kt b/workflow-runtime/src/test/java/com/squareup/workflow1/RenderWorkflowInTest.kt index 93a83c776f..012b66eed0 100644 --- a/workflow-runtime/src/test/java/com/squareup/workflow1/RenderWorkflowInTest.kt +++ b/workflow-runtime/src/test/java/com/squareup/workflow1/RenderWorkflowInTest.kt @@ -439,8 +439,8 @@ class RenderWorkflowInTest { assertEquals( listOf( "rendering({no output})", - "output(output)", - "rendering(output)" + "rendering(output)", + "output(output)" ), events )