Flutter 颤振放大验证检查用户是否登录?
我是新来的。我试图在Flutter中实现放大Auth。我已经编写了登录、注册、电子邮件确认和主页的代码。现在我想检查用户是否登录 下面是我的main.dart,当我将Future Builder与Amplify.Auth.getCurrentUser()一起使用时,它可以工作。但当我按signout时,它会卡住,然后我必须重新启动应用程序Flutter 颤振放大验证检查用户是否登录?,flutter,aws-amplify,Flutter,Aws Amplify,我是新来的。我试图在Flutter中实现放大Auth。我已经编写了登录、注册、电子邮件确认和主页的代码。现在我想检查用户是否登录 下面是我的main.dart,当我将Future Builder与Amplify.Auth.getCurrentUser()一起使用时,它可以工作。但当我按signout时,它会卡住,然后我必须重新启动应用程序 import 'package:amplify_api/amplify_api.dart'; import 'package:amplify_auth_cog
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:amplify_api/amplify_api.dart';
导入“package:amplify_auth_cognito/amplify_auth_cognito.dart”;
导入“package:amplify_datastore/amplify_datastore.dart”;
进口“包装:放大颤振/放大飞镖”;
导入“package:amplify_storage_s3/amplify_storage_s3.dart”;
进口“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
导入“./provider/AuthenticateProvider.dart”;
导入“/screens/StartPage.dart”;
导入“../screens/auth/LoginScreen.dart”;
导入'configuration.dart';
导入“models/ModelProvider.dart”;
Future main()异步{
WidgetsFlutterBinding.ensureInitialized();
等待配置放大();
runApp(多供应商)(
供应商:[
ChangeNotifierProvider(创建:(ctx)=>AuthenticateProvider())
],
child:beathevirus(),
));
}
未来配置放大()异步{
等待Amplify.addPlugins([
放大AuthCognito(),
数据存储(modelProvider:modelProvider.instance),
放大存储s3(),
API()
]);
试一试{
等待放大配置(放大配置);
}关于AmplifialReadyConfiguredException{
印刷品(
“试图重新配置Amplify;当你的应用程序在Android上重新启动时,可能会发生这种情况。”);
}
}
类BeatTheVirus扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
final auth=Provider.of(context).isSignedIn;
返回材料PP(
debugShowCheckedModeBanner:false,
主页:auth?StartPage():LoginScreen(),
//未来建设者(
//future:Amplify.Auth.getCurrentUser(),
//生成器:(BuildContext上下文,异步快照){
//if(snapshot!=null&&snapshot.hasData){
//返回起始页();
// }
//返回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:beat_the_virus/provider/AuthenticateProvider.dart';
导入“package:beat_the_virus/utility/Size_Config.dart”;
导入“包:email_validator/email_validator.dart”;
进口“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
导入“SignUpScreen.dart”;
类LoginScreen扩展StatefulWidget{
LoginScreen({Key}):超级(Key:Key);
@凌驾
_LoginsScreenState createState()=>\u LoginsScreenState();
}
类_LoginScreenState扩展状态{
final _formKey=GlobalKey();
TextEditingController emaileted=TextEditingController(),
passwordTED=TextEditingController();
void\u gotoSignUpScreen(构建上下文){
导航器(上下文)
.push(materialpage路线(生成器:()=>SignUpScreen());
}
void\u登录(BuildContext上下文)异步{
if(_formKey.currentState.validate()){
(上下文)的焦点范围。取消焦点();
wait Provider.of(上下文,侦听:false)
.sign(emailTED.text.trim(),passwordTED.text)
.then((值)=>ScaffoldMessenger.of(上下文).showSnackBar(
小吃条(
内容:Text('成功登录..!!'),
持续时间:持续时间(秒数:2)),
));
}
}
@凌驾
小部件构建(构建上下文){
SizeConfig().init(上下文);
返回脚手架(
背景颜色:颜色。蓝色[400],
正文:中(
子:ListView(
收缩膜:对,
填充:常量边集。对称(垂直:10.0,水平:20.0),
儿童:[
影像资产(
“assets/icons/btvlogolow.png”,
高度:SizeConfig.screenHeight*0.25,
),
填充物(
填充:常量边集。对称(垂直:8.0),
子项:文本('登录',
textAlign:textAlign.center,
样式:TextStyle(
颜色:颜色,白色,
fontFamily:“维瓦尔第”,
fontSize:SizeConfig.safeBlockHorizontal*15)),
),
容器(
宽度:SizeConfig.screenWidth*0.70,
高度:SizeConfig.screenHeight*0.30,
装饰:
盒子装饰(边框半径:边框半径。圆形(20.0)),
孩子:卡片(
标高:5.0,
形状:圆形矩形边框(
边界半径:边界半径。圆形(20.0)),
孩子:表格(
键:_formKey,
子:列(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
填充物(
填充:常量边集。对称(水平:8.0),
子项:TextFormField(
控制员:发电子邮件,
键盘类型:TextInputType.emailAddress,
装饰:输入装饰(
边框:大纲输入边框(
边界半径:边界半径。圆形(10.0)),
labelText:“输入电子邮件”,
),
验证人:(电子邮件){
如果(email.isEmpty)||
!EmailValidator.validate(电子邮件)){
返回“无效电子邮件”;
}
返回null;
},
),
),
填充物(
填充:常量边集。对称(水平:8.0),
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);
}
}
}