未处理的异常:无法捕获错误

时间:2021-03-05 13:13:56

标签: flutter dart firebase-authentication

我正在尝试将 Firebase 身份验证与 Flutter 结合使用。下面是我的代码。

login_screen.dart

RaisedButton(
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(5)),
                    color: blackShadeColor,
                    child: Text("Login",
                        style: GoogleFonts.poppins(
                            textStyle: TextStyle(
                                color: Colors.white,
                                fontWeight: FontWeight.w500,
                                fontSize: 16))),
                    onPressed: () {
                      _loginScreenController
                          .login(
                              context: context,
                              email: _emailController.text,
                              password: _passwordController.text)
                          .catchError((error) {
                        print(error);
                      });
                    },
                  ),

login_screen_controller.dart

class LoginScreenController {

  /**
   * Login Function
   */
  Future<void> login({BuildContext context, String email, String password}) async {
    
      FirebaseAuthService firebaseAuthService = FirebaseAuthService();
      firebaseAuthService.signInWithEmail(email, password).then(((value){})).catchError((onError){
        throw onError;
      });
    
  }
}

firebase_auth_service.dart

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';

class FirebaseAuthService with ChangeNotifier {
  //Sign in with username and password
  Future<void> signInWithEmail(String email, String password) async {
    FirebaseAuth auth = FirebaseAuth.instance;

    try {
      UserCredential userCredential = await auth.signInWithEmailAndPassword(
          email: email, password: password);
      User user = userCredential.user;

      if (user != null) {
        print("Sign in success: " + user.email);
      } else {
        print("sign in failed");
        throw Exception(
            "Sign in Failed. Please check your email and password again");
      }
    } catch (e) {
      print(e.toString());
      throw (e);
    } finally {
      //notifyListeners();
    }
  }
}

如果出现错误,例如错误的密码、错误的电子邮件或其他内容,Firebase 会抛出错误。问题是我试图捕捉该错误并没有按预期工作。相反,我最终得到了 Unhandled exception。这是我得到的错误。

I/flutter (18418): [firebase_auth/invalid-email] The email address is badly formatted.
E/flutter (18418): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: [firebase_auth/invalid-email] The email address is badly formatted.
[38;5;248mE/flutter (18418): #0      FirebaseAuthService.signInWithEmail[39;49m
 package:wnenterprises/services/firebase_auth_service.dart
E/flutter (18418): <asynchronous suspension>
[38;5;248mE/flutter (18418): #1      LoginScreenController.login[39;49m
 package:wnenterprises/controllers/login_screen_controller.dart
[38;5;248mE/flutter (18418): #2      _LoadingScreenState.build.<anonymous closure>[39;49m
 package:wnenterprises/screens/login_screen.dart
[38;5;244mE/flutter (18418): #3      _InkResponseState._handleTap[39;49m
 package:flutter/…/material/ink_well.dart
[38;5;244mE/flutter (18418): #4      _InkResponseState.build.<anonymous closure>[39;49m
 package:flutter/…/material/ink_well.dart
[38;5;244mE/flutter (18418): #5      GestureRecognizer.invokeCallback[39;49m
 package:flutter/…/gestures/recognizer.dart
[38;5;244mE/flutter (18418): #6      TapGestureRecognizer.handleTapUp[39;49m
 package:flutter/…/gestures/tap.dart
[38;5;244mE/flutter (18418): #7      BaseTapGestureRecognizer._checkUp[39;49m
 package:flutter/…/gestures/tap.dart
[38;5;244mE/flutter (18418): #8      BaseTapGestureRecognizer.acceptGesture[39;49m
 package:flutter/…/gestures/tap.dart
[38;5;244mE/flutter (18418): #9      GestureArenaManager.sweep[39;49m
 package:flutter/…/gestures/arena.dart
[38;5;244mE/flutter (18418): #10     GestureBinding.handleEvent[39;49m
 package:flutter/…/gestures/binding.dart
[38;5;244mE/flutter (18418): #11     GestureBinding.dispatchEvent[39;49m
 package:flutter/…/gestures/binding.dart
[38;5;244mE/flutter (18418): #12     RendererBinding.dispatchEvent[39;49m
 package:flutter/…/rendering/binding.dart
[38;5;244mE/flutter (18418): #13     GestureBinding._handlePointerEvent[39;49m
 package:flutter/…/gestures/binding.dart
[38;5;244mE/flutter (18418): #14     GestureBinding._flushPointerEventQueue[39;49m
 package:flutter/…/gestures/binding.dart
[38;5;244mE/flutter (18418): #15     GestureBinding._handlePointerDataPacket[39;49m
 package:flutter/…/gestures/binding.dart
[38;5;244mE/flutter (18418): #16     _rootRunUnary (dart:async/zone.dart:1206:13)[39;49m
[38;5;244mE/flutter (18418): #17     _CustomZone.runUnary (dart:async/zone.dart:1100:19)[39;49m
[38;5;244mE/flutter (18418): #18     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)[39;49m
[38;5;244mE/flutter (18418): #19     _invoke1 (dart:ui/hooks.dart:265:10)[39;49m
[38;5;244mE/flutter (18418): #20     _dispatchPointerDataPacket (dart:ui/hooks.dart:174:5)[39;49m
E/flutter (18418):

这里到底发生了什么?

1 个答案:

答案 0 :(得分:-1)

代替异步等待,您可以尝试常规的 .then() 方法并使用捕获错误功能。 :

auth.signInWithEmailAndPassword(email: email, password: password).then((val){print(val);}).catchError((e){print("Exception: " + e.toString())});