One of my apps talked to backend APIs through Dio. You opened it and the loaders came up. Then they stayed.
Not a flicker. A wait. The first screen was “loading” because the requests had not come back, and they were taking long enough that it felt stuck. We treated it as a reload problem at first — pull to refresh, open again, same thing. The API was slow from where Flutter was sitting.
The spinner was honest
I have wasted time restyling a loader that was doing its job. The UI was waiting because Dio was waiting. If you only look at the widget, you “fix” the loading flag and then you have an empty screen instead of a spinner. Same delay. Ruder.
So we debugged the requests. What fires on open. What has to finish before the first real UI. Whether one slow call was blocking the rest. Flutter-side Dio handling, not a lecture about the server, though the server was not innocent either.
What changed
We made those calls cheaper to live with from the app: how they were fired, what the launch actually waited on, so the first screen did not sit on a pile of requests that did not all need to finish before you could use anything.
I am not going to paste a fake interceptor and call it the fix. The work was request handling. After it, open did not mean “watch a loader until every endpoint woke up.”
If a Flutter app’s first frame is a spinner, I look at Dio before I look at the animation. Same lesson as the visit pipeline, different bug: sequential Strapi calls that drifted from React was about order. This was about launch doing too much, too slowly, in one go.