Flutter中Dart Futures的麻烦:断言失败:第146行:'<optimized out>':不是真的

我正在为我的应用程序构建用户身份验证模块,我遇到了一些异步代码的问题 .

首先,这是抛出的错误:

E / flutter(17162):[错误:flutter / shell / common / shell.cc(188)] Dart错误:未处理的异常:E / flutter(17162):'dart:async / future_impl.dart':失败的断言:第146行:'优化出':不是真的 . E / flutter(17162):#0 _AssertionError._doThrowNew(dart:core / runtime / liberrors_patch.dart:40:39)E / flutter(17162):#1 _AssertionError._throwNew(dart:core / runtime / liberrors_patch.dart: 36:5)E / flutter(17162):#2 _FutureListener.handleError(dart:async / future_impl.dart:146:14)E / flutter(17162):#3 Future._propagateToListeners.handleError(dart:async / future_impl . 飞镖:654:47)E / flutter(17162):#4 Future._propagateToListeners(dart:async / future_impl.dart:675:24)E / flutter(17162):#5 Future._completeError(dart:async / future_impl . dart:494:5)E / flutter(17162):#6 _SyncCompleter._completeError(dart:async / future_impl.dart:55:12)E / flutter(17162):#7 _Completer.completeError(dart:async / future_impl . 镖:27:5)E / flutter(17162):#8 _AsyncAwaitCompleter.completeError(dart:async / runtime / libasync_patch.dart:40:18)E / flutter(17162):#9 FirebaseAuth.signInWithEmailAndPassword(package:firebase_auth / firebase_auth.dart)E / flutter(17162):E / flutter(17162):#10 Session.login . (包:mood_map / utilities / session.dart:31:24)E / flutter(17162):#11 _RootZone.runUnary(dart:async / zone.dart:1379:54)E / flutter(17162):#12 _FutureListener .handleValue(dart:async / future_impl.dart:129:18)E / flutter(17162):#13 Future._propagateToListeners.handleValueCallback(dart:async / future_impl.dart:642:45)E / flutter(17162):# 14 Future._propagateToListeners(dart:async / future_impl.dart:671:32)E / flutter(17162):#15 Future._complete(dart:async / future_impl.dart:476:7)E / flutter(17162):# 16 _SyncCompleter.complete(dart:async / future_impl.dart:51:12)E / flutter(17162):#17 _AsyncAwaitCompleter.complete(dart:async / runtime / libasync_patch.dart:28:18)E / flutter(17162) :#18 _completeOnAsyncReturn(dart:async / runtime / libasync_patch.dart:295:13)E / flutter(17162):#19 Session._checkUserAlreadyExists(package:mood_map / utilities / session.dart)E / flutter(17162):E / flutter(17162):#20 Session.login(package:mood_map / utilities / session.dart:27:11)

以下是涉及的功能:

static final FirebaseAuth _authenticator = FirebaseAuth.instance;

static void login(BuildContext context, String email, String password) async {

email = email.trim();
password = password.trim();

//Check if the user already exists
await _checkUserAlreadyExists(email).then((exists) {

  if(exists) {

    _authenticator.signInWithEmailAndPassword(email: email, password: password)
        .then((FirebaseUser user) { _loginSuccess(); })
        .catchError((Error e) { _loginFailure(context); });

  } else {

    Utilities.showMessageDialog(context, "That user doesn't exist. Please create an account below.");

  }

});

} 

----------------------------------------------------------------------

static Future createUserAccount(BuildContext context, email, String password) async {

//Check if the user already exists
await _checkUserAlreadyExists(email).then((exists) {

  if(exists) {

    Utilities.showMessageDialog(context, "That user already exists. Please login or select another account.");
    AppNavigator.navigateToLoginScreen();

  } else {

    _authenticator.createUserWithEmailAndPassword(email: email, password: password)
        .then((FirebaseUser user) { _createUserSuccess(); })
        .catchError((Error e) { _createUserFailure(context); });

  }

});

}

简而言之,对_authenticator.signonWithEmailAndPassword()的调用失败 . 我知道_authenticator实例正在使用其他函数,所以我知道它不是Firebase本身的问题 .

我担心我通过从另一个异步函数_checkIfUserAlreadyExists()中调用另一个异步函数_authenticator.signonWithEmailAndPassword()来做错事 . 看起来这应该可以从我读过的.then()块中做到但是错误消息似乎非常坚持它与函数调用的异步性质的设置有关 .

思考?

回答(1)

2 years ago

如果使用 .then() 子句,请不要使用 await .

.then()await 是处理 Future 's but shouldn'用于同一 Future 实例的两种不同方式 .