import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'main.g.dart'; void main() { runApp(ProviderScope(child: const MainApp())); } class MainApp extends StatelessWidget { const MainApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: HomeScreen(), builder: (context, child) { return AppStartupWidget(onLoaded: (context) => child!); }, ); } } @riverpod class AppStartupNotifier extends _$AppStartupNotifier { @override Future build() async { await Future.delayed(Duration(seconds: 2)); await ref.watch(packageInfoProvider.future); } } class AppStartupWidget extends ConsumerWidget { const AppStartupWidget({super.key, required this.onLoaded}); final WidgetBuilder onLoaded; @override Widget build(BuildContext context, WidgetRef ref) { // 1. eagerly initialize appStartupProvider (and all the providers it depends on) final appStartupState = ref.watch(appStartupProvider); return appStartupState.when( // 2. loading state loading: () { return Scaffold( appBar: AppBar(), body: Center(child: CircularProgressIndicator()), ); }, // 3. error state error: (e, st) { return Scaffold( appBar: AppBar(), body: Center(child: Text('Loading Error: $e')), ); }, // 5. success - now load the main app data: (success) { return onLoaded(context); }, ); } } @Riverpod(keepAlive: true) Future packageInfo(Ref ref) { return PackageInfo.fromPlatform(); } class HomeScreen extends ConsumerWidget { const HomeScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final packageInfo = ref.watch(packageInfoProvider).requireValue; return Scaffold( appBar: AppBar(title: Text(packageInfo.appName)), body: Center( child: Text('${packageInfo.appName} ${packageInfo.version}'), ), ); } }