Rain/lib/main.dart

114 lines
3.8 KiB
Dart

import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:dynamic_color/dynamic_color.dart';
import 'package:flutter/material.dart';
import 'package:flutter_displaymode/flutter_displaymode.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:get/get.dart';
import 'package:internet_connection_checker/internet_connection_checker.dart';
import 'package:isar/isar.dart';
import 'package:path_provider/path_provider.dart';
import 'package:rain/app/modules/home.dart';
import 'package:rain/app/modules/onboarding.dart';
import 'package:rain/theme/theme.dart';
import 'app/data/weather.dart';
import 'translation/translation.dart';
import 'theme/theme_controller.dart';
import 'package:timezone/data/latest_all.dart' as tz;
late Isar isar;
late Settings settings;
final ValueNotifier<Future<bool>> isDeviceConnectedNotifier =
ValueNotifier(InternetConnectionChecker().hasConnection);
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await isarInit();
await setOptimalDisplayMode();
Connectivity()
.onConnectivityChanged
.listen((ConnectivityResult result) async {
if (result != ConnectivityResult.none) {
isDeviceConnectedNotifier.value =
InternetConnectionChecker().hasConnection;
} else {
isDeviceConnectedNotifier.value = Future(() => false);
}
});
tz.initializeTimeZones();
runApp(MyApp());
}
Future<void> setOptimalDisplayMode() async {
final List<DisplayMode> supported = await FlutterDisplayMode.supported;
final DisplayMode active = await FlutterDisplayMode.active;
final List<DisplayMode> sameResolution = supported
.where((DisplayMode m) =>
m.width == active.width && m.height == active.height)
.toList()
..sort((DisplayMode a, DisplayMode b) =>
b.refreshRate.compareTo(a.refreshRate));
final DisplayMode mostOptimalMode =
sameResolution.isNotEmpty ? sameResolution.first : active;
await FlutterDisplayMode.setPreferredMode(mostOptimalMode);
}
Future<void> isarInit() async {
isar = await Isar.open([
SettingsSchema,
MainWeatherCacheSchema,
LocationCacheSchema,
WeatherCardSchema,
], directory: (await getApplicationSupportDirectory()).path);
settings = await isar.settings.where().findFirst() ?? Settings();
}
class MyApp extends StatelessWidget {
MyApp({Key? key}) : super(key: key);
final themeController = Get.put(ThemeController());
@override
Widget build(BuildContext context) {
return DynamicColorBuilder(
builder: (lightColorScheme, darkColorScheme) {
return GetMaterialApp(
themeMode: themeController.theme,
theme: RainTheme.lightTheme,
darkTheme: RainTheme.darkTheme,
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
translations: Translation(),
locale: Get.deviceLocale,
fallbackLocale: const Locale('en', 'US'),
supportedLocales: const [
Locale('en', 'US'),
Locale('ru', 'RU'),
Locale('it', 'IT'),
Locale('de', 'DE'),
Locale('fr', 'FR'),
Locale('tr', 'TR'),
Locale('pt', 'BR'),
Locale('es', 'ES'),
],
localeResolutionCallback: (locale, supportedLocales) {
for (var supportedLocale in supportedLocales) {
if (supportedLocale.languageCode == locale?.languageCode) {
return supportedLocale;
}
}
return supportedLocales.first;
},
debugShowCheckedModeBanner: false,
home: settings.onboard == false
? const OnboardingPage()
: const HomePage(),
);
},
);
}
}