Flutter Firebase Auth / Google登录运行时类型错误

时间:2018-03-17 08:51:25

标签: firebase firebase-authentication flutter

[更新]:按照@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

任何正确方向的帮助都会非常有帮助。感谢

4 个答案:

答案 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