user_identity_feature 0.0.1 copy "user_identity_feature: ^0.0.1" to clipboard
user_identity_feature: ^0.0.1 copied to clipboard

MyCS user authentication, registration and profile management feature module

example/lib/main.dart

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:window_manager/window_manager.dart';
import 'package:logging/logging.dart';
import 'package:get_it/get_it.dart';
import 'package:amplify_flutter/amplify_flutter.dart';
import 'package:amplify_auth_cognito/amplify_auth_cognito.dart';

import 'package:utilities_ab/logging/init_logging.dart';
import 'package:platform_utilities_component/platform_utilities.dart';
import 'package:nav_layouts_component/nav_layouts.dart';

import 'package:identity_service/identity_service.dart' as identity;

import 'aws_amplify_config.dart';

import 'config/app_config.dart';
import 'screens/home_page.dart';
import 'screens/login_view_flow.dart';

import 'package:user_identity_feature/user_auth_feature.dart';

void main() async {
  initLogging(
    Level.ALL,
    logToConsole: true,
  );

  // On Desktop platforms the minimum size
  // of the window is fixed at 240x400
  if (!AppPlatform.isWeb && !AppPlatform.isMobile) {
    WidgetsFlutterBinding.ensureInitialized();
    await windowManager.ensureInitialized();

    WindowManager.instance.setMinimumSize(AppConfig.minWindowSize);
    WindowManager.instance.setTitle(AppConfig.title);
  }

  // Initialize Amplify
  await _configureAmplify();

  AppPlatform.init().then(
    (_) => runApp(
      StatefulWrapper(
        onInit: () {
          GetIt.instance.registerLazySingleton<identity.Provider>(
            () {
              return identity.AWSProvider();
            },
          );
        },
        onDespose: () {
          GetIt.instance.unregister<identity.Provider>(
            disposingFunction: (service) async => await service.dispose(),
          );
        },
        child: MainApp(),
      ),
    ),
  );
}

class MainApp extends StatelessWidget {
  late final AuthRouter _authRouter;

  MainApp({super.key}) {
    _authRouter = AuthRouter(
      navigatorKey: GlobalNavigator.key,
      initialLocation: '/',
      authRoute: LoginViewFlow(),
      publicRoutes: [
        const HomePage().route(),
      ],
      privateRoutes: [],
    );
  }

  @override
  Widget build(BuildContext context) {
    AppPlatform.initOnBuild(context);

    if (AppPlatform.isDesktop && Platform.isMacOS) {
      // On macOS a system menu is a required part of every application
      final List<PlatformMenuItem> menus = <PlatformMenuItem>[
        PlatformMenu(
          label: '', // In macOS the application name is shown in the menu bar
          menus: <PlatformMenuItem>[
            PlatformMenuItemGroup(
              members: <PlatformMenuItem>[
                PlatformMenuItem(
                  label: 'About',
                  onSelected: () {
                    showAboutDialog(
                      context: context,
                      applicationName: AppConfig.title,
                      applicationVersion: AppConfig.version,
                    );
                  },
                ),
              ],
            ),
            if (PlatformProvidedMenuItem.hasMenu(
                PlatformProvidedMenuItemType.quit))
              const PlatformProvidedMenuItem(
                  type: PlatformProvidedMenuItemType.quit),
          ],
        ),
      ];
      WidgetsBinding.instance.platformMenuDelegate.setMenus(menus);
    }

    return AuthScope(
      auth: GetIt.instance.get<identity.Provider>(),
      app: MaterialApp.router(
        debugShowCheckedModeBanner: false,
        title: AppConfig.title,
        localizationsDelegates: const [
          UserIdentityLocalizations.delegate,
          GlobalMaterialLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate,
          GlobalCupertinoLocalizations.delegate,
        ],
        supportedLocales: const [
          Locale('en'), // English
        ],
        theme: ThemeData(
          colorScheme: ColorScheme.fromSeed(
            seedColor: Colors.indigo,
          ),
          useMaterial3: false,
        ),
        darkTheme: ThemeData(
          colorScheme: ColorScheme.fromSeed(
            brightness: Brightness.dark,
            seedColor: Colors.indigo,
          ),
          useMaterial3: false,
        ),
        routerConfig: _authRouter.config,
      ),
    );
  }
}

Future<void> _configureAmplify() async {
  // Add any Amplify plugins you want to use
  final authPlugin = AmplifyAuthCognito();
  await Amplify.addPlugin(authPlugin);

  // You can use addPlugins if you are going to be adding multiple plugins
  // await Amplify.addPlugins([authPlugin, analyticsPlugin]);

  // Once Plugins are added, configure Amplify
  // Note: Amplify can only be configured once.
  try {
    await Amplify.configure(amplifyconfig);
  } on AmplifyAlreadyConfiguredException {
    safePrint(
        "Tried to reconfigure Amplify; this can occur when your app restarts on Android.");
  }
}