[更新]:按照@Ashton的建议将代码拆分为2个函数,使事情变得更简单。 我是一个颤抖的菜鸟,我正在尝试做一些非常简单的事情,即使用firebase登录或谷歌登录建立一个登录页面。我两个都面临错误,我无法找出原因。
我有用于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
任何正确方向的帮助都会非常有帮助。感谢
答案 0 :(得分:2)
我也碰到了这个。
我认为这可能是版本3.0
中的错误。我降级为2.1.2
e.g。
pubspec.yaml
dependencies:
flutter:
sdk: flutter
# ...
google_sign_in: 2.1.2
问题消失了
答案 1 :(得分:1)
错误:
type&#39; _Future&#39;不是&#39;未来&#39;
类型的子类型 快速修复:
在Android工作室中,
设置 - &gt;扑动 - &gt;在Dart 2.0模式下运行应用程序&#34;禁用dart 2&#34;
我不确定为什么飞镖2会导致这个错误;希望有人能帮助理解这个问题。
答案 2 :(得分:0)
type&#39; _Future&#39;不是&#39;未来&#39;
类型的子类型
在这种情况下,您在use_google == true
区块中没有返回语句。
尝试Future
类型的return user;
type&#39; _InternalLinkedHashMap&#39;不是类型&#39; Map&#39;
的子类型
我在这里不太确定。也许它是输入的格式,它在异常中如何处理,或者通常是firebase_auth的设置。我建议你拆分两种不同的登录方法,这样你就可以从每种方法中返回相应的类型,这样你就可以缩小你的注意力,看看是否有助于你发现问题。
答案 3 :(得分:0)
我相信您应该从以下地址更改退货类型:
Future<Null> _googleSignIn() async
到
Future<GoogleSignInAccount> _googleSignIn() async