How to Setup Flutter & Firebase with Multiple Flavors using the FlutterFire CLI
16 min read
Learn how to set up Firebase for multiple flavors in your Flutter app using the FlutterFire CLI. This guide covers iOS, Android, and web configurations.
Learn how to set up Firebase for multiple flavors in your Flutter app using the FlutterFire CLI. This guide covers iOS, Android, and web configurations.
Prepare your Flutter app for launch with these 6 steps, including flavors and environments, error monitoring, force updates, and in-app reviews.
The in_app_review package makes it easy to ask for reviews. And by using a data-driven approach, you can show the prompt at the right time.
An overview of different techniques for storing API keys on the client, along with security best practices to prevent them from being stolen.
A curated list of popular VSCode shortcuts, extensions & settings to speed-up your Flutter development workflow and code like a pro.
An extensive guide covering the code generation mechanism in Dart, useful code-generating packages, and tips for efficient codebase maintenance.
A complete guide to implementing pagination with Riverpod, covering: infinite scrolling, loading and error states, search UI, caching, and debouncing.
Learn how to build and deploy a Dart Shelf App that taps into the OpenAI API without exposing the API key in your Flutter client.
Some useful Riverpod techniques you can use to initialize async dependencies, show some loading UI, and handle errors during app startup.
A step-by-step tutorial showing how to deploy your Flutter web apps to GitHub Pages using Makefiles.
An overview of the technologies I used, challenges I faced, and insights I gained from shipping Code With Andrea Pro, my new course platform.
Is FlutterFlow the real deal? Or should you ignore it and continue building apps the old-fashioned way? Here's my take as an experienced developer.
A tour of the new Copilot features. Learn how its AI assists with code, tests, and commits, and find out if it's right for your Flutter projects.
A step-by-step tutorial showing how to implement deep links in Flutter using GoRouter, including the native Android and iOS platform setup.
Find out when to use one-time reads and when to switch to realtime updates in Flutter development for optimal app performance and user experience.
A helpful guide for your next Flutter app, providing insights from UX flows selection to GitHub boards and processes for efficient execution.
An introduction to webhooks for Flutter developers, showing how to create, register, and secure a Stripe webhook using Firebase Cloud Functions.
When building mobile apps, we often need to fetch and mutate data. This article explains how to do it effectively using my reference Riverpod architecture.
How to implement controller classes that can hold business logic, manage widget state, and interact with repositories in the data layer.
A step-by-step guide showing how to store API keys with the Google Secrets Manager, and access them securely inside 2nd-Gen Cloud Functions.
Comparing my Riverpod App Architecture with other popular ones such as MVC, MVVM, Bloc, Stacked, Clean Architecture, and Android App Architecture.
Introducing a new Riverpod App Architecture that can be used to build scalable and maintainable apps with a clear structure.
An in-depth explanation of the difference between Go and Push when using GoRouter for declarative routing.
Learn how to parse JSON and define type-safe model classes that can handle validation, nullable/optional values, and complex/nested JSON data (updated to Dart 3).
How to implement bottom and side navigation with stateful nested routes in Flutter using the GoRouter package (example app with source code included).
How to use sealed classes to create a Result type that makes it explicit when a function can return an error, rather than throwing an exception.
Getting a Flutter & Firebase app to work on macOS is a tricky endeavour. Follow this step-by-step guide to get it working.
An overview of the major features introduced in Dart 3, including: records, patterns, switch expressions, sealed classes, and class modifiers.
An in-depth overview of what abstractions to use to write backend-agnostic code that is more testable and maintainable, along with their tradeoffs.
A simple guide showing how to use the FirestoreListView widget to enable pagination when loading large collections of documents from Firestore.
The new Riverpod Lint package adds useful lints and refactoring options that make writing Flutter apps a breeze. Here's how to make the most of it.
A step-by-step guide showing how to migrate StateProvider and StateNotifier to the new Notifier and AsyncNotifier classes (StreamNotifier is covered too).
Thanks to the new Riverpod Generator package, we no longer have to declare providers manually. This guide explains how to use the new @riverpod syntax.
AsyncNotifier does not have a mounted property and this can cause some problems in practice. This article explores some solutions and their tradeoffs.
Let's explore some techniques to separate our business logic and navigation code from the UI, using GoRouter and Riverpod.
I asked ChatGPT to explain some code and write several programs in Dart & Flutter. Here's a full report with my findings, and some tips to make the most of it.
Riverpod is a powerful reactive caching and data-binding framework. Let’s learn how to make the most of it so we can use it effectively.
AsyncNotifier is great. But how do we write unit tests for it? Here are all the details and a template you can follow to test your AsyncNotifier subclasses.
A complete guide to the Riverpod package as a reactive caching and data-binding framework. Fully updated to Riverpod 2.0.
How to access localized strings outside your widgets without a BuildContext, by creating a locale-aware AppLocalizations provider using Riverpod.
Fpdart aims to bring all the main types found in functional languages to Dart. Here we focus on the Either type and learn how to use it for robust error handling.
An overview of how we can use Riverpod to register listeners and initialize complex objects with dependencies during app startup.
An introduction to singletons in Flutter: what problems they solve, what other ones they introduce, and what are their alternatives.
Service classes are the ideal place to store logic that depends on multiple data sources or repositories. Let's explore them by building a shopping cart feature.
Asking questions and receiving answers is a two-way street. Here's what to do when you need to ask a technical coding question.
The Flutter testing APIs offer some powerful stream matchers and predicates that we can use to verify state changes over time. Let's see how to use them in practice.
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.
An overview of the feature-first and layer-first approaches when choosing a project structure for medium/large Flutter apps, along with their tradeoffs and common pitfalls.
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.
An introduction to the domain model and its role in defining entities and the business logic for manipulating them in the context of Flutter app architecture.
How to simplify the Flutter skeleton app template to more easily access localized strings inside our widgets.
An in-depth overview of the repository pattern in Flutter: what it is, when to use it, and various implementation strategies along with their tradeoffs.
When performing asynchronous work, we need to account for loading and error states in our UI. This article presents simple and reusable approach to handle this across multiple screens.
How to parse large JSON data using compute, Isolate.spawn, and Isolate.exit - a new feature for fast concurrency with worker isolates in Dart 2.15.
How to implement a responsive layout in Flutter by using a split view on large screens and drawer navigation on mobile.
GridView is only suitable for items with a fixed aspect ratio. Here's how to use the flutter_layout_grid package to render responsive layouts with variable item sizes.
Let's build a simple mood tracking app and learn how to work with Firestore, Cloud Functions, and the Firebase Local Emulator.
Learn how to setup your first project using Cloud Functions for Firebase. Includes additional resources about Node.js and the Firebase CLI.
Learn how to use the Flutter TabBar widget to take the user through a sequence of pages, and disable user interaction on the tabs themselves.
A tutorial about text input validation, showing how to work with TextField, TextEditingController, Form, TextFormField as well as their tradeoffs.
How to create a reusable widget class that helps us when working with asynchronous data from Riverpod providers.
A simple and elegant approach to build a Chat Messaging UI with DecoratedBox, Align, and Padding widgets in Flutter.
How to animate a custom task completion ring using AnimationController and AnimatedBuilder in Flutter.
CustomPainter is often the way to go when we need to draw some custom shapes in Flutter. Let's see how to use it in practice.
Migrating Flutter apps to Null Safety can be a challenging process. Here I show how to make this as painless as possible, using a non-trivial app as an example.
Need a Flutter widget that updates every frame? Here's why using Timer is not a good choice, and why Ticker is a much better solution.
Tired of writing JSON parsing code by hand? Here's how to automate this with code generation and the Freezed package.
Mutating state or calling async code inside the build method can cause unwanted widget rebuilds and unintended behaviour. Here are some examples and rules to follow.
How to create a custom animation curve and implement a shake effect that can be applied to any widget in Flutter.
Why and when to use the child widget argument to optimize Flutter performance when working with TweenAnimationBuilder and AnimatedBuilder.
Going from RGB to HSL: How to more easily reason about colors as hue, saturation and lightness, and how to use HSL in Flutter.
Should you choose Flutter or React Native for your next app? This article offers an in-depth overview of the two frameworks, along with their pros and cons.
A guide to implementing multiple independent navigation stacks with BottomNavigationBar in Flutter.
This step-by-step guide shows how to install keytool and add it to your system PATH on Windows and macOS.
What implicit downcasts are, why they make your code unsafe, and how to avoid them.
Let's see how to write integration tests with Flutter Driver, how they differ from widget tests, and how to run them with Codemagic.
Let's see how use service classes to encapsulate 3rd party libraries and APIs, and decouple them from the rest of the application. We will use authentication as a concrete example of this.
This article shows how to use scoped access with Provider when using service classes in our Flutter apps.
In this article we implement a simple authentication flow in Flutter, in less than 100 lines of code.
This article introduces a new architectural pattern that I often use in my Flutter Apps. It is inspired by BLoCs and RxVMS.
Detailed side-by-side comparison of language features between Dart 2.1 and Swift 4.2.
Clarifications and apologies following my previous article.
Controversial article with some history and a detailed comparison between Flutter and native iOS development. Includes an example showing how to build a contact list in Flutter and iOS.
Flutter is awesome! Big thanks to the Flutter team and all the people in the wider community that keep pushing this project to new heights and sharing new learning material.
Let's learn about color gradients, composition, writing reusable UI code, and CupertinoSegmentedControl.
Let's see how to load a CSV file into strongly-typed model classes, that can be used to calculate CO2 emissions for flights between two airports.
Let's see how to use some custom code to add animated overlays and reveal action options from a FAB.
How to dock a floating action button in the middle of a BottomAppBar.
List of the most useful IntelliJ/Android Studio shortcuts for better productivity.
Let's see how to use platform channels by building an image picker on iOS, and using it from the Dart code.
This article shows how to write testable code in Flutter, and take your widget tests to the next level.
In-depth performance comparison for a stopwatch app built in native iOS vs Flutter.