首页 文章

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

提问于
浏览
3

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

  • 2

    我也碰到了这个 .

    我认为这可能是版本 3.0 中的错误 . 我降级到 2.1.2

    例如

    pubspec.yaml

    dependencies:
      flutter:
        sdk: flutter
      # ...
      google_sign_in: 2.1.2
    

    问题消失了

  • 0

    for the error:

    类型'_Future'不是'Future'类型的子类型

    Quick fix:

    在Android工作室中,

    设置 - >颤动 - >在Dart 2.0模式下运行应用程序“禁用dart 2”

    我不确定为什么飞镖2会导致这个错误;希望有人能帮助理解这个问题 .

  • 0

    类型'_Future'不是'Future'类型的子类型

    在这种情况下, use_google == true 块中没有return语句 .

    试试 return user; ,类型为Future

    类型'_InternalLinkedHashMap'不是'Map'类型的子类型

    我不太确定这里 . 也许它是输入的格式,在异常中如何处理,或者通常是firebase_auth的设置 . 我建议您拆分两种不同的登录方法,这样您就可以从每种方法返回相应的类型,这样您就可以缩小焦点,看看是否有助于您发现问题 .

  • 1

    我相信你应该改变以下的返回类型:

    Future<Null> _googleSignIn() async
    

    Future<GoogleSignInAccount> _googleSignIn() async
    

相关问题