Это пробный урок. Оформите подписку, чтобы получить доступ ко всем материалам курса. Премиум

  1. Урок 1. 00:03:15
    What you will learn in this course
  2. Урок 2. 00:01:17
    Section overview
  3. Урок 3. 00:01:45
    VSCode Shortcuts, Extensions & Settings for Flutter development
  4. Урок 4. 00:00:53
    Join the Slack Channel
  5. Урок 5. 00:02:03
    Course Project on GitHub
  6. Урок 6. 00:04:51
    Download the Starter Project & pubspec.yaml overview
  7. Урок 7. 00:03:39
    eCommerce app overview
  8. Урок 8. 00:05:48
    Project structure & code walkthrough
  9. Урок 9. 00:03:39
    Exploring the codebase with the Widget Inspector (DevTools)
  10. Урок 10. 00:05:03
    UI Design Principles: Composition & Reusable Widget Classes
  11. Урок 11. 00:08:26
    Useful Widgets for Responsive Design
  12. Урок 12. 00:03:46
    App Localization
  13. Урок 13. 00:02:52
    Section Intro
  14. Урок 14. 00:06:55
    Limitations of Navigator 1.0
  15. Урок 15. 00:06:14
    GoRouter installation & initial setup with MaterialApp.router
  16. Урок 16. 00:07:44
    Routes, sub-routes and navigation
  17. Урок 17. 00:03:55
    GoRouterHelper Extension and pageBuilder
  18. Урок 18. 00:06:19
    Adding some additional routes
  19. Урок 19. 00:04:36
    Routing by path vs routing by name
  20. Урок 20. 00:06:23
    Routing with parameters
  21. Урок 21. 00:03:46
    GoRouter Error Handling
  22. Урок 22. 00:04:35
    Navigating with go vs push
  23. Урок 23. 00:06:13
    Adding the remaining routes
  24. Урок 24. 00:03:24
    How to pop a route with GoRouter
  25. Урок 25. 00:04:29
    Nested Navigation
  26. Урок 26. 00:02:24
    Wrap up + Exercise
  27. Урок 27. 00:01:57
    Section Intro
  28. Урок 28. 00:04:16
    Popular App Architectures: MVC, MVP, MVVM, Clean Architecture, Bloc
  29. Урок 29. 00:06:18
    Riverpod App Architecture with the Controller-Service-Repository Pattern
  30. Урок 30. 00:06:08
    Project Structure: Feature-first vs Layer-first
  31. Урок 31. 00:04:24
    The Repository Pattern and the Data Layer
  32. Урок 32. 00:05:35
    Implementing the "fake" products repository as a singleton
  33. Урок 33. 00:06:46
    Working with Future and Stream-based APIs
  34. Урок 34. 00:02:29
    Wrap Up
  35. Урок 35. 00:03:38
    Section Intro
  36. Урок 36. 00:04:51
    Introduction to Riverpod
  37. Урок 37. 00:03:53
    Riverpod installation and setup
  38. Урок 38. 00:04:26
    Creating our first provider
  39. Урок 39. 00:07:12
    Reading providers with ConsumerWidget and Consumer
  40. Урок 40. 00:06:35
    Working with FutureProvider, StreamProvider, and AsyncValue
  41. Урок 41. 00:03:25
    Testing AsyncValue by adding a delay
  42. Урок 42. 00:05:42
    The family modifier
  43. Урок 43. 00:09:34
    The autoDispose modifier + advanced data caching options with keepAlive() & Timer
  44. Урок 44. 00:08:18
    Creating a reusable AsyncValueWidget helper
  45. Урок 45. 00:02:45
    Wrap Up + Exercise
  46. Урок 46. 00:02:26
    Section intro
  47. Урок 47. 00:04:37
    Implementing a fake authentication repository
  48. Урок 48. 00:03:59
    Creating repositories using abstract classes (optional)
  49. Урок 49. 00:03:14
    Intro: a reactive in-memory store with RxDart
  50. Урок 50. 00:05:06
    Implementing the InMemoryStore with RxDart
  51. Урок 51. 00:04:54
    Using the InMemoryStore in the FakeAuthRepository
  52. Урок 52. 00:03:55
    Accessing the FakeAuthRepository with ref.read() in the AccountScreen
  53. Урок 53. 00:07:47
    Creating our first controller using StateNotifier
  54. Урок 54. 00:03:49
    Using the StateNotifier inside the AccountScreen widget
  55. Урок 55. 00:06:49
    Listening to provider state changes with ref.listen()
  56. Урок 56. 00:02:38
    Bug-fix for Navigator.pop
  57. Урок 57. 00:02:10
    The AsyncValue.guard method
  58. Урок 58. 00:03:29
    Adding an AsyncValue extension method
  59. Урок 59. 00:05:30
    Using the authStateChangesProvider in HomeAppBar
  60. Урок 60. 00:04:53
    Intro to the email & password sign-in screen
  61. Урок 61. 00:03:06
    How to generate immutable state classes in Dart (EmailPasswordSignInState)
  62. Урок 62. 00:02:21
    Using AsyncValue inside EmailPasswordSignInState
  63. Урок 63. 00:06:32
    Implementing the EmailPasswordSignInController
  64. Урок 64. 00:07:27
    Using the EmailPasswordSignInController in the widget class
  65. Урок 65. 00:05:49
    Bug fix + filtering state updates with select()
  66. Урок 66. 00:05:59
    GoRouter redirects
  67. Урок 67. 00:05:13
    GoRouter: the refreshListenable argument
  68. Урок 68. 00:05:54
    Fixing the checkout flows after changes to refreshListenable (advanced)
  69. Урок 69. 00:02:01
    Wrap Up + Exercise
  70. Урок 70. 00:02:00
    Section Intro
  71. Урок 71. 00:04:44
    Introduction to Automated Testing and the Testing Pyramid
  72. Урок 72. 00:02:52
    Getting started with automated testing
  73. Урок 73. 00:04:10
    Writing the first unit test + adding toString() and equality implementations
  74. Урок 74. 00:06:19
    Test matchers and working with methods that throw exceptions
  75. Урок 75. 00:03:40
    Fixing the getProduct() method and updating the unit tests
  76. Урок 76. 00:04:58
    Working with groups and testing Futures and Streams
  77. Урок 77. 00:04:15
    Adding an optional delay to the FakeProductsRepository
  78. Урок 78. 00:03:43
    How to generate a Flutter test coverage report in VSCode
  79. Урок 79. 00:06:27
    Testing the FakeAuthRepository (part 1)
  80. Урок 80. 00:07:02
    Testing the FakeAuthRepository (part 2) + advanced stream matchers
  81. Урок 81. 00:02:46
    Mocks vs Fakes + installing the mocktail package
  82. Урок 82. 00:04:42
    Testing the AccountScreenController (part 1) + AsyncValue subclasses
  83. Урок 83. 00:07:36
    Testing the AccountScreenController (part 2) + working with mocks
  84. Урок 84. 00:03:13
    Testing the AccountScreenController (part 3) + type matchers
  85. Урок 85. 00:05:59
    Testing with Stream Matchers and Predicates
  86. Урок 86. 00:04:49
    Testing lifecycle methods (setUp, tearDown, setUpAll, tearDownAll)
  87. Урок 87. 00:07:08
    Testing the EmailPasswordSignInController with Acceptance Criteria
  88. Урок 88. 00:06:24
    Testing the EmailPasswordSignInController (part 2)
  89. Урок 89. 00:02:09
    Tip: setting custom test timeouts per-file
  90. Урок 90. 00:03:27
    Adding a test workflow to automate testing with GitHub Actions
  91. Урок 91. 00:01:20
    Wrap up
  92. Урок 92. 00:02:43
    Section Intro
  93. Урок 93. 00:02:31
    Introduction to widget tests + starter project
  94. Урок 94. 00:04:10
    Writing our first widget test using pumpWidget()
  95. Урок 95. 00:04:39
    Working with WidgetTester and finder
  96. Урок 96. 00:04:55
    Robot testing
  97. Урок 97. 00:03:45
    How to find widgets by key
  98. Урок 98. 00:07:55
    Writing widget tests with mocks and provider overrides
  99. Урок 99. 00:04:52
    Writing widget tests with Future.delayed() and runAsync()
  100. Урок 100. 00:06:09
    Adding the email & password widget tests
  101. Урок 101. 00:04:56
    Adding the email & password widget tests (part 2)
  102. Урок 102. 00:07:04
    Test setup for the authentication flow + using pumpAndSettle()
  103. Урок 103. 00:02:11
    Fixing the RenderFlex overflow error
  104. Урок 104. 00:08:43
    Completing the authentication flow test
  105. Урок 105. 00:05:31
    Integration tests
  106. Урок 106. 00:07:15
    Golden image tests
  107. Урок 107. 00:05:44
    Running golden image tests with size variants
  108. Урок 108. 00:01:43
    How to deal with Golden Image tests failing on CI
  109. Урок 109. 00:02:50
    Wrap Up
  110. Урок 110. 00:02:30
    Section Intro
  111. Урок 111. 00:06:30
    Overview of the shopping cart feature + technical requirements
  112. Урок 112. 00:02:55
    App Architecture for the Shopping Cart Feature
  113. Урок 113. 00:08:39
    Starter project + Overview of the data and domain layers
  114. Урок 114. 00:07:16
    Local Data Persistence with Sembast: Initial Setup
  115. Урок 115. 00:05:01
    How to persist the shopping cart data with the SembastCartRepository
  116. Урок 116. 00:07:25
    Implementing the CartService class
  117. Урок 117. 00:03:33
    Updating the CartService class to read dependencies using Ref
  118. Урок 118. 00:04:32
    Writing unit tests using ProviderContainer
  119. Урок 119. 00:07:43
    Writing the unit tests the CartService class
  120. Урок 120. 00:09:08
    Implementing the AddToCartController
  121. Урок 121. 00:07:43
    Updating the AddToCartWidget
  122. Урок 122. 00:02:32
    Bug Fix: Adding autoDispose to the AddToCartController
  123. Урок 123. 00:06:00
    Showing the cart items in the ShoppingCartScreen + AutoDispose
  124. Урок 124. 00:05:19
    Implementing the ShoppingCartItemController
  125. Урок 125. 00:04:39
    Updating the EditOrRemoveItemWidget and ShoppingCartScreen widgets
  126. Урок 126. 00:04:07
    Calculating and showing the cart items count
  127. Урок 127. 00:05:19
    Calculating and showing the cart total price
  128. Урок 128. 00:06:16
    Limiting the available quantity when adding items to the shopping cart
  129. Урок 129. 00:05:37
    Implementing the CartSyncService with a listener
  130. Урок 130. 00:03:07
    Registering the CartSyncService with ProviderContainer when the app starts
  131. Урок 131. 00:04:36
    Implementing the logic inside the CartSyncService
  132. Урок 132. 00:05:23
    Implementing the logic inside the CartSyncService (part 2 - optional)
  133. Урок 133. 00:11:13
    Unit tests for the CartSyncService
  134. Урок 134. 00:04:05
    Unit-testing providers with dependencies using ProviderContainer
  135. Урок 135. 00:03:42
    Updated widget and integration tests
  136. Урок 136. 00:01:43
    Wrap up + exercise (implement a wish list feature)
  137. Урок 137. 00:02:05
    Section intro
  138. Урок 138. 00:03:08
    Starter project for the checkout flows
  139. Урок 139. 00:06:31
    Updating the CheckoutScreen with the PageController initialization logic
  140. Урок 140. 00:02:17
    Do we need a StateNotifier for the CheckoutScreen?
  141. Урок 141. 00:01:58
    Updating the PaymentPage
  142. Урок 142. 00:07:07
    Implementing the PaymentButtonController
  143. Урок 143. 00:01:12
    Wrap Up
  144. Урок 144. 00:03:14
    Section Intro
  145. Урок 145. 00:01:52
    Errors vs exceptions
  146. Урок 146. 00:06:48
    Starter project overview + defining custom exceptions with enums and subclasses
  147. Урок 147. 00:02:48
    Freezed Introduction and Installation
  148. Урок 148. 00:08:19
    Creating an AppException class with Freezed
  149. Урок 149. 00:03:58
    Updating the AsyncValueUI extension to handle AppException values
  150. Урок 150. 00:07:32
    Adding an AsyncErrorLogger using ProviderObserver
  151. Урок 151. 00:06:23
    Creating a reusable ErrorLogger to catch all exceptions
  152. Урок 152. 00:08:46
    Completing the error handling system
  153. Урок 153. 00:07:29
    Working with the Result type (Success and Error)
  154. Урок 154. 00:02:17
    Drawbacks of the Result type (and when not to use it)
  155. Урок 155. 00:01:22
    Wrap up
  156. Урок 156. 00:02:18
    Section Intro
  157. Урок 157. 00:07:12
    Starter project overview
  158. Урок 158. 00:03:02
    Overview of the LeaveReviewScreen
  159. Урок 159. 00:05:22
    Implemeting a LeaveReviewController and submitting form data
  160. Урок 160. 00:05:14
    Testing the LeaveReviewForm and preventing an AssertionError
  161. Урок 161. 00:03:07
    Dismissing the LeaveReviewScreen programmatically on success using a callback
  162. Урок 162. 00:06:18
    How to prefill a form with data from a repository/backend
  163. Урок 163. 00:03:09
    Optimization: only submit the form if the data has changed
  164. Урок 164. 00:04:39
    Showing existing reviews in the ProductReviewsList
  165. Урок 165. 00:05:18
    Updating the LeaveReviewAction by reading read data from the userPurchaseProvider
  166. Урок 166. 00:04:13
    Calculating the average product ratings
  167. Урок 167. 00:03:33
    Updated tests & wrap up
  168. Урок 168. 00:02:16
    Section Intro
  169. Урок 169. 00:02:24
    Client-side vs server-side search
  170. Урок 170. 00:03:09
    Adding a search method to the FakeProductsRepository
  171. Урок 171. 00:07:19
    Implementing client-side search with StateProvider and FutureProvider
  172. Урок 172. 00:04:20
    Riverpod caching with autoDispose and cacheTime
  173. Урок 173. 00:03:41
    Debouncing and cancelling network requests
  174. Урок 174. 00:02:12
    Introduction to Riverpod 2.x
  175. Урок 175. 00:02:12
    Starter project and updated code walkthrough
  176. Урок 176. 00:02:02
    Installing the Riverpod Generator package
  177. Урок 177. 00:05:10
    Generating providers with the @riverpod syntax
  178. Урок 178. 00:05:48
    Migrating some more providers to Riverpod Generator + the keepAlive syntax
  179. Урок 179. 00:07:54
    Migrating the AccountScreenController from StateNotifier to AsyncNotifier
  180. Урок 180. 00:04:18
    Converting the AccountScreenController to use Riverpod Generator
  181. Урок 181. 00:05:58
    How to check if an AsyncNotifier is mounted
  182. Урок 182. 00:06:36
    How to write unit tests for AsyncNotifier subclasses
  183. Урок 183. 00:01:06
    Wrap Up
  184. Урок 184. 00:01:28
    Conclusion & Next Steps