flutter - Flutter Amplify Auth 检查用户是否登录?
问题描述
我是 AWS Amplify 的新手。我正在尝试在 Flutter 中实现 Amplify Auth。我已经编写了登录、注册、电子邮件确认和主页的代码。现在我想检查用户是否登录。
下面是我的 main.dart,当我将 Future Builder 与 Amplify.Auth.getCurrentUser() 一起使用时,它可以工作。但是当我按下退出时它卡住了,然后我必须重新启动应用程序。
import 'package:amplify_api/amplify_api.dart';
import 'package:amplify_auth_cognito/amplify_auth_cognito.dart';
import 'package:amplify_datastore/amplify_datastore.dart';
import 'package:amplify_flutter/amplify.dart';
import 'package:amplify_storage_s3/amplify_storage_s3.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import './provider/AuthenticateProvider.dart';
import './screens/StartPage.dart';
import '../screens/auth/LoginScreen.dart';
import 'amplifyconfiguration.dart';
import 'models/ModelProvider.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await configureAmplify();
runApp(MultiProvider(
providers: [
ChangeNotifierProvider(create: (ctx) => AuthenticateProvider())
],
child: BeatTheVirus(),
));
}
Future<void> configureAmplify() async {
await Amplify.addPlugins([
AmplifyAuthCognito(),
AmplifyDataStore(modelProvider: ModelProvider.instance),
AmplifyStorageS3(),
AmplifyAPI()
]);
try {
await Amplify.configure(amplifyconfig);
} on AmplifyAlreadyConfiguredException {
print(
"Tried to reconfigure Amplify; this can occur when your app restarts on Android.");
}
}
class BeatTheVirus extends StatelessWidget {
@override
Widget build(BuildContext context) {
final auth = Provider.of<AuthenticateProvider>(context).isSignedIn;
return MaterialApp(
debugShowCheckedModeBanner: false,
home: auth ? StartPage() : LoginScreen(),
// FutureBuilder(
// future: Amplify.Auth.getCurrentUser(),
// builder: (BuildContext context, AsyncSnapshot<AuthUser> snapshot) {
// if (snapshot != null && snapshot.hasData) {
// return StartPage();
// }
// return LoginScreen();
// }),
);
}
}
这是我的登录文件-:
import 'package:beat_the_virus/provider/AuthenticateProvider.dart';
import 'package:beat_the_virus/utility/Size_Config.dart';
import 'package:email_validator/email_validator.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'SignUpScreen.dart';
class LoginScreen extends StatefulWidget {
LoginScreen({Key key}) : super(key: key);
@override
_LoginScreenState createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final _formKey = GlobalKey<FormState>();
TextEditingController emailTED = TextEditingController(),
passwordTED = TextEditingController();
void _gotoSignUpScreen(BuildContext context) {
Navigator.of(context)
.push(MaterialPageRoute(builder: (_) => SignUpScreen()));
}
void _login(BuildContext context) async {
if (_formKey.currentState.validate()) {
FocusScope.of(context).unfocus();
await Provider.of<AuthenticateProvider>(context, listen: false)
.signIn(emailTED.text.trim(), passwordTED.text)
.then((value) => ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Successfully Logged In..!!'),
duration: Duration(seconds: 2)),
));
}
}
@override
Widget build(BuildContext context) {
SizeConfig().init(context);
return Scaffold(
backgroundColor: Colors.blue[400],
body: Center(
child: ListView(
shrinkWrap: true,
padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0),
children: [
Image.asset(
'assets/icons/btvlogolow.png',
height: SizeConfig.screenHeight * 0.25,
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: Text('Log In',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontFamily: 'Vivaldi',
fontSize: SizeConfig.safeBlockHorizontal * 15)),
),
Container(
width: SizeConfig.screenWidth * 0.70,
height: SizeConfig.screenHeight * 0.30,
decoration:
BoxDecoration(borderRadius: BorderRadius.circular(20.0)),
child: Card(
elevation: 5.0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20.0)),
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: TextFormField(
controller: emailTED,
keyboardType: TextInputType.emailAddress,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0)),
labelText: 'Enter Email',
),
validator: (email) {
if (email.isEmpty ||
!EmailValidator.validate(email)) {
return 'Invalid Email';
}
return null;
},
),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: TextFormField(
controller: passwordTED,
keyboardType: TextInputType.text,
obscureText: true,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0)),
labelText: 'Enter Password',
),
validator: (password) {
if (password.isEmpty) {
return 'Invalid Password';
}
return null;
},
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
ElevatedButton(
onPressed:
// () => _loginButtonOnPressed(context)
() => _login(context),
child: Text('Log in')),
OutlinedButton(
onPressed: () => _gotoSignUpScreen(context),
child: Text('Create my Account'))
],
)
],
),
),
),
)
],
),
),
);
}
}
这是我的注册文件-:
import 'package:amplify_auth_cognito/amplify_auth_cognito.dart';
import 'package:beat_the_virus/provider/AuthenticateProvider.dart';
import 'package:beat_the_virus/utility/Size_Config.dart';
import 'package:email_validator/email_validator.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'EmailVerifyScreen.dart';
import 'LoginScreen.dart';
class SignUpScreen extends StatefulWidget {
SignUpScreen({Key key}) : super(key: key);
@override
_SignUpScreenState createState() => _SignUpScreenState();
}
class _SignUpScreenState extends State<SignUpScreen> {
final _formKey = GlobalKey<FormState>();
TextEditingController emailTED = TextEditingController(),
passwordTED = TextEditingController();
bool validatePassword(String value) {
String pattern =
r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8}$';
RegExp regExp = new RegExp(pattern);
return regExp.hasMatch(value);
}
void createAccount(BuildContext context) async {
if (_formKey.currentState.validate()) {
FocusScope.of(context).unfocus();
await Provider.of<AuthenticateProvider>(context, listen: false)
.registerWithEmaillAndPassword(emailTED.text.trim(), passwordTED.text)
.then((SignUpResult result) {
if (result.isSignUpComplete)
Navigator.push(
context,
MaterialPageRoute(
builder: (_) =>
EmailConfirmationScreen(email: emailTED.text.trim())),
);
});
}
}
@override
Widget build(BuildContext context) {
SizeConfig().init(context);
return Scaffold(
backgroundColor: Colors.blue[400],
body: Center(
child: ListView(
padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0),
shrinkWrap: true,
children: [
Image.asset(
'assets/icons/btvlogolow.png',
height: SizeConfig.screenHeight * 0.25,
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: Text('Create Account',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontFamily: 'Vivaldi',
fontSize: SizeConfig.safeBlockHorizontal * 15)),
),
Container(
width: SizeConfig.screenWidth * 0.70,
height: SizeConfig.screenHeight * 0.30,
decoration:
BoxDecoration(borderRadius: BorderRadius.circular(20.0)),
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20.0)),
elevation: 5.0,
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: TextFormField(
controller: emailTED,
keyboardType: TextInputType.emailAddress,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0)),
labelText: 'Enter Email',
hintText: 'Enter new Email'),
validator: (email) {
if (email.isEmpty ||
!EmailValidator.validate(email)) {
return 'Invalid Email';
}
return null;
},
),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: TextFormField(
controller: passwordTED,
keyboardType: TextInputType.text,
obscureText: true,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0)),
labelText: 'Enter Password',
hintText: 'Enter new Password'),
validator: (password) {
if (password.isEmpty ||
!validatePassword(password)) {
return 'Invalid Password';
}
return null;
},
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
ElevatedButton(
onPressed: () => Navigator.of(context)
.pushReplacement(MaterialPageRoute(
builder: (ctx) => LoginScreen())),
child: Text('Go to Login')),
OutlinedButton(
// _createAccountOnPressed(context)
onPressed: () => createAccount(context),
child: Text('Create Account')),
],
)
],
)),
),
)
],
),
),
);
}
}
这是我的电子邮件验证页面-:
import 'package:amplify_auth_cognito/amplify_auth_cognito.dart';
import 'package:beat_the_virus/provider/AuthenticateProvider.dart';
import 'package:beat_the_virus/utility/Size_Config.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'LoginScreen.dart';
class EmailConfirmationScreen extends StatefulWidget {
final String email;
EmailConfirmationScreen({
Key key,
@required this.email,
}) : super(key: key);
@override
_EmailConfirmationScreenState createState() =>
_EmailConfirmationScreenState(email);
}
class _EmailConfirmationScreenState extends State<EmailConfirmationScreen> {
String email;
final TextEditingController _confirmationCodeController =
TextEditingController();
final _formKey = GlobalKey<FormState>();
_EmailConfirmationScreenState(this.email);
@override
Widget build(BuildContext context) {
SizeConfig().init(context);
return Scaffold(
backgroundColor: Colors.blue[400],
body: Center(
child: ListView(
shrinkWrap: true,
padding: const EdgeInsets.symmetric(
horizontal: 20.0, vertical: 10.0),
children: [
Image.asset(
'assets/icons/btvlogolow.png',
height: SizeConfig.screenHeight * 0.25,
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: Text('Email Confirmation',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontFamily: 'Vivaldi',
fontSize: SizeConfig.safeBlockHorizontal * 15)),
),
Container(
width: SizeConfig.screenWidth * 0.70,
height: SizeConfig.screenHeight * 0.30,
decoration:
BoxDecoration(borderRadius: BorderRadius.circular(20.0)),
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20.0)),
child: Form(
key: _formKey,
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 8.0, horizontal: 15.0),
child: Column(
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
children: [
RichText(
textAlign: TextAlign.center,
text: TextSpan(
text:
'An email confirmation code is sent to ',
style: TextStyle(
color: Colors.black,
fontSize: 16.0),
children: <TextSpan>[
TextSpan(
text: "'" +
widget.email +
"' .",
style: TextStyle(
color: Colors.black,
fontStyle:
FontStyle.italic,
fontWeight:
FontWeight.bold)),
TextSpan(
text:
'Please type the code to confirm your email.',
style: TextStyle(
color: Colors.black,
fontSize: 16.0))
])),
TextFormField(
keyboardType: TextInputType.number,
controller: _confirmationCodeController,
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: "Enter Confirmation Code"),
validator: (value) => value.length != 6
? "The confirmation code is invalid"
: null,
),
ElevatedButton(
onPressed: () => _submitCode(context),
child: Text("CONFIRM"),
)
])))))
])));
}
void _submitCode(BuildContext context) async {
if (_formKey.currentState.validate()) {
FocusScope.of(context).unfocus();
await Provider.of<AuthenticateProvider>(context, listen: false)
.confirmRegisterWithCode(email, _confirmationCodeController.text)
.then((SignUpResult result) {
if (result.isSignUpComplete)
Navigator.pushReplacement(
context, MaterialPageRoute(builder: (_) => LoginScreen()));
});
}
}
}
这是我的身份验证提供程序文件-:
import 'package:amplify_auth_cognito/amplify_auth_cognito.dart';
import 'package:amplify_flutter/amplify.dart';
import 'package:flutter/material.dart';
class AuthenticateProvider with ChangeNotifier {
bool isSignedIn = false;
Future<String> getCurrentUser() async {
try {
final awsUser = await Amplify.Auth.getCurrentUser();
return awsUser.userId;
} catch (e, s) {
print(e);
print(s);
}
}
Future<SignUpResult> registerWithEmaillAndPassword(
String email, String password) async {
try {
Map<String, String> userAttributes = {"email": email};
final result = await Amplify.Auth.signUp(
username: email,
password: password,
options: CognitoSignUpOptions(userAttributes: userAttributes));
notifyListeners();
return result;
} on AuthException catch (e, s) {
print(e);
print(s);
}
}
Future<SignUpResult> confirmRegisterWithCode(
String email, String code) async {
try {
final result = await Amplify.Auth.confirmSignUp(
username: email, confirmationCode: code);
notifyListeners();
return result;
} on AuthException catch (e, s) {
print(e);
print(s);
}
}
Future<void> signIn(String email, String password) async {
try {
await Amplify.Auth.signIn(username: email, password: password);
isSignedIn = true;
notifyListeners();
} on AuthException catch (e, s) {
print(e);
print(s);
}
}
Future<void> signOut() async {
try {
await Amplify.Auth.signOut();
isSignedIn = false;
notifyListeners();
} on AuthException catch (e, s) {
print(e);
print(s);
}
}
}
请帮助我,我没有找到任何用于用户登录检查的文档或教程。
解决方案
这就是你的做法
try {
final awsUser = await Amplify.Auth.getCurrentUser();
//send user to dashboard
} on AuthException catch (e) {
//send user to login
}
推荐阅读
- c# - 使用 Oryzer Studio (OSCOVA) 和 Xamarin Android 创建离线机器人
- linux - Kvm/ARM、linux:guest代码怎么打断?
- windows - Inno Setup IDE 窗口打不开
- sql - SQL 根据层次结构选择
- python-3.x - 我无法在 python 上运行 onclick 函数
- php - 是否可以在 PHP 中的函数内创建变量?
- postgresql - 从 for 循环 postgres 返回选择
- php - 作曲家需要差异
- webots - 如何在 webbots 的预定义机器人中添加笔节点
- laravel - 如何在 PhpStorm 中将类路径注释为类名?