forked from gskinnerTeam/flutter-folio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.dart
102 lines (93 loc) · 4.09 KB
/
main.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_folio/_utils/logger.dart';
import 'package:flutter_folio/commands/app/bootstrap_command.dart';
import 'package:flutter_folio/models/app_model.dart';
import 'package:flutter_folio/models/books_model.dart';
import 'package:flutter_folio/routing/app_route_parser.dart';
import 'package:flutter_folio/routing/app_router.dart';
import 'package:flutter_folio/services/cloudinary/cloud_storage_service.dart';
import 'package:flutter_folio/services/firebase/firebase_service.dart';
import 'package:flutter_folio/themes.dart';
import 'package:provider/provider.dart';
void main() async {
// Call a method to setup a global error handler so we can log all errors, including ones from native extensions.
initLogger(() async {
// Status bar style on Android/iOS
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle());
if (kIsWeb) {
// Increase Skia cache size to support bigger images.
const int megabyte = 1000000;
SystemChannels.skia.invokeMethod('Skia.setResourceCacheMaxBytes', 512 * megabyte);
// TODO: cant' await on invokeMethod due to https://github.com/flutter/flutter/issues/77018 so awaiting on Future.delayed instead.
await Future<void>.delayed(Duration.zero);
}
/// Create core models & services
FirebaseService firebase = FirebaseFactory.create();
BooksModel booksModel = BooksModel();
AppModel appModel = AppModel(booksModel, firebase);
// /// Run
runApp(MultiProvider(
providers: [
// Firebase
Provider.value(value: firebase),
// Cloudinary
Provider(create: (_) => CloudStorageService()),
// App Model - Stores data related to global settings or app modes
ChangeNotifierProvider.value(value: appModel),
// BooksModel - Stores data about the content in the app
ChangeNotifierProvider.value(value: booksModel),
],
//child: BasicRouterSpike(),
child: _AppBootstrapper(),
));
});
}
// Bootstrap the app, initializing all Controllers and Services
class _AppBootstrapper extends StatefulWidget {
@override
_AppBootstrapperState createState() => _AppBootstrapperState();
}
class _AppBootstrapperState extends State<_AppBootstrapper> {
AppRouteParser routeParser = AppRouteParser();
late AppRouterDelegate router;
@override
void initState() {
// Create the appRouter, and inject it with the models/services it needs
router = AppRouterDelegate(
context.read<AppModel>(),
context.read<BooksModel>(),
context.read<FirebaseService>(),
);
// Run Bootstrap with scheduleMicrotask to avoid triggering any builds from init(), which would throw an error.
scheduleMicrotask(() {
// Bootstrap. This will initialize services, load saved data, determine initial navigation state and anything else that needs to get done at startup
BootstrapCommand().run(context);
});
super.initState();
}
@override
Widget build(BuildContext context) {
// Get the current AppTheme so we can generate a ThemeData for the MaterialApp
AppTheme theme = context.select((AppModel m) => m.theme);
// TODO-SNIPPET: Using visual density
// Generate ThemeData from our own custom AppTheme object
ThemeData materialTheme = theme.toThemeData();
// Determine the density we want, based on AppModel.enableTouchMode
bool enableTouchMode = context.select((AppModel m) => m.enableTouchMode);
double density = enableTouchMode ? 0 : -1;
print("enableTouchMode: $enableTouchMode");
// Inject desired density into MaterialTheme for free animation when values change
materialTheme = ThemeData(visualDensity: VisualDensity(horizontal: density, vertical: density));
return MaterialApp.router(
title: "Flutter Folio",
debugShowCheckedModeBanner: false,
theme: materialTheme,
// Use a custom route/delegate to change navigation // TODO: Replace with VRouter/NavStack
routeInformationParser: routeParser,
routerDelegate: router,
);
}
}