Browse Source

Add main layout and ui

Sasan Salamzadeh 1 year ago
parent
commit
a3ee9e71cf
5 changed files with 198 additions and 0 deletions
  1. 63 0
      lib/main.dart
  2. 16 0
      lib/ui/adaptive.dart
  3. 26 0
      lib/ui/adaptive_base.dart
  4. 62 0
      lib/ui/adaptive_dialog.dart
  5. 31 0
      lib/ui/app_scaffold.dart

+ 63 - 0
lib/main.dart

@@ -0,0 +1,63 @@
+import 'package:pb_authenticator/pages/how_it_works.dart';
+import 'package:pb_authenticator/pages/transfer_codes.dart';
+
+import 'state/app_state.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_localizations/flutter_localizations.dart'
+    show GlobalMaterialLocalizations, GlobalWidgetsLocalizations;
+import 'l10n/app_localizations.dart';
+import 'state/file_storage.dart';
+import 'package:pb_authenticator_state/state.dart' show Repository;
+import 'pages/pages.dart';
+import 'package:provider/provider.dart';
+
+import 'config/routes.dart';
+
+void main() {
+  var repository = Repository(FileStorage());
+  runApp(MultiProvider(
+    providers: [ChangeNotifierProvider(create: (_) => AppState(repository))],
+    child: MainApp(),
+  ));
+}
+
+class MainApp extends StatelessWidget {
+  // Locale information
+  final Iterable<Locale> supportedLocales = [const Locale('en')];
+  final Iterable<LocalizationsDelegate> localizationsDelegates = [
+    AppLocalizations.delegate,
+    GlobalMaterialLocalizations.delegate,
+    GlobalWidgetsLocalizations.delegate,
+  ];
+
+  MainApp({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
+        overlays: [SystemUiOverlay.top]);
+
+    // Material/Cupertino app depending on platform
+    return MaterialApp(
+      onGenerateTitle: (context) => AppLocalizations.of(context)!.appName,
+      theme: ThemeData.light(),
+      darkTheme: ThemeData.dark(),
+      themeMode: ThemeMode.system,
+      initialRoute: AppRoutes.home,
+      routes: {
+        AppRoutes.home: (context) => const AndroidHomePage(),
+        AppRoutes.edit: (context) => const AndroidEditPage(),
+        AppRoutes.add: (context) => const AddPage(),
+        AppRoutes.addScan: (context) => const ScanQRPage(),
+        AppRoutes.settings: (context) => const SettingsPage(),
+        AppRoutes.settingAcknowledgements: (context) =>
+            const AcknowledgementsPage(),
+        AppRoutes.howItWorks: (context) => const HowItWorksPage(),
+        AppRoutes.transferCodes: (context) => const TransferCodesPage(),
+      },
+      localizationsDelegates: localizationsDelegates,
+      supportedLocales: supportedLocales,
+    );
+  }
+}

+ 16 - 0
lib/ui/adaptive.dart

@@ -0,0 +1,16 @@
+import 'package:flutter/foundation.dart'
+    show TargetPlatform, defaultTargetPlatform;
+export './adaptive_dialog.dart';
+export './app_scaffold.dart';
+
+/// Gets platform.
+TargetPlatform getPlatform() {
+  TargetPlatform result = defaultTargetPlatform;
+  // result = TargetPlatform.iOS;
+  return result;
+}
+
+/// Whether the current platform is Android.
+bool isPlatformAndroid() {
+  return getPlatform() == TargetPlatform.android;
+}

+ 26 - 0
lib/ui/adaptive_base.dart

@@ -0,0 +1,26 @@
+// Adaptive Widget Base
+// Adapted from: https://github.com/aqwert/flutter_platform_widgets
+
+import 'package:flutter/widgets.dart';
+import './adaptive.dart' show getPlatform;
+
+/// Abstract class for adaptive widgets.
+///
+/// Internally, the class splits build into createAndroidWidget and
+/// createCupertinoWidget and call the relevant method.
+abstract class AdaptiveBase<AWidget extends Widget, CWidget extends Widget>
+    extends StatelessWidget {
+  const AdaptiveBase(Key? key) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    if (getPlatform() == TargetPlatform.android) {
+      return createAndroidWidget(context);
+    } else {
+      return createCupertinoWidget(context);
+    }
+  }
+
+  AWidget createAndroidWidget(BuildContext context);
+  CWidget createCupertinoWidget(BuildContext context);
+}

+ 62 - 0
lib/ui/adaptive_dialog.dart

@@ -0,0 +1,62 @@
+// Adaptive Dialog
+// Adapted from flutter/flutter, using FlatButton, CupertinoDialogAction
+// showDialog, showCupertinoDialog
+//
+// Licensed under:
+// https://raw.githubusercontent.com/flutter/flutter/master/LICENSE
+
+import 'package:flutter/material.dart';
+import 'package:flutter/cupertino.dart';
+import './adaptive_base.dart' show AdaptiveBase;
+
+class AdaptiveAndroidDialogActionData {
+  final Key? key;
+  final VoidCallback? onPressed;
+  final Widget? child;
+
+  AdaptiveAndroidDialogActionData(
+      {this.key, @required this.onPressed, @required this.child});
+}
+
+class AdaptiveCupertinoDialogActionData {
+  final Key? key;
+  final VoidCallback? onPressed;
+  final Widget? child;
+
+  AdaptiveCupertinoDialogActionData(
+      {this.key, this.onPressed, @required this.child});
+}
+
+class AdaptiveDialogAction
+    extends AdaptiveBase<TextButton, CupertinoDialogAction> {
+  final AdaptiveAndroidDialogActionData? androidData;
+  final AdaptiveCupertinoDialogActionData? cupertinoData;
+  final VoidCallback onPressed;
+  final Widget child;
+
+  const AdaptiveDialogAction(
+      {this.androidData,
+      this.cupertinoData,
+      required this.onPressed,
+      required this.child,
+      Key? key})
+      : super(key);
+
+  @override
+  TextButton createAndroidWidget(BuildContext context) {
+    return TextButton(
+      key: androidData?.key,
+      onPressed: androidData?.onPressed ?? onPressed,
+      child: androidData?.child ?? child,
+    );
+  }
+
+  @override
+  CupertinoDialogAction createCupertinoWidget(BuildContext context) {
+    return CupertinoDialogAction(
+      key: androidData?.key,
+      onPressed: cupertinoData?.onPressed ?? onPressed,
+      child: cupertinoData?.child ?? child,
+    );
+  }
+}

+ 31 - 0
lib/ui/app_scaffold.dart

@@ -0,0 +1,31 @@
+import '../ui/adaptive_base.dart';
+import 'package:flutter/widgets.dart';
+import 'package:flutter/material.dart' show AppBar, Scaffold;
+import 'package:flutter/cupertino.dart'
+    show CupertinoNavigationBar, CupertinoPageScaffold;
+
+/// Basic scaffold for app.
+class AppScaffold extends AdaptiveBase<Scaffold, CupertinoPageScaffold> {
+  final Widget? title;
+  final Widget body;
+  final CupertinoNavigationBar? cupertinoNavigationBar;
+
+  /// Creates an adaptive scaffold with given attributes.
+  const AppScaffold(
+      {this.title, required this.body, this.cupertinoNavigationBar, Key? key})
+      : super(key);
+
+  @override
+  Scaffold createAndroidWidget(BuildContext context) {
+    return Scaffold(appBar: AppBar(title: title), body: body);
+  }
+
+  @override
+  CupertinoPageScaffold createCupertinoWidget(BuildContext context) {
+    return CupertinoPageScaffold(
+      navigationBar:
+          cupertinoNavigationBar ?? CupertinoNavigationBar(middle: title),
+      child: SafeArea(child: body),
+    );
+  }
+}