With kotlin I seldom need a framework, because the standard-library is so rich.
In general, when I tend to follow a data-flow ("redux" for JS people) architecture, but have a different approach when it comes to side-effects:
My state is always a serialisable description including running side-effects.
So even network-requests can be reconstructed from a state-file.
Also I decouple View/React from the actual state via interfaces.
Meaning my state doesn't necessarily contain the data in the format my Views need, but it's able to supply the data via delegation.
In general, when I tend to follow a data-flow ("redux" for JS people) architecture, but have a different approach when it comes to side-effects: My state is always a serialisable description including running side-effects. So even network-requests can be reconstructed from a state-file.
Also I decouple View/React from the actual state via interfaces.
Meaning my state doesn't necessarily contain the data in the format my Views need, but it's able to supply the data via delegation.
If I need background-threads I use actors / CSP.