From 6b6614f482f4cf3df4e04b8efc8d38ec10c6795c Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Mon, 5 Jan 2026 09:50:48 +0100 Subject: [PATCH] fix(auth): prevent AuthNotifier auto-dispose causing theme toggle logout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Applied @persistentRiverpod annotation to AuthNotifier so it persists for app lifetime. Previously, theme changes could trigger AuthProvider rebuild via auto-dispose, causing AsyncLoading state and auth issues. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- CHANGELOG.md | 7 +++++++ docs/ARCHITECTURE.md | 14 +++++++------- lib/core/auth/auth_provider.dart | 3 ++- pubspec.yaml | 2 +- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 334452a..a167666 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.1.15] - 2026-01-05 + +### Fixed +- Theme toggle causing auth issues due to AuthNotifier auto-dispose + - Applied `@persistentRiverpod` annotation to AuthNotifier + - AuthProvider now persists for app lifetime, preventing rebuild on theme change + ## [1.1.14] - 2026-01-04 ### Fixed diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 58bae8a..d9b6621 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -447,13 +447,13 @@ Dio coreApiClient(Ref ref) { ... } **When to use `@persistentRiverpod`:** -| Use Case | Annotation | -|----------|------------| -| API clients with interceptors | `@persistentRiverpod` | -| Theme/config providers | `@persistentRiverpod` | -| Auth state provider | `@persistentRiverpod` | -| Feature data providers | `@riverpod` (default) | -| UI state providers | `@riverpod` (default) | +| Use Case | Annotation | Example | +|----------|------------|---------| +| API clients with interceptors | `@persistentRiverpod` | `coreApiClient`, `tatlockApiClient` | +| Auth state provider | `@persistentRiverpod` | `AuthNotifier` | +| Theme/config providers | `@persistentRiverpod` | `ThemeNotifier` | +| Feature data providers | `@riverpod` (default) | `ContainersNotifier` | +| UI state providers | `@riverpod` (default) | `SearchFilterNotifier` | ## File Naming Conventions diff --git a/lib/core/auth/auth_provider.dart b/lib/core/auth/auth_provider.dart index 0545db2..96c02ea 100644 --- a/lib/core/auth/auth_provider.dart +++ b/lib/core/auth/auth_provider.dart @@ -6,6 +6,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../config/app_config.dart'; +import '../providers/annotations.dart'; import 'auth_datasource.dart'; import 'auth_state.dart'; import 'oidc_service.dart'; @@ -24,7 +25,7 @@ part 'auth_provider.g.dart'; /// /// After OIDC authentication, syncs with core-api via POST /auth/sync /// to get user profile, roles, and preferences. -@riverpod +@persistentRiverpod class AuthNotifier extends _$AuthNotifier { // Storage keys static const _accessTokenKey = 'auth_access_token'; diff --git a/pubspec.yaml b/pubspec.yaml index f815b08..4cba042 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.1.14+1 +version: 1.1.15+1 environment: sdk: ^3.10.4