
When writing tests for functions that throw, we should not invoke them directly, but rather pass them as arguments using a tear-off. https://codewithandrea.com/tips/flutter-test-expect-tear-off/

How to implement controller classes that can hold business logic, manage widget state, and interact with repositories in the data layer. https://codewithandrea.com/articles/flutter-presentation-layer/

Ever needed to update a value if a given key already exists, or set it if it doesn't? Here's how to use the Map.update() method to solve this. https://codewithandrea.com/tips/dart-map-update-method/

If you have many StateNotifier subclasses, using try/catch can be tedious. With AsyncValue.guard you get the same result with less boilerplate. https://codewithandrea.com/tips/async-value-guard-try-catch/

How to use the flutter tool generate a test coverage report for your app or package, and improve your testing workflow with two helpful VSCode extensions. https://codewithandrea.com/articles/flutter-test-coverage/

An in-depth explanation of the difference between Go and Push when using GoRouter for declarative routing. https://codewithandrea.com/articles/flutter-navigation-gorouter-go-vs-push/

An overview of the "features inside layers" vs "layers inside features" approach when choosing a project structure for medium/large Flutter apps. https://codewithandrea.com/articles/flutter-project-structure/

An introduction to a new App Architecture based on Riverpod, and comparison with other popular ones such as MVC, MVVM, Bloc, Stacked & Clean Architecture. https://codewithandrea.com/articles/flutter-app-architecture-riverpod-introduction/

The AsyncValue class from the Riverpod package offers a much nicer API compared to AsyncSnapshot from the FutureBuilder and StreamBuilder widgets. Here's how to use it. https://codewithandrea.com/articles/flutter-use-async-value-not-future-stream-builder/

A curated list of VSCode productivity tips to speed-up your Flutter development workflow. https://codewithandrea.com/articles/vscode-shortcuts-extensions-settings-flutter-development/