[更新]:按照@Ashton的建议将代码拆分为2个函数,使事情变得更简单 . 我是一个颤抖的菜鸟,我正在尝试做一些非常简单的事情,即使用firebase登录或谷歌登录 Build 一个登录页面 . 我两个都面临错误,我无法找出原因 .
我有用于ios开发的firebase设置和我的GoogleServices-Info.plist文件设置 . 对我进行身份验证的功能如下 .
Future<Null> _googleSignIn() async {
GoogleSignInAccount user = googleSignIn.currentUser;
if (user == null)
user = await googleSignIn.signInSilently();
if (user == null) {
user = await googleSignIn.signIn();
}
return user;
}
如果我使用Google登录,则会收到以下错误消息 .
[VERBOSE-2:dart_error.cc(16)] Unhandled exception:
type '_Future' is not a subtype of type 'Future<Null>' where
_Future is from dart:async
Future is from dart:async
Null is from dart:core
#0 GoogleSignIn._callMethod (package:google_sign_in/google_sign_in.dart)
<asynchronous suspension>
#1 GoogleSignIn._addMethodCall.<anonymous closure> (package:google_sign_in/google_sign_in.dart:196:28)
#2 _RootZone.run (dart:async/zone.dart:1376:54)
#3 _FutureListener.handleWhenComplete (dart:async/future_impl.dart:151:18)
#4 _Future._propagateToListeners.handleWhenCompleteCallback (dart:async/future_impl.dart:603:39)
#5 _Future._propagateToListeners (dart:async/future_impl.dart:659:37)
#6 _Future._addListener.<anonymous closure> (dart:async/future_impl.dart:342:9)
#7 _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#8 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
但是,如果我调用firebase简单的auth系统,那么如果用户不存在并且我尝试使用createUserWithEmailAndPassword,则会返回以下错误 .
Future<Null> _firebaseAuthSignIn(String email, String password) async {
FirebaseUser firebaseUser;
try {
firebaseUser = await auth.signInWithEmailAndPassword(
email: email, password: password);
final userid = FirebaseAuth.instance.currentUser;
} catch (exception) {
firebaseUser = await auth.createUserWithEmailAndPassword(
email: email, password: password);
}
return firebaseUser;
}
虽然,这会在firebase中创建用户,但函数createUserWithEmailAndPassword会导致下面的异常 .
[VERBOSE-2:dart_error.cc(16)] Unhandled exception:
type '_InternalLinkedHashMap' is not a subtype of type 'Map<String, dynamic>' where
_InternalLinkedHashMap is from dart:collection
Map is from dart:core
String is from dart:core
#0 FirebaseAuth.createUserWithEmailAndPassword (package:firebase_auth/firebase_auth.dart)
<asynchronous suspension>
#1 _ensureLoggedIn (package:remy/auth/login.dart:28:41)
<asynchronous suspension>
#2 LoginPageState._handleSubmit (package:remy/auth/login.dart:64:11)
<asynchronous suspension>
#3 LoginPageState.build.<anonymous closure> (package:remy/auth/login.dart:132:41)
#4 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:478:14)
#5 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:530:30)
#6 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
#7 TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:161:9)
#8 TapG<…>
我最初的反应是,由于这些错误看起来像类型不一致,因此包版本不是最新的 . 但是,我仔细检查了我的版本是最新的..
google_sign_in:3.0.0 firebase_auth:0.5.1
任何正确方向的帮助都会非常有帮助 . 谢谢
4 回答
我也碰到了这个 .
我认为这可能是版本
3.0
中的错误 . 我降级到2.1.2
例如
pubspec.yaml
问题消失了
for the error:
类型'_Future'不是'Future'类型的子类型
Quick fix:
在Android工作室中,
设置 - >颤动 - >在Dart 2.0模式下运行应用程序“禁用dart 2”
我不确定为什么飞镖2会导致这个错误;希望有人能帮助理解这个问题 .
在这种情况下,
use_google == true
块中没有return语句 .试试
return user;
,类型为Future我不太确定这里 . 也许它是输入的格式,在异常中如何处理,或者通常是firebase_auth的设置 . 我建议您拆分两种不同的登录方法,这样您就可以从每种方法返回相应的类型,这样您就可以缩小焦点,看看是否有助于您发现问题 .
我相信你应该改变以下的返回类型:
至