Riverpod 3.x migration: bumps flutter_riverpod to ^3.0.0 (resolves to 3.3.1 / riverpod 3.2.1)
StateNotifier → Notifier: UndoService rewritten; ref is now built-in, build() returns initial state, no constructor Ref parameter
AutoDisposeFamilyAsyncNotifier removed: EmailDetailNotifier converted to AsyncNotifier with the email ID passed via constructor so the existing family declaration continues to work
AsyncValue.valueOrNull removed: replaced with .value in email_list_screen and email_detail_screen (.value now returns null for errors in v3)
Override type: imported from flutter_riverpod/misc.dart in every file that uses it as a type annotation (no longer re-exported from the main barrel)
syncLogRepositoryProvider typed as Provider<SyncLogRepository>: makes the provider accept any SyncLogRepository implementation at the boundary
Widget-test pending-timer fix: buildApp() in test/widget/helpers.dart now adds default no-op overrides for syncHealthProvider and syncLogRepositoryProvider before test-specific overrides. This prevents Drift StreamQuery cache-debouncing timers from being pending at test teardown (all 444 unit + widget tests pass)
Test plan
flutter analyze — no issues
flutter test test/unit/ test/widget/ — 444 tests pass (327 unit, 117 widget)
## Summary
Closes #175.
- **Riverpod 3.x migration**: bumps `flutter_riverpod` to `^3.0.0` (resolves to 3.3.1 / riverpod 3.2.1)
- **`StateNotifier` → `Notifier`**: `UndoService` rewritten; `ref` is now built-in, `build()` returns initial state, no constructor `Ref` parameter
- **`AutoDisposeFamilyAsyncNotifier` removed**: `EmailDetailNotifier` converted to `AsyncNotifier` with the email ID passed via constructor so the existing `family` declaration continues to work
- **`AsyncValue.valueOrNull` removed**: replaced with `.value` in `email_list_screen` and `email_detail_screen` (`.value` now returns `null` for errors in v3)
- **`Override` type**: imported from `flutter_riverpod/misc.dart` in every file that uses it as a type annotation (no longer re-exported from the main barrel)
- **`syncLogRepositoryProvider` typed as `Provider<SyncLogRepository>`**: makes the provider accept any `SyncLogRepository` implementation at the boundary
- **Widget-test pending-timer fix**: `buildApp()` in `test/widget/helpers.dart` now adds default no-op overrides for `syncHealthProvider` and `syncLogRepositoryProvider` before test-specific overrides. This prevents Drift `StreamQuery` cache-debouncing timers from being pending at test teardown (all 444 unit + widget tests pass)
## Test plan
- [x] `flutter analyze` — no issues
- [x] `flutter test test/unit/ test/widget/` — 444 tests pass (327 unit, 117 widget)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Closes #175.
flutter_riverpodto^3.0.0(resolves to 3.3.1 / riverpod 3.2.1)StateNotifier→Notifier:UndoServicerewritten;refis now built-in,build()returns initial state, no constructorRefparameterAutoDisposeFamilyAsyncNotifierremoved:EmailDetailNotifierconverted toAsyncNotifierwith the email ID passed via constructor so the existingfamilydeclaration continues to workAsyncValue.valueOrNullremoved: replaced with.valueinemail_list_screenandemail_detail_screen(.valuenow returnsnullfor errors in v3)Overridetype: imported fromflutter_riverpod/misc.dartin every file that uses it as a type annotation (no longer re-exported from the main barrel)syncLogRepositoryProvidertyped asProvider<SyncLogRepository>: makes the provider accept anySyncLogRepositoryimplementation at the boundarybuildApp()intest/widget/helpers.dartnow adds default no-op overrides forsyncHealthProviderandsyncLogRepositoryProviderbefore test-specific overrides. This prevents DriftStreamQuerycache-debouncing timers from being pending at test teardown (all 444 unit + widget tests pass)Test plan
flutter analyze— no issuesflutter test test/unit/ test/widget/— 444 tests pass (327 unit, 117 widget)