# Articles & Reference guides

This is a collection of articles and reference guides that are relevant for this course.

You can use them to get a better understanding of the topics covered in this course, or to fill any gaps in your knowledge.

## IDE Setup

Guides about how to setup your IDE for both VSCode and Android Studio:

- [VSCode Shortcuts, Extensions & Settings for Flutter Development](https://codewithandrea.com/articles/vscode-shortcuts-extensions-settings-flutter-development/)
- [IntelliJ / Android Studio Shortcuts for Flutter Development](https://codewithandrea.com/articles/intellij-keyboard-shortcuts-flutter-development/)

## Navigation with GoRouter

In this course, we use GoRouter for navigation.

To get started, head to the [GoRouter package](https://pub.dev/packages/go_router) on pub.dev.

There is also a very extensive documentation site explaining all the most important concepts (though note that this is no longer maintained):

- [old GoRouter docs](https://docs.page/csells/go_router)

Additional articles from my site:

- [Flutter Navigation with GoRouter: Go vs Push](https://codewithandrea.com/articles/flutter-navigation-gorouter-go-vs-push/)
- [Flutter Bottom Navigation Bar with Nested Routes: GoRouter vs Beamer Comparison](https://codewithandrea.com/articles/flutter-bottom-navigation-bar-nested-routes-gorouter-beamer/)

## App Architecture

App architecture is a major focus in this course.

To complement the course material, I have written some reference articles.

Get started with these:

- [Flutter App Architecture with Riverpod: An Introduction](https://codewithandrea.com/articles/flutter-app-architecture-riverpod-introduction/)
- [Flutter Project Structure: Feature-first or Layer-first?](https://codewithandrea.com/articles/flutter-project-structure/)

Then, learn about each of the four main layers (data, domain, application, presentation):

- [Flutter App Architecture: The Repository Pattern](https://codewithandrea.com/articles/flutter-repository-pattern/)
- [Flutter App Architecture: The Domain Model](https://codewithandrea.com/articles/flutter-app-architecture-domain-model/)
- [Flutter App Architecture: The Presentation Layer](https://codewithandrea.com/articles/flutter-presentation-layer/)
- [Flutter App Architecture: The Application Layer](https://codewithandrea.com/articles/flutter-app-architecture-application-layer/)

## State Management & Riverpod

The course assumes you already have a basic understanding of state management in Flutter.

If you need a refrehsher, read this:

- [Flutter State Management Basics and Useful Resources](https://codewithandrea.com/videos/flutter-state-management-basics/)

Then, dive into Riverpod with my ultimate guide:

- [Flutter Riverpod 2.0: The Ultimate Guide](https://codewithandrea.com/articles/flutter-state-management-riverpod/)

Additional Riverpod articles to complement the course material:

- [How to handle loading and error states with StateNotifier & AsyncValue in Flutter](https://codewithandrea.com/articles/loading-error-states-state-notifier-async-value/)
- [Flutter Riverpod Tip: Use AsyncValue rather than FutureBuilder or StreamBuilder](https://codewithandrea.com/articles/flutter-use-async-value-not-future-stream-builder/)
- [AsyncValueWidget: a reusable Flutter widget to work with AsyncValue (using Riverpod)](https://codewithandrea.com/articles/async-value-widget-riverpod/)
- [Flutter Riverpod: How to Register a Listener during App Startup](https://codewithandrea.com/articles/riverpod-initialize-listener-app-startup/)

## Testing

Testing is a major focus and the course covers unit, widget, and integration testing in depth.

Additional articles:

- [How to Write Tests using Stream Matchers and Predicates in Flutter](https://codewithandrea.com/articles/async-tests-streams-flutter/)
- [How to Generate and Analyze a Flutter Test Coverage Report in VSCode](https://codewithandrea.com/articles/flutter-test-coverage/)
- [How to test functions that throw in Flutter](https://codewithandrea.com/tips/flutter-test-expect-tear-off/)
- [How to Add a Custom Test Timeout in Flutter](https://codewithandrea.com/tips/custom-test-timeout-flutter/)

## Design Patterns

The course assumes you're already familiar with the most common design patterns.

Here's some additional articles to help you out:

- [Singletons in Flutter: How to Avoid Them and What to do Instead](https://codewithandrea.com/articles/flutter-singletons/)
- [Side Effects in Flutter: What they are and how to avoid them](https://codewithandrea.com/articles/side-effects-flutter/)

## UI, Layouts & Animations

While some responsive UI concepts are introduced in section 1, this is **not** a course about building UIs.

Here are some additional resources:

- [Responsive layouts in Flutter: Split View and Drawer Navigation](https://codewithandrea.com/articles/flutter-responsive-layouts-split-view-drawer-navigation/)
- [How to create a Flutter GridView with content-sized items](https://codewithandrea.com/articles/flutter-layout-grid-content-sized-items/)

## JSON & Serialization

For the most part, we will use the [Dart Data Class Generator](https://marketplace.visualstudio.com/items?itemName=hzgood.dart-data-class-generator) extension to generate our data models.

Alternatives such as Freezed exist, and you can learn more broadly about JSON serialization here:

- [How to Parse JSON in Dart/Flutter: The Essential Guide](https://codewithandrea.com/articles/parse-json-dart/)
- [How to Parse JSON in Dart/Flutter with Code Generation using Freezed](https://codewithandrea.com/articles/parse-json-dart-codegen-freezed/)
- [How to Parse Large JSON Data with Isolates in Dart 2.15](https://codewithandrea.com/articles/parse-large-json-dart-isolates/)

## Error Handling

Section 10 of the course is all about error handling.

Here are some additional resources:

- [Flutter Exception Handling with try/catch and the Result type](https://codewithandrea.com/articles/flutter-exception-handling-try-catch-result-type/)
- [Functional Error Handling with Either and fpdart in Flutter: An Introduction](https://codewithandrea.com/articles/functional-error-handling-either-fpdart/)

## Localization

The official Flutter documentation contains the most complete info about localization:

- [Internationalizing Flutter apps](https://docs.flutter.dev/development/accessibility-and-localization/internationalization)

I've also shared these articles on my site:

- [Simplified Flutter Localization using a BuildContext extension](https://codewithandrea.com/articles/flutter-localization-build-context-extension/)
- [How to Read Localized Strings Outside the Widgets using Riverpod](https://codewithandrea.com/articles/app-localizations-outside-widgets-riverpod/)

## Dart Language

The course assumes you're already proficient with the Dart language.

If you need a refresher, I recommend these resources:

- [Dart Documentation](https://dart.dev/guides)
- [The Complete Dart Developer Guide](https://codewithandrea.com/courses/complete-dart-guide/) (my beginners course)

I have also written some articles here:

- [Dart Null Safety: The Ultimate Guide to Non-Nullable Types](https://codewithandrea.com/videos/dart-null-safety-ultimate-guide-non-nullable-types/)
- [Migrating a Flutter & Firebase app to Null Safety: A Case Study](https://codewithandrea.com/articles/migrating-flutter-firebase-app-null-safety/)
- [Top 16 Dart Tips and Tricks Every Flutter Developer Should Know](https://codewithandrea.com/videos/top-dart-tips-and-tricks-for-flutter-devs/)
- [Dart Extensions: Full Introduction and Practical Use Cases](https://codewithandrea.com/videos/dart-extensions-full-introduction/)

## Firebase

In the upcoming Flutter & Firebase Masterclass, we'll dive into Firebase.

In the meantime, here are some resources to get you started:

- [Firebase documentation](https://firebase.google.com/docs)
- [FlutterFire documentation](https://firebase.flutter.dev/docs/overview/) (outdated but still very useful)

I have also written some articles on my site:

- [How to add Firebase to a Flutter app with FlutterFire CLI](https://codewithandrea.com/articles/flutter-firebase-flutterfire-cli/)
- [Flutter Flavors Setup with multiple Firebase Environments using FlutterFire and Very Good CLI](https://codewithandrea.com/articles/flutter-flavors-for-firebase-apps/)
- [Firebase Cloud Functions: Introduction and Project Setup](https://codewithandrea.com/articles/firebase-cloud-functions/)
- [Flutter Tutorial: How to use the Firebase Local Emulator with Cloud Functions](https://codewithandrea.com/articles/flutter-tutorial-firebase-cloud-functions/)

## Flutter in Production

The third course will cover Flutter in production and I plan to write some additional articles on the topic.

For now, here's a guide about storing API keys:

- [How to Store API Keys in Flutter: --dart-define vs .env files](https://codewithandrea.com/articles/flutter-api-keys-dart-define-env-files/)


Happy coding!