Build a Flutter Mobile App Using AWS Amplify - Part 1
Create a trip planner app for iOS and Android
Module 2: Add Amplify authentication
Overview
In this module, you will learn how to authenticate a user with the Amplify auth category by using Amazon Cognito, a managed user identity service.
You will also learn how to use the Amplify Authenticator library to quickly create an authentication flow for the app, allowing users to sign up, sign in, and reset their password with just a few lines of code.
What you will accomplish
- Add Amplify authentication category to the app
- Implement the authentication flow using Amplify Authenticator
Minimum time to complete
10 minutes
Implementation
Add Amplify authentication category to the app
Step 1: Navigate to the app's root folder and run the following command in your terminal.
amplify add auth
Step 2: Select the Default configuration option and then select Email as the sign-in method. Then select the No, I am done option.
Using service: Cognito, provided by: awscloudformation
The current configured provider is Amazon Cognito.
Do you want to use the default authentication and security configuration? Default configuration
Warning: you will not be able to edit these selections.
How do you want users to be able to sign in? Email
Do you want to configure advanced settings? No, I am done.
✅ Successfully added auth resource amplifytripsplanner035b18d6 locally
✅ Some next steps:
"amplify push" will build all your local backend resources and provision it in the cloud
"amplify publish" will build all your local backend and frontend resources (if you have hosting category added) and provision it in the cloud
Implement the app authentication flow using Amplify Authenticator
Step 2: Open the trips_list_page.dart file and update it with the following code. This will be the app’s homepage.
import 'package:flutter/material.dart';
import 'package:amplify_trips_planner/common/utils/colors.dart' as constants;
class TripsListPage extends StatelessWidget {
const TripsListPage({
super.key,
});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text(
'Amplify Trips Planner',
),
backgroundColor: const Color(constants.primaryColorDark),
),
floatingActionButton: FloatingActionButton(
onPressed: () {},
backgroundColor: const Color(constants.primaryColorDark),
child: const Icon(Icons.add),
),
body: const Center(
child: Text('Trips List'),
),
);
}
}
Step 4: Open the router.dart file and update it with the following code to create the routes for the app.
import 'package:amplify_trips_planner/common/navigation/router/routes.dart';
import 'package:amplify_trips_planner/features/trip/ui/trips_list/trips_list_page.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
final router = GoRouter(
routes: [
GoRoute(
path: '/',
name: AppRoute.home.name,
builder: (context, state) => const TripsListPage(),
),
],
errorBuilder: (context, state) => Scaffold(
body: Center(
child: Text(state.error.toString()),
),
),
);
Step 6: Open the trips_planner_app.dart file and update it with the following code to wrap the MaterialApp in an Amplify Authenticator widget.
import 'package:amplify_authenticator/amplify_authenticator.dart';
import 'package:amplify_trips_planner/common/navigation/router/router.dart';
import 'package:amplify_trips_planner/common/utils/colors.dart' as constants;
import 'package:flutter/material.dart';
class TripsPlannerApp extends StatelessWidget {
const TripsPlannerApp({
super.key,
});
@override
Widget build(BuildContext context) {
return Authenticator(
child: MaterialApp.router(
routerConfig: router,
builder: Authenticator.builder(),
theme: ThemeData(
colorScheme:
ColorScheme.fromSwatch(primarySwatch: constants.primaryColor)
.copyWith(
background: const Color(0xff82CFEA),
),
),
),
);
}
}
Step 7: Open the main.dart file and update it with the following code. This contains the logic of configuring Amplify for the Auth category.
import 'package:amplify_auth_cognito/amplify_auth_cognito.dart';
import 'package:amplify_flutter/amplify_flutter.dart';
import 'package:amplify_trips_planner/trips_planner_app.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'amplifyconfiguration.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
try {
await _configureAmplify();
} on AmplifyAlreadyConfiguredException {
debugPrint('Amplify configuration failed.');
}
runApp(
const ProviderScope(
child: TripsPlannerApp(),
),
);
}
Future<void> _configureAmplify() async {
await Amplify.addPlugins([
AmplifyAuthCognito(),
]);
await Amplify.configure(amplifyconfig);
}
Conclusion
In this module, you implemented a user authentication flow in your app with just a few lines of code. In the next module, we will add an API to your app.