Ponder

State Management

Riverpod state-management patterns, provider responsibilities, and local persistence.

Provider Pattern

Ponder uses Riverpod throughout the Flutter app. The project uses:

Core Providers

| Provider | Type | Responsibility | | — | — | — | | authProvider | StateNotifierProvider | Current Appwrite user, user tier, loading/error state, sign-in/sign-up/sign-out. | | currentUserProvider | Provider | Convenience projection of authProvider.currentUser. | | routerProvider | Provider<GoRouter> | Route graph and shell setup. | | themeModeProvider | StateNotifierProvider | Session-scoped ThemeMode. | | appwriteClientProvider and SDK providers | Provider | Shared Appwrite client, Account, Databases, Functions, Storage. | | tablesServiceProvider | Provider | TablesDB row operations. |

Feature Providers

| Feature | Main providers | | — | — | | Article | factChecksProvider, saveStateProvider | | Fact check | factCheckProvider, factCheckDraftClaimProvider, factCheckDraftSourceContentIdProvider, starterFactCheckClaimsProvider | | Feed | forYouProvider, forYouRefreshSignalProvider, localFeedPreferencesProvider, feedPersonalizationSnapshotProvider, feedPreferencesMigrationProvider, feedTuningProvider | | Friends | receivedSharesProvider, friendsListProvider, requestsProvider, friendThreadPreviewProvider, userSearchQueryProvider, userSearchResultsProvider, sharePreviewProvider | | Thread | threadMessagesPollingIntervalProvider, threadParticipantProvider, threadArticleProvider, threadMessagesProvider | | Profile | profileUserProvider, currentUserTierProvider, savedItemsProvider, savedItemIdsProvider, savedItemNoteProvider | | Search | searchQueryProvider, searchScopeProvider, recentSearchesProvider, searchResultsProvider | | Onboarding | onboardingProvider |

Local Persistence

shared_preferences is used for lightweight local state:

No other local storage mechanism is used in the current Flutter code.

Cache And Invalidation

Save mutations invalidate savedItemIdsProvider and savedItemsProvider. Profile edits invalidate profileUserProvider. Feed-tuning sync invalidates profile state after backend writes. Thread send invalidates the polling provider for that thread.

factChecksProvider and saveStateProvider use auto-dispose family providers with a two-minute keep-alive timer.

Chat Stream

threadMessagesProvider is a StreamProvider.autoDispose.family built on a polling loop. It immediately fetches thread messages, then repeats after the configured polling interval of two seconds. This is a deliberate implementation in the code; no Appwrite realtime provider is active.