import 'package:flutter/material.dart'; import 'package:lightmeter/data/caffeine_service.dart'; import 'package:lightmeter/data/haptics_service.dart'; import 'package:lightmeter/data/light_sensor_service.dart'; import 'package:lightmeter/data/permissions_service.dart'; import 'package:lightmeter/data/shared_prefs_service.dart'; import 'package:lightmeter/data/volume_events_service.dart'; import 'package:lightmeter/environment.dart'; import 'package:lightmeter/providers/ev_source_type_provider.dart'; import 'package:lightmeter/providers/metering_screen_layout_provider.dart'; import 'package:lightmeter/providers/stop_type_provider.dart'; import 'package:lightmeter/providers/supported_locale_provider.dart'; import 'package:lightmeter/providers/theme_provider.dart'; import 'package:lightmeter/utils/inherited_generics.dart'; import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart'; import 'package:platform/platform.dart'; import 'package:shared_preferences/shared_preferences.dart'; class LightmeterProviders extends StatelessWidget { final Environment env; final Widget Function(BuildContext context, bool ready) builder; const LightmeterProviders({required this.env, required this.builder, super.key}); @override Widget build(BuildContext context) { return FutureBuilder( future: Future.wait([ SharedPreferences.getInstance(), const LightSensorService(LocalPlatform()).hasSensor(), ]), builder: (_, snapshot) { if (snapshot.data != null) { final sharedPrefs = snapshot.data![0] as SharedPreferences; return IAPProviders( sharedPreferences: sharedPrefs, child: InheritedWidgetBase( data: env.copyWith(hasLightSensor: snapshot.data![1] as bool), child: InheritedWidgetBase( data: UserPreferencesService(sharedPrefs), child: InheritedWidgetBase( data: const LightSensorService(LocalPlatform()), child: InheritedWidgetBase( data: const CaffeineService(), child: InheritedWidgetBase( data: const HapticsService(), child: InheritedWidgetBase( data: const VolumeEventsService(LocalPlatform()), child: InheritedWidgetBase( data: const PermissionsService(), child: MeteringScreenLayoutProvider( child: StopTypeProvider( child: EvSourceTypeProvider( child: SupportedLocaleProvider( child: ThemeProvider( child: Builder( builder: (context) => builder(context, true), ), ), ), ), ), ), ), ), ), ), ), ), ), ); } else if (snapshot.error != null) { return Center(child: Text(snapshot.error!.toString())); } return builder(context, false); }, ); } }