Every Flutter dev I know has shipped at least one screen that gets stuck on a loading spinner with no error message in production. I've shipped two.
In this guide, you'll learn the production pattern I use with Riverpod for loading, error, and success states — forms, debounced search, pagination, snackbar errors — including the mistakes I made first and what I do differently now.
The Three States You Always Need
Every screen that fetches data has to handle three states.
Loading — request in flight, show a spinner or skeleton
Error — request failed, show a message with a retry path
Success — request returned data
Plus a fourth implicit one: empty — request succeeded but returned nothing.
Skip any of these and you ship "infinite spinner" bugs and "blank screen" bugs. I've shipped both. Both are embarrassing.
Common Mistakes Developers Make
Listing these up front so you can scan and check your own code. I've made every one in production.
1. Showing the loader forever.…