在身份验证类中设置状态?

时间:2021-02-24 17:15:57

标签: firebase flutter authentication firebase-authentication

我有以下问题。我希望消息是正确的异常类型。我只能在登录时使用 set state(因为我的 auth 类不是 statlesswidget)类并使用 set state() 传递消息,但所有错误都相同。我已经尝试了 9 个小时,但我无法弄清楚。请帮忙。所以我只想显示正确的异常。类似于“电子邮件地址格式错误”。问题是我不允许我将错误消息设置为真正的错误消息,我不知道如何修复它

  Widget _buildLoginBtn() {
    return Container(
      padding: EdgeInsets.symmetric(vertical: 25.0),
      width: double.infinity,
      child: RawMaterialButton(
          elevation: 5.0,
          padding: EdgeInsets.all(15.0),
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(30.0),
          ),
          fillColor: Colors.white,
          child: Text(
            'LOGIN',
            style: TextStyle(
              color: Color(0xFF527DAA),
              letterSpacing: 1.5,
              fontSize: 18.0,
              fontWeight: FontWeight.bold,
              fontFamily: 'OpenSans',
            ),
          ),
          onPressed: () async {
            
            if (_formKey.currentState.validate()) {
              print('valid');
              setState(() => loading = false);
              dynamic result =
                  await _auth.signIN(email, password);
                  if (result == null) {
                setState(() => error = 'Check your Input');
                loading= false;
              }
            }
          }),
    );
  }

 Future<String> signIN(String email, String password) async {
   try {
     FirebaseUser user = (await _auth.signInWithEmailAndPassword(
             email: email.trim(), password: password)).user;
   } catch (e) {
     return null;
   }
   if (user != null) {
     print(user);
   }
   return null;
 }

因此,在我遵循@ Gerpea 的建议之后,当我只是尝试在没有 FIREBASEAUTHERROR 语句的情况下捕获错误以及尝试使用该语句时,我收到以下错误。当我尝试更新我的身份验证、云和核心时,它给我带来了另一个错误。我真的可以说他是否忽略了 catch 块,因为它实际上并没有在我开始时开始我得到,就像我在控制台中的错误之前所说的那样使用:

cupertino_icons: ^1.0.2
 firebase_auth: ^0.14.0+5
 cloud_firestore: ^0.12.9+4
 firebase_core_web: ^0.2.1+3
 provider: ^4.3.3
 flutter_svg: ^0.19.2+1
 flutter_spinkit: "^4.1.2"
 auto_size_text: ^2.1.0
 firebase_core: ^0.4.0
 get_it: ^5.0.6

错误如下:

Invalid depfile: /Users/MYUSERNAME/Desktop/project neu2/flutter_application_2/.dart_tool/flutter_build/7e96e6ced6aa40f9bcd60c2328bbea3e/kernel_snapshot.d
^
../../../flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/js.dart:8:1: Error: Not found: 'dart:js'
export 'dart:js' show allowInterop, allowInteropCaptureThis;
^
../../../flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/js_util.dart:8:1: Error: Not found: 'dart:js_util'
export 'dart:js_util';

^
../../../flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-0.2.1+3/lib/src/interop/utils/js_interop.dart:24:7: Error: Method not found: 'hasProperty'.
 if (util.hasProperty(jsObject, 'toDateString')) {
../../../flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-0.2.1+3/lib/src/interop/utils/utils.dart:39:26: Error: Method not found: 'getProperty'.

     map[key] = dartify(util.getProperty(jsObject, key), customDartify);
                        ^^^^^^^^^^^
../../../flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-0.2.1+3/lib/src/interop/utils/utils.dart:65:17: Error: Method not found: 'newObject'.
   var jsMap = util.newObject();
../../../flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-0.2.1+3/lib/src/interop/utils/utils.dart:67:7: Error: Method not found: 'setProperty'.
     util.setProperty(jsMap, key, jsify(value, customJsify));
../../../flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-0.2.1+3/lib/src/interop/utils/utils.dart:73:12: Error: Method not found: 'allowInterop'.

好的,在尝试@Gerpea 发送的第二次更正后,我遇到了同样的错误,所以我决定更新到最新版本 go auth。 不,我遇到了一些问题,但我认为这可能更容易纠正 但真的不知道你怎么知道?

import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core_web/firebase_core_web_interop.dart';

import 'package:flutter_application_2/models/user.dart';

class AuthService {
 final FirebaseAuth _auth = FirebaseAuth.instance;

 String error;
 //create user obj based on FirebasedUser
 User _userFromFirebaseUser(FirebaseUser user) {
   return user != null ? User(uid: user.uid) : null;
 }

 //auth change user stream
 Stream<User> get user {
   return _auth.onAuthStateChanged.map(_userFromFirebaseUser);
 }

//sign in anon
 Future signInAnon() async {
   try {
     AuthResult result = await _auth.signInAnonymously();
     FirebaseUser user = result.user;
     return _userFromFirebaseUser(user);
   } catch (e) {
     print(e.toString());
     return null;
   }
 }
 

//sign in with passwort and email
 Future<String> signIN(String email, String password) async {
  try {
    FirebaseUser user = (await _auth.signInWithEmailAndPassword(
      email: email.trim(), 
      password: password,
    )).user;
  } on FirebaseAuthException catch (e) {
    switch(e.code) {
      case 'user-not-found': {
        return 'No user found';
      }
      default: {
        return 'Unexpected error!';
      }
    }
  }
  
  return null;
 }

//register with passwort an email
 Future<String> signUp(String email, String password) async {
   FirebaseUser user = (await _auth.createUserWithEmailAndPassword(
           email: email, password: password)) .user;
   try {
     await user.sendEmailVerification();
     return user.uid;
   } catch (e) {
     print(e.toString);
     return null;
   }
 }

 //sign out
 Future signOut() async {
   try {
     return await _auth.signOut();
   } catch (e) {
     print(e.toString());
     return null;
   }
 }

 //resetpassword
 Future<void> sendPasswordResetEmail(String email) async {
   try {
     return await _auth.sendPasswordResetEmail(email: email);
   } catch (e) {
     print(e.toString());
     return null;
   }
 }
}

这是例外 enter image description here

好的,现在它记录得很好,我只有 2 个例外。代码看起来像这样:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_application_2/models/user.dart' as Model;


class AuthService {
 final FirebaseAuth _auth = FirebaseAuth.instance;

 String error;
 //create user obj based on FirebasedUser
 Model.User _userFromFirebaseUser(Model.User user) {
   return user != null ? Model.User(uid: user.uid) : null;
 }

 //auth change user stream
 Stream<Model.User> get user {
   return _auth.onAuthStateChanged.map(_userFromFirebaseUser);
 }

//sign in anon
 Future signInAnon() async {
   try {
     UserCredential result = await _auth.signInAnonymously();
     User user = result.user;
     return _userFromFirebaseUser(user);
   } catch (e) {
     print(e.toString());
     return null;
   }
 }
 

//sign in with passwort and email
 Future<String> signIN(String email, String password) async {
  try {
    User user = (await _auth.signInWithEmailAndPassword(
      email: email.trim(), 
      password: password,
    )).user;
  } on FirebaseAuthException catch (e) {
    switch(e.code) {
      case 'user-not-found': {
        return 'No user found';
      }
      default: {
        return 'Unexpected error!';
      }
    }
  }
  
  return null;
 }

//register with passwort an email
 Future<String> signUp(String email, String password) async {
   User user = (await _auth.createUserWithEmailAndPassword(
           email: email, password: password)) .user;
   try {
     await user.sendEmailVerification();
     return user.uid;
   } catch (e) {
     print(e.toString);
     return null;
   }
 }

 //sign out
 Future signOut() async {
   try {
     return await _auth.signOut();
   } catch (e) {
     print(e.toString());
     return null;
   }
 }

 //resetpassword
 Future<void> sendPasswordResetEmail(String email) async {
   try {
     return await _auth.sendPasswordResetEmail(email: email);
   } catch (e) {
     print(e.toString());
     return null;
   }
 }
}

还有这样的例外: enter image description here

@Gerpea 所以这是我的代码

Future<String> signUp(String email, String password, String fullname,String user) async {

    try {
  ( await _auth.createUserWithEmailAndPassword(
        email: email.trim(), password: password,)).user.sendEmailVerification();


 await DatbaseService(uid: user.uid).updateUserData('username', 'fullname', 'Passwort', 'Email');


    } on FirebaseAuthException catch (e) {

以及来自 YouTube 的方法:

Future registerWithEmailAndAPassword(String email, String,Passwort)async {
try{
AuthResult result = await.createUserWithEmailAndPassowrd(email:email,password:password);
FirebaseUser user =result.user;

await DatabaseService(uid:user.uid).updateUserData('0','new crew member',100);
return _userFromFirebaseUser(user);
}catch (e){

1 个答案:

答案 0 :(得分:0)

signInWithEmailAndPassword() 方法在出错时会抛出一个 FirebaseAuthException,其中包含带有错误代码的 code 字段。

可以在 here 中找到此方法的完整错误列表。

所以你可以稍微重写你的方法,以返回一个错误消息而不是null

 Future<String> signIN(String email, String password) async {
   try {
     User user = (await _auth.signInWithEmailAndPassword(
       email: email.trim(), 
       password: password,
     )).user;
   } on FirebaseAuthException catch (e) {
     switch(e.code) {
       case 'user-not-found': {
         return 'No user found';
       }
       default: {
         return 'Unexpected error!';
       }
     }
   }
   
   return null;
 }

现在这个方法返回 null 如果没有错误和 String 如果出现错误。

onPressed 回调中使用它。

onPressed: () async {
  if (_formKey.currentState.validate()) {
    print('valid');

    String authError = await _auth.signIN(email, password);
    if (authError != null) {
      setState(() => error = authError);
    }

    setState(() => loading = false);
  }
}

firebase_auth:^0.14.0+5

这个有点过时了,有一些问题,所以如果你 将升级您的依赖项。

但是如果你不能升级。这应该有效。

 Future<String> signIN(String email, String password) async {
   try {
     FirebaseUser user = (await _auth.signInWithEmailAndPassword(
       email: email.trim(), 
       password: password,
     )).user;
   } on AuthException catch (e) {
     switch(e.code) {
       case 'ERROR_USER_NOT_FOUND': {
         return 'No user found';
       }
       default: {
         return 'Unexpected error!';
       }
     }
   } catch(e) {
     return 'Some error that FirebaseAuth do not catch'!;
   }

   return null;
 }

错误代码列表可以在here找到。