mirror of
https://github.com/DefinedNet/mobile_nebula.git
synced 2025-01-18 19:27:05 +00:00
64d45f66c7
This updates flutter to 3.24.1, the latest stable version, and also updates our flutter dependencies to latest. It targets the latest android sdk, 34, which is required if we want to publish a new version to the Google Play store. I also needed to make a few adjustments to handle deprecations. The biggest change is that I needed to wrap the main widget in MaterialApp to avoid problems with AdaptiveSwitch in iOS.
128 lines
4.1 KiB
Dart
128 lines
4.1 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:flutter/cupertino.dart' show CupertinoThemeData, DefaultCupertinoLocalizations;
|
|
import 'package:flutter/material.dart'
|
|
show BottomSheetThemeData, Colors, DefaultMaterialLocalizations, ThemeData, ThemeMode, MaterialApp, Scaffold;
|
|
import 'package:flutter/scheduler.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
|
|
import 'package:mobile_nebula/screens/MainScreen.dart';
|
|
import 'package:mobile_nebula/screens/EnrollmentScreen.dart';
|
|
import 'package:mobile_nebula/services/settings.dart';
|
|
import 'package:flutter_web_plugins/url_strategy.dart';
|
|
|
|
//TODO: EventChannel might be better than the stream controller we are using now
|
|
|
|
void main() {
|
|
usePathUrlStrategy();
|
|
runApp(Main());
|
|
}
|
|
|
|
class Main extends StatelessWidget {
|
|
// This widget is the root of your application.
|
|
@override
|
|
Widget build(BuildContext context) => App();
|
|
}
|
|
|
|
class App extends StatefulWidget {
|
|
@override
|
|
_AppState createState() => _AppState();
|
|
}
|
|
|
|
class _AppState extends State<App> {
|
|
final settings = Settings();
|
|
Brightness brightness = SchedulerBinding.instance.platformDispatcher.platformBrightness;
|
|
StreamController dnEnrolled = StreamController.broadcast();
|
|
|
|
@override
|
|
void initState() {
|
|
//TODO: wait until settings is ready?
|
|
settings.onChange().listen((_) {
|
|
setState(() {
|
|
if (!settings.useSystemColors) {
|
|
brightness = settings.darkMode ? Brightness.dark : Brightness.light;
|
|
}
|
|
});
|
|
});
|
|
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
dnEnrolled.close();
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final ThemeData lightTheme = ThemeData(
|
|
useMaterial3: false,
|
|
brightness: Brightness.light,
|
|
primarySwatch: Colors.blueGrey,
|
|
primaryColor: Colors.blueGrey[900],
|
|
fontFamily: 'PublicSans',
|
|
//scaffoldBackgroundColor: Colors.grey[100],
|
|
scaffoldBackgroundColor: Colors.white,
|
|
bottomSheetTheme: BottomSheetThemeData(
|
|
backgroundColor: Colors.blueGrey[50],
|
|
),
|
|
);
|
|
|
|
final ThemeData darkTheme = ThemeData(
|
|
useMaterial3: false,
|
|
brightness: Brightness.dark,
|
|
primarySwatch: Colors.grey,
|
|
primaryColor: Colors.grey[900],
|
|
fontFamily: 'PublicSans',
|
|
scaffoldBackgroundColor: Colors.grey[800],
|
|
bottomSheetTheme: BottomSheetThemeData(
|
|
backgroundColor: Colors.grey[850],
|
|
),
|
|
);
|
|
|
|
return MaterialApp(
|
|
theme: brightness == Brightness.light ? lightTheme : darkTheme,
|
|
home: Scaffold(
|
|
body: PlatformProvider(
|
|
//initialPlatform: initialPlatform,
|
|
builder: (context) => PlatformApp(
|
|
debugShowCheckedModeBanner: false,
|
|
localizationsDelegates: <LocalizationsDelegate<dynamic>>[
|
|
DefaultMaterialLocalizations.delegate,
|
|
DefaultWidgetsLocalizations.delegate,
|
|
DefaultCupertinoLocalizations.delegate,
|
|
],
|
|
title: 'Nebula',
|
|
material: (_, __) {
|
|
return new MaterialAppData(
|
|
themeMode: brightness == Brightness.light ? ThemeMode.light : ThemeMode.dark,
|
|
);
|
|
},
|
|
cupertino: (_, __) => CupertinoAppData(
|
|
theme: CupertinoThemeData(brightness: brightness),
|
|
),
|
|
onGenerateRoute: (settings) {
|
|
if (settings.name == '/') {
|
|
return platformPageRoute(context: context, builder: (context) => MainScreen(this.dnEnrolled));
|
|
}
|
|
|
|
final uri = Uri.parse(settings.name!);
|
|
if (uri.path == EnrollmentScreen.routeName) {
|
|
// TODO: maybe implement this as a dialog instead of a page, you can stack multiple enrollment screens which is annoying in dev
|
|
return platformPageRoute(
|
|
context: context,
|
|
builder: (context) =>
|
|
EnrollmentScreen(code: EnrollmentScreen.parseCode(settings.name!), stream: this.dnEnrolled),
|
|
);
|
|
}
|
|
|
|
return null;
|
|
},
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|