State Management
Flutter Server Box uses Riverpod with code generation for state management.
Provider Types
Section titled “Provider Types”StateProvider
Section titled “StateProvider”Simple state that can be read and written:
@riverpodclass Settings extends _$Settings { @override SettingsModel build() { return SettingsModel.defaults(); }
void update(SettingsModel newSettings) { state = newSettings; }}AsyncNotifierProvider
Section titled “AsyncNotifierProvider”State that loads asynchronously with loading/error states:
@riverpodclass ServerStatus extends _$ServerStatus { @override Future<StatusModel> build(Server server) async { return fetchStatus(server); }
Future<void> refresh() async { state = const AsyncValue.loading(); state = await AsyncValue.guard(() => fetchStatus(server)); }}StreamProvider
Section titled “StreamProvider”Real-time data from streams:
@riverpodStream<CpuUsage> cpuUsage(CpuUsageRef ref, Server server) { return cpuService.monitor(server);}State Patterns
Section titled “State Patterns”Loading States
Section titled “Loading States”state.when( data: (data) => DataWidget(data), loading: () => LoadingWidget(), error: (error, stack) => ErrorWidget(error),)Family Providers
Section titled “Family Providers”Parameterized providers:
@riverpodList<Container> containers(ContainersRef ref, Server server) { return containerService.list(server);}Auto-Dispose
Section titled “Auto-Dispose”Providers that dispose when no longer referenced:
@Riverpod(keepAlive: false)class TempState extends _$TempState { // ...}Best Practices
Section titled “Best Practices”- Use code generation: Always use
@riverpodannotation - Co-locate providers: Place near consuming widgets
- Avoid singletons: Use providers instead
- Layer correctly: Keep UI logic separate from business logic
Reading State in Widgets
Section titled “Reading State in Widgets”class ServerWidget extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final status = ref.watch(serverStatusProvider(server)); return status.when(...); }}Modifying State
Section titled “Modifying State”ref.read(settingsProvider.notifier).update(newSettings);