{"id":13549869,"url":"https://github.com/bizz84/complete-flutter-course","last_synced_at":"2025-05-15T03:05:55.094Z","repository":{"id":37640184,"uuid":"459186377","full_name":"bizz84/complete-flutter-course","owner":"bizz84","description":"Flutter Foundations Course - eCommerce App","archived":false,"fork":false,"pushed_at":"2025-05-12T09:27:16.000Z","size":5713,"stargazers_count":874,"open_issues_count":3,"forks_count":295,"subscribers_count":30,"default_branch":"main","last_synced_at":"2025-05-13T19:19:51.511Z","etag":null,"topics":["firebase","flutter"],"latest_commit_sha":null,"homepage":"https://codewithandrea.com/courses/flutter-foundations/","language":"Dart","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bizz84.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-02-14T14:04:48.000Z","updated_at":"2025-05-12T09:27:20.000Z","dependencies_parsed_at":"2024-01-14T15:26:43.066Z","dependency_job_id":"d5e20fd8-dbf6-4bb9-8e13-5a3ca2ce5370","html_url":"https://github.com/bizz84/complete-flutter-course","commit_stats":{"total_commits":225,"total_committers":1,"mean_commits":225.0,"dds":0.0,"last_synced_commit":"f7f00196aba4fc9f4f3ae82ce9eae9caae8b6013"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bizz84%2Fcomplete-flutter-course","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bizz84%2Fcomplete-flutter-course/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bizz84%2Fcomplete-flutter-course/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bizz84%2Fcomplete-flutter-course/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bizz84","download_url":"https://codeload.github.com/bizz84/complete-flutter-course/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254264765,"owners_count":22041793,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["firebase","flutter"],"created_at":"2024-08-01T12:01:26.496Z","updated_at":"2025-05-15T03:05:55.077Z","avatar_url":"https://github.com/bizz84.png","language":"Dart","funding_links":[],"categories":["Dart"],"sub_categories":[],"readme":"# Flutter Foundations Course - eCommerce App\n\nThis is the official repo for this course:\n\n- [Flutter Foundations](https://codewithandrea.com/courses/flutter-foundations/)\n\nThis will include a full-stack eCommerce app using Flutter \u0026 Firebase:\n\n![eCommerce App Preview](/.github/images/ecommerce-app-preview.png)\n\nA Flutter web preview of the app can be found here:\n\n- [Flutter Web Demo](https://ecommerce-app-scratch.web.app/)\n\n## Project Setup\n\nTo clone the repo for the first time and open it in VSCode, run this:\n\n```\ngit clone https://github.com/bizz84/complete-flutter-course.git\ncd complete-flutter-course\ncode .\n```\n\nThis will checkout the `main` branch which contains the **latest code**.\n\nBut at various points in the course, I'll ask you to checkout a **specific branch name**, so you can follow along with the right code, at the right time.\n\nAnd to prevent any conflicts, you may need to reset your local changes:\n\n```\ngit reset --hard HEAD\ngit checkout \u003cbranch-name\u003e\n```\n\n## Troubleshooting\n\nIf the course project doesn't compile or run for you, there are a number of things to look out for.\n\nI'm keeping a list of all the FAQs here:\n\n- [List of Common Problems and Solutions](https://pro.codewithandrea.com/flutter-foundations/a1-common-problems/a-intro)\n\n## Flutter Foundations - Course Syllabus\n\n### 1. Intro \u0026 Project Overview\n\n1. What you will learn in this course\n2. Section overview\n3. VSCode Shortcuts, Extensions \u0026 Settings for Flutter development\n4. Join the Slack Channel\n5. Course Project on GitHub\n6. Download the Starter Project \u0026 `pubspec.yaml` overview\n7. eCommerce app overview\n8. Code walkthrough: project structure\n9. Exploring the codebase with the Widget Inspector (DevTools)\n10. UI Design Principles: Composition \u0026 Reusable Widget Classes\n11. Useful Widgets for Responsive Design\n12. App Localization\n\n### 2. Navigation with GoRouter\n\n1. Section Intro\n2. Limitations of Navigator 1.0\n3. GoRouter installation \u0026 initial setup with `MaterialApp.router`\n4. Routes, sub-routes and navigation\n5. `GoRouterHelper` Extension and `pageBuilder`\n6. Adding some additional routes\n7. Routing by **path** vs routing by **name**\n8. Routing with parameters\n9. GoRouter error handling\n10. Navigating with **go** vs **push**\n11. Adding the remaining routes\n12. How to pop a route with GoRouter\n13. Nested Navigation\n14. Bug fix \u0026 wrap up\n\n### 3. Flutter App Architecture\n\n1. Section Intro\n2. Popular App Architectures: MVC, MVP, MVVM, Clean Architecture, Bloc\n3. Riverpod App Architecture with the Controller-Service-Repository Pattern\n4. Project Structure: Feature-first vs Layer-first\n5. The Repository Pattern and the Data Layer\n6. Implementing the \"fake\" products repository as a singleton\n7. Working with Future and Stream-based APIs\n8. Wrap Up\n\n### 4. State Management with Riverpod - Part 1 (Product Listings)\n\n1. Section Intro\n2. Introduction to Riverpod\n3. Riverpod installation and setup\n4. Creating our first provider\n5. Reading providers with `ConsumerWidget` and `Consumer`\n6. Working with `FutureProvider`, `StreamProvider`, and `AsyncValue`\n7. Testing `AsyncValue` by adding a delay\n8. The `family` modifier\n9. The `autoDispose` modifier + advanced data caching options\n10. Creating a reusable `AsyncValueWidget` helper\n11. Wrap Up + Exercise\n\n### 5. State Management with Riverpod - Part 2 (Authentication Flow)\n\n1. Section intro\n2. Implementing a fake authentication repository\n3. Creating repositories using abstract classes (optional)\n4. Intro: a reactive in-memory store with RxDart\n5. Implementing the `InMemoryStore` with RxDart\n6. Using the `InMemoryStore` in the `FakeAuthRepository`\n7. Accessing the `FakeAuthRepository` with `ref.read()` in the `AccountScreen`\n8. Creating our first controller using `StateNotifier`\n9. Using the `StateNotifier` inside the `AccountScreen` widget\n10. Listening to provider state changes with `ref.listen()`\n11. Bug-fix for `Navigator.pop`\n12. The `AsyncValue.guard` method\n13. Adding an `AsyncValue` extension method\n14. Using the `authStateChangesProvider` in `HomeAppBar`\n15. Intro to the email \u0026 password sign-in screen\n16. How to generate immutable state classes in Dart\n17. Using `AsyncValue` inside `EmailPasswordSignInState`\n18. Implementing the `EmailPasswordSignInController`\n19. Using the `EmailPasswordSignInController` in the widget class\n20. Bug fix + filtering state updates with `select()`\n21. GoRouter redirects\n22. GoRouter: the `refreshListenable` argument\n23. Wrap Up\n\n### 6. Automated Testing - Part 1\n\n1. Section Intro\n2. Introduction to Automated Testing and the Testing Pyramid\n3. Getting started with automated testing\n4. Writing the first unit test + adding `toString()` and equality implementations\n5. Test matchers and working with methods that throw exceptions\n6. Fixing the `getProduct()` method and updating the unit tests\n7. Working with groups and testing Futures and Streams\n8. Adding an optional delay to the `FakeProductsRepository`\n9. How to generate a Flutter test coverage report in VSCode\n10. Testing the `FakeAuthRepository` (part 1)\n11. Testing the `FakeAuthRepository` (part 2) + advanced stream matchers\n12. Mocks vs Fakes + installing the mocktail package\n13. Testing the `AccountScreenController` (part 1) + `AsyncValue` subclasses\n14. Testing the `AccountScreenController` (part 2) + working with mocks\n15. Testing the `AccountScreenController` (part 3) + type matchers\n16. Testing with Stream Matchers and Predicates\n17. Testing lifecycle methods (`setUp`, `tearDown`, `setUpAll`, `tearDownAll`)\n18. Testing the `EmailPasswordSignInController` with acceptance criteria\n19. Testing the `EmailPasswordSignInController` (part 2)\n20. Tip: setting custom test timeouts per-file\n21. Adding a test workflow to automate testing with GitHub Actions\n22. Wrap up\n\n### 7. Automated Testing - Part 2\n\n1. Section Intro\n2. Introduction to widget tests + starter project\n3. Writing our first widget test using `pumpWidget()`\n4. Working with `WidgetTester` and finder\n5. Robot testing\n6. How to find widgets by key\n7. Writing widget tests with mocks and provider overrides\n8. Writing widget tests with `Future.delayed()` and `runAsync()`\n9. Adding the email \u0026 password widget tests\n10. Adding the email \u0026 password widget tests (part 2)\n11. Test setup for the authentication flow + using `pumpAndSettle()`\n12. Fixing the RenderFlex overflow error\n13. Completing the authentication flow test\n14. Integration tests\n15. Golden image tests\n16. Running golden image tests with size variants\n17. How to deal with holden image tests failing on CI\n18. Wrap Up\n\n### 8. Feature: Shopping Cart\n\n1. Section Intro\n2. Overview of the shopping cart feature + technical requirements\n3. App Architecture for the shopping cart feature\n4. Starter project + overview of the data and domain layers\n5. Local data persistence with Sembast: Initial setup\n6. How to persist the shopping cart data with the `SembastCartRepository`\n7. Implementing the `CartService` class\n8. Updating the `CartService` class to read dependencies using `Ref`\n9. Writing unit tests using `ProviderContainer`\n10. Writing the unit tests for the `CartService` class\n11. Implementing the `AddToCartController`\n12. Updating the `AddToCartWidget`\n13. Bug Fix: Adding `autoDispose` to the `AddToCartController`\n14. Showing the cart items in the `ShoppingCartScreen` + AutoDispose vs AlwaysAlive error when combining providers\n15. Implementing the `ShoppingCartItemController`\n16. Updating the `EditOrRemoveItemWidget` and `ShoppingCartScreen` widgets\n17. Calculating and showing the cart items count\n18. Calculating and showing the cart total price\n19. Limiting the available quantity when adding items to the shopping cart\n20. Implementing the `CartSyncService` with a listener\n21. Registering the `CartSyncService` with `ProviderContainer` when the app starts\n22. Implementing the logic inside the `CartSyncService`\n23. Implementing the logic inside the `CartSyncService` (part 2 - optional)\n24. Unit tests for the `CartSyncService`\n25. Unit-testing providers with dependencies using `ProviderContainer`\n26. Updated widget and integration tests\n27. Wrap up + exercise (implement a wish list feature)\n\n### 9. Feature: Checkout Flows\n\n1. Section intro\n2. Starter project for the checkout flows\n3. Updating the `CheckoutScreen` with the `PageController` initialization logic\n4. Do we need a `StateNotifier` for the `CheckoutScreen`?\n5. Updating the `PaymentPage`\n6. Implementing the `PaymentButtonController`\n7. Wrap Up\n\n### 10. Error Handling\n\n1. Intro\n2. Errors vs exceptions\n3. Starter project overview + defining custom exceptions with enums\n4. Using sealed classes to define exception types\n5. Using the `AppException` sealed class in the `FakeAuthRepository`\n6. Adding an `AsyncErrorLogger` using `ProviderObserver`\n7. Creating a reusable `ErrorLogger` to catch all exceptions\n8. Completing the error handling system\n9. Working with the `Result` type (`Success` and `Error`)\n10. Drawbacks of the `Result` type (and when not to use it)\n11. Wrap Up\n\n### 11. Feature: Product Reviews\n\n1. Section Intro\n2. Starter project overview\n3. Overview of the `LeaveReviewScreen`\n4. Implemeting a `LeaveReviewController` and submitting form data\n5. Testing the `LeaveReviewForm` and preventing an `AssertionError`\n6. Dismissing the `LeaveReviewScreen` programmatically on success using a callback\n7. How to prefill a form with data from a repository/backend\n8. Optimization: only submit the form if the data has changed\n9. Showing existing reviews in the `ProductReviewsList`\n10. Updating the `LeaveReviewAction` by reading read data from the `userPurchaseProvider`\n11. Calculating the average product ratings\n12. Updated tests \u0026 wrap up\n\n### 12. Feature: Products Search\n\n1. Section Intro\n2. Client-side vs server-side search\n3. Adding a search method to the `FakeProductsRepository`\n4. Implementing client-side search with `StateProvider` and `FutureProvider`\n5. Riverpod caching with `autoDispose`, `keepAlive()` and `Timer`\n6. Debouncing and cancelling network requests\n\n### 13. New Riverpod 2.x APIs \u0026 Riverpod Generator\n\n1. Introduction to Riverpod 2.x\n2. Starter project and updated code walkthrough\n3. Installing the Riverpod Generator package\n4. Generating providers with the `@riverpod` syntax\n5. Migrating some more providers to Riverpod Generator + the `keepAlive` syntax\n6. Migrating the `AccountScreenController` from `StateNotifier` to `AsyncNotifier`\n7. Converting the `AccountScreenController` to use Riverpod Generator\n8. How to check if an `AsyncNotifier` is mounted\n9. How to write unit tests for `AsyncNotifier` subclasses\n10. Wrap Up\n11. Conclusion \u0026 Next Steps\n\n### [LICENSE: MIT](LICENSE.md)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbizz84%2Fcomplete-flutter-course","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbizz84%2Fcomplete-flutter-course","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbizz84%2Fcomplete-flutter-course/lists"}