Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振放大验证检查用户是否登录?_Flutter_Aws Amplify - Fatal编程技术网

Flutter 颤振放大验证检查用户是否登录?

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

我是新来的。我试图在Flutter中实现放大Auth。我已经编写了登录、注册、电子邮件确认和主页的代码。现在我想检查用户是否登录

下面是我的main.dart,当我将Future Builder与Amplify.Auth.getCurrentUser()一起使用时,它可以工作。但当我按signout时,它会卡住,然后我必须重新启动应用程序

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);
    }
  }
}