Flutter Amplify Auth 检查用户是否登录?

时间:2021-05-24 14:35:30

标签: flutter aws-amplify

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

请帮帮我,我没有找到任何关于用户登录检查的文档或教程。

0 个答案:

没有答案