By Randal L. Schwartz, and a few million TPU cycles
Motto: "With the rigor of Bloc and the flex and speed of Signal"
Why You Don't Have to Tear Up Your Codebase to Enjoy the Speed of Synchronous Signals
If you have followed my talks, articles, or comments in the Flutter community over the years, you know I have been a strong advocate for Riverpod. Riverpod solved many of the fundamental global-state scoping issues inherent in classic InheritedWidget patterns, providing compile-safe dependency injection and clean state isolation.
However, as the Flutter ecosystem evolved toward Riverpod 3, I grew increasingly wary of the direction being pushed: a heavy reliance on mandatory code generation (@riverpod annotations, build_runner, macros). Code generation introduces build-step friction, bloats compile times, and makes debugging generated syntax opaque.






