Link đây nhé các thím. Mình đánh giá bộ này cực kỳ đầy đủ, dễ hiểu. Theo mình, thì dùng combo riverpod + gorouter như course này là có thể chiến 90% usercases rồi.
Khi nào kiếm được tiền từ flutter thì ráng mua ủng hộ tác giả nhé các thím.
google drive
pass unzip: vozloser
List video cho các thím tham khảo.
10.10. Working with the Result type (Success and Error).mp4
10.11. Drawbacks of the Result type (and when not to use it).mp4
10.12. Wrap up.mp4
10.1. Section Intro.mp4
10.2. Errors vs exceptions.mp4
10.3. Starter project overview + defining custom exceptions with enums and subclasses.mp4
10.4. Freezed Introduction and Installation.mp4
10.5. Creating an AppException class with Freezed.mp4
10.6. Updating the AsyncValueUI extension to handle AppException values.mp4
10.7. Adding an AsyncErrorLogger using ProviderObserver.mp4
10.8. Creating a reusable ErrorLogger to catch all exceptions.mp4
10.9. Completing the error handling system.mp4
1.10. UI Design Principles Composition & Reusable Widget Classes.mp4
11.10. Updating the LeaveReviewAction by reading read data from the userPurchaseProvider.mp4
11.11. Calculating the average product ratings.mp4
11.12. Updated tests & wrap up.mp4
11.1. Section Intro.mp4
1.11. Useful Widgets for Responsive Design.mp4
1.12. App Localization.mp4
11.2. Starter project overview.mp4
11.3. Overview of the LeaveReviewScreen.mp4
11.4. Implemeting a LeaveReviewController and submitting form data.mp4
11.5. Testing the LeaveReviewForm and preventing an AssertionError.mp4
11.6. Dismissing the LeaveReviewScreen programmatically on success using a callback.mp4
11.7. How to prefill a form with data from a repository backend.mp4
11.8. Optimization only submit the form if the data has changed.mp4
11.9. Showing existing reviews in the ProductReviewsList.mp4
1.1. What you will learn in this course.mp4
12.1. Section Intro.mp4
12.2. Client-side vs server-side search.mp4
12.3. Adding a search method to the FakeProductsRepository.mp4
12.4. Implementing client-side search with StateProvider and FutureProvider.mp4
12.5. Riverpod caching with autoDispose and cacheTime.mp4
12.6. Debouncing and cancelling network requests.mp4
1.2. Section overview.mp4
13.10. Wrap Up.mp4
13.11. Conclusion & Next Steps.mp4
13.1. Introduction to Riverpod 2.x.mp4
13.2. Starter project and updated code walkthrough.mp4
13.3. Installing the Riverpod Generator package.mp4
13.4. Generating providers with the @riverpod syntax.mp4
13.5. Migrating some more providers to Riverpod Generator + the keepAlive syntax.mp4
13.6. Migrating the AccountScreenController from StateNotifier to AsyncNotifier.mp4
13.7. Converting the AccountScreenController to use Riverpod Generator.mp4
13.8. How to check if an AsyncNotifier is mounted.mp4
13.9. How to write unit tests for AsyncNotifier subclasses.mp4
1.3. VSCode Shortcuts, Extensions & Settings for Flutter development.mp4
1.4. Join the Slack Channel.mp4
1.5. Course Project on GitHub.mp4
1.6. Download the Starter Project & pubspec.yaml overview.mp4
1.7. eCommerce app overview.mp4
1.8. Project structure & code walkthrough.mp4
1.9. Exploring the codebase with the Widget Inspector (DevTools).mp4
2.10. Navigating with go vs push.mp4
2.11. Adding the remaining routes.mp4
2.12. How to pop a route with GoRouter.mp4
2.13. Nested Navigation.mp4
2.14. Wrap up + Exercise.mp4
2.1. Section Intro.mp4
2.2. Limitations of Navigator 1.0.mp4
2.3. GoRouter installation & initial setup with MaterialApp.router.mp4
2.4. Routes, sub-routes and navigation.mp4
2.5. GoRouterHelper Extension and pageBuilder.mp4
2.6. Adding some additional routes.mp4
2.7. Routing by path vs routing by name.mp4
2.8. Routing with parameters.mp4
2.9. GoRouter Error Handling.mp4
3.1. Section Intro.mp4
3.2. Popular App Architectures MVC MVP MVVM Clean Architecture Bloc.mp4
3.3. Riverpod App Architecture with the Controller-Service-Repository Pattern.mp4
3.4. Project Structure Feature-first vs Layer-first.mp4
3.5. The Repository Pattern and the Data Layer.mp4
3.6. Implementing the fake products repository as a singleton.mp4
3.7. Working with Future and Stream-based APIs.mp4
3.8. Wrap Up.mp4
4.10. Creating a reusable AsyncValueWidget helper.mp4
4.11. Wrap Up + Exercise.mp4
4.1. Section Intro.mp4
4.2. Introduction to Riverpod.mp4
4.3. Riverpod installation and setup.mp4
4.4. Creating our first provider.mp4
4.5. Reading providers with ConsumerWidget and Consumer.mp4
4.6. Working with FutureProvider, StreamProvider, and AsyncValue.mp4
4.7. Testing AsyncValue by adding a delay.mp4
4.8. The family modifier.mp4
4.9. The autoDispose modifier + advanced data caching options with keepAlive() & Timer.mp4
5.10. Listening to provider state changes with ref.listen().mp4
5.11. Bug-fix for Navigator.pop.mp4
5.12. The AsyncValue.guard method.mp4
5.13. Adding an AsyncValue extension method.mp4
5.14. Using the authStateChangesProvider in HomeAppBar.mp4
5.15. Intro to the email & password sign-in screen.mp4
5.16. How to generate immutable state classes in Dart (EmailPasswordSignInState).mp4
5.17. Using AsyncValue inside EmailPasswordSignInState.mp4
5.18. Implementing the EmailPasswordSignInController.mp4
5.19. Using the EmailPasswordSignInController in the widget class.mp4
5.1. Section intro.mp4
5.20. Bug fix + filtering state updates with select().mp4
5.21. GoRouter redirects.mp4
5.22. GoRouter the refreshListenable argument.mp4
5.23. Fixing the checkout flows after changes to refreshListenable (advanced).mp4
5.24. Wrap Up + Exercise.mp4
5.2. Implementing a fake authentication repository.mp4
5.3. Creating repositories using abstract classes (optional).mp4
5.4. Intro a reactive in-memory store with RxDart.mp4
5.5. Implementing the InMemoryStore with RxDart.mp4
5.6. Using the InMemoryStore in the FakeAuthRepository.mp4
5.7. Accessing the FakeAuthRepository with ref.read() in the AccountScreen.mp4
5.8. Creating our first controller using StateNotifier.mp4
5.9. Using the StateNotifier inside the AccountScreen widget.mp4
6.10. Testing the FakeAuthRepository (part 1).mp4
6.11. Testing the FakeAuthRepository (part 2) + advanced stream matchers.mp4
6.12. Mocks vs Fakes + installing the mocktail package.mp4
6.13. Testing the AccountScreenController (part 1) + AsyncValue subclasses.mp4
6.14. Testing the AccountScreenController (part 2) + working with mocks.mp4
6.15. Testing the AccountScreenController (part 3) + type matchers.mp4
6.16. Testing with Stream Matchers and Predicates.mp4
6.17. Testing lifecycle methods (setUp, tearDown, setUpAll, tearDownAll).mp4
6.18. Testing the EmailPasswordSignInController with Acceptance Criteria.mp4
6.19. Testing the EmailPasswordSignInController (part 2).mp4
6.1. Section Intro.mp4
6.20. Tip setting custom test timeouts per-file.mp4
6.21. Adding a test workflow to automate testing with GitHub Actions.mp4
6.22. Wrap up.mp4
6.2. Introduction to Automated Testing and the Testing Pyramid.mp4
6.3. Getting started with automated testing.mp4
6.4. Writing the first unit test + adding toString() and equality implementations.mp4
6.5. Test matchers and working with methods that throw exceptions.mp4
6.6. Fixing the getProduct() method and updating the unit tests.mp4
6.7. Working with groups and testing Futures and Streams.mp4
6.8. Adding an optional delay to the FakeProductsRepository.mp4
6.9. How to generate a Flutter test coverage report in VSCode.mp4
7.10. Adding the email & password widget tests (part 2).mp4
7.11. Test setup for the authentication flow + using pumpAndSettle().mp4
7.12. Fixing the RenderFlex overflow error.mp4
7.13. Completing the authentication flow test.mp4
7.14. Integration tests.mp4
7.15. Golden image tests.mp4
7.16. Running golden image tests with size variants.mp4
7.17. How to deal with Golden Image tests failing on CI.mp4
7.18. Wrap Up.mp4
7.1. Section Intro.mp4
7.2. Introduction to widget tests + starter project.mp4
7.3. Writing our first widget test using pumpWidget().mp4
7.4. Working with WidgetTester and finder.mp4
7.5. Robot testing.mp4
7.6. How to find widgets by key.mp4
7.7. Writing widget tests with mocks and provider overrides.mp4
7.8. Writing widget tests with Future.delayed() and runAsync().mp4
7.9. Adding the email & password widget tests.mp4
8.10. Writing the unit tests the CartService class.mp4
8.11. Implementing the AddToCartController.mp4
8.12. Updating the AddToCartWidget.mp4
8.13. Bug Fix Adding autoDispose to the AddToCartController.mp4
8.14. Showing the cart items in the ShoppingCartScreen + AutoDispose vs AlwaysAlive error when combining providers.mp4
8.15. Implementing the ShoppingCartItemController.mp4
8.16. Updating the EditOrRemoveItemWidget and ShoppingCartScreen widgets.mp4
8.17. Calculating and showing the cart items count.mp4
8.18. Calculating and showing the cart total price.mp4
8.19. Limiting the available quantity when adding items to the shopping cart.mp4
8.1. Section Intro.mp4
8.20. Implementing the CartSyncService with a listener.mp4
8.21. Registering the CartSyncService with ProviderContainer when the app starts.mp4
8.22. Implementing the logic inside the CartSyncService.mp4
8.23. Implementing the logic inside the CartSyncService (part 2 - optional).mp4
8.24. Unit tests for the CartSyncService.mp4
8.25. Unit-testing providers with dependencies using ProviderContainer.mp4
8.26. Updated widget and integration tests.mp4
8.27. Wrap up + exercise (implement a wish list feature).mp4
8.2. Overview of the shopping cart feature + technical requirements.mp4
8.3. App Architecture for the Shopping Cart Feature.mp4
8.4. Starter project + Overview of the data and domain layers.mp4
8.5. Local Data Persistence with Sembast Initial Setup.mp4
8.6. How to persist the shopping cart data with the SembastCartRepository.mp4
8.7. Implementing the CartService class.mp4
8.8. Updating the CartService class to read dependencies using Ref.mp4
8.9. Writing unit tests using ProviderContainer.mp4
9.1. Section intro.mp4
9.2. Starter project for the checkout flows.mp4
9.3. Updating the CheckoutScreen with the PageController initialization logic.mp4
9.4. Do we need a StateNotifier for the CheckoutScreen.mp4
9.5. Updating the PaymentPage.mp4
9.6. Implementing the PaymentButtonController.mp4
9.7. Wrap Up.mp4
ecommerce_app_section10.zip
ecommerce_app_section11.zip