Why Raw Asynchrony Inside the Presentation Layer Breaks Separation of Concerns, User Experience, and Testability

Every Flutter developer remembers the magic of their first FutureBuilder.

You paste an HTTP request directly into a FutureBuilder inside your widget's build() method, configure a CircularProgressIndicator for ConnectionState.waiting, render your data in ConnectionState.done, and suddenly your app is alive with real-time data in fewer than twenty lines of code.

It feels like superpowers. The official documentation features it. Introductory tutorials celebrate it.

And then your application grows.