import "package:flutter/material.dart";
import "package:flutter/scheduler.dart";
import "package:flutter/services.dart";
import "package:flutter/foundation.dart";
import "package:flutter_azure_tts/flutter_azure_tts.dart";
import "package:flutter_soloud/flutter_soloud.dart";
import "package:flutter_native_splash/flutter_native_splash.dart";
import "package:async_redux/async_redux.dart";
import "package:only_bible_app/app.dart";
import "package:only_bible_app/dialog.dart";
import "package:only_bible_app/env.dart";
import "package:only_bible_app/store/app_persistor.dart";
import "package:only_bible_app/store/app_state.dart";
import "package:only_bible_app/utils.dart";
final navigatorKey = GlobalKey<NavigatorState>();
void updateStatusBar(bool v) {
SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(
systemNavigationBarColor: Color(0xFF1F1F22),
statusBarColor: Color(0xFF1F1F22),
systemNavigationBarIconBrightness: Brightness.light,
statusBarIconBrightness: Brightness.light,
SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(
systemNavigationBarColor: Colors.white,
statusBarColor: Colors.white,
systemNavigationBarIconBrightness: Brightness.dark,
statusBarIconBrightness: Brightness.dark,
FlutterNativeSplash.preserve(
widgetsBinding: WidgetsFlutterBinding.ensureInitialized(),
FlutterError.onError = (errorDetails) {
FlutterError.presentError(errorDetails);
debugPrint("FlutterError: ${errorDetails.exception}");
debugPrint("${errorDetails.stack}");
SchedulerBinding.instance.addPostFrameCallback((d) {
final context = navigatorKey.currentContext;
if (context == null || !context.mounted) return;
errorDetails.exception.toString(),
PlatformDispatcher.instance.onError = (error, stack) {
debugPrint("PlatformError: $error");
final context = navigatorKey.currentContext;
if (context != null && context.mounted) {
await SoLoud.instance.init();
subscriptionKey: Env.ttsSubscriptionKey,
final persistor = AppPersistor();
final json = await persistor.readJson();
final bibleName = json?["bibleName"] as String? ?? "en_kjv";
final bible = await loadBible(bibleName);
final initialState = json != null ? AppState.fromJson(json, bible) : AppState(bible: bible);
final store = Store<AppState>(
initialState: initialState,
updateStatusBar(store.state.darkMode);
runApp(App(globalNavigatorKey: navigatorKey, store: store));
FlutterNativeSplash.remove();