首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google登录错误:键入'Future<GoogleSignInAccount?>‘不是’GoogleSignInAccount‘类型的子类型?in型铸造

Google登录错误:键入'Future<GoogleSignInAccount?>‘不是’GoogleSignInAccount‘类型的子类型?in型铸造
EN

Stack Overflow用户
提问于 2022-01-08 19:52:12
回答 1查看 131关注 0票数 0

使用FirebaseAuth,我正在尝试将google帐户注册到我的应用程序。

在我的主屏幕上,我单击一个ConnectionPage,导航到LoggedInWidget,它在初始使用时将我转到SignUpWidget,然后单击使用google的登录,它弹出弹出式窗口,允许我选择谷歌用户,此时应该将其路由到LoggedInWidget,但是没有发生任何事情(即快照没有数据),我一直得到带有错误日志的SignUpWidget ( 721):输入'Future‘不是’GoogleSignInAccount‘类型在类型转换中的子类型?

在GoogleSignInProvider中有一个转换错误,我无法解决这个错误。有什么帮助吗?

谢谢。

与====相关的属地====

代码语言:javascript
复制
# Google SignIn
  firebase_auth: ^3.2.0
  google_sign_in: ^5.2.1
# Google Icon
  font_awesome_flutter: ^9.2.0

代码片段

==== GoogleSignIn Provider ====

代码语言:javascript
复制
//LIBRARIES

//PACKAGES
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';

//PAGES


//utilizing Provider dependency
class GoogleSignInProvider extends ChangeNotifier {
  //class implements the logic of the google sign in when clicking on google sign in button at the SignUpWidget
  final googleSignIn = GoogleSignIn();

  GoogleSignInAccount? _user; // the user that has signed in
  GoogleSignInAccount get user => _user!;

  Future googleLogin() async {
    try {
      final googleUser = googleSignIn
          .signIn(); // user account = account selected in login pop up
      // ignore: unnecessary_null_comparison
      if (googleUser == null) return;
      _user =
          googleUser as GoogleSignInAccount?; // saving account in _user field
      final googleAuth =
          await _user?.authentication; //getting accessToken and IdToken
      final credential = GoogleAuthProvider.credential(
        accessToken: googleAuth!.accessToken,
        idToken: googleAuth.idToken,
      );

      await FirebaseAuth.instance.signInWithCredential(credential); // use credentials to sign into firebaseAuth
    } catch (e) {
      print(e.toString());
    }
    notifyListeners(); // updates the UI
  }

  Future logout() async {
    await googleSignIn.disconnect();
    FirebaseAuth.instance.signOut();
  }
}

====连接页====

代码语言:javascript
复制
//PACKAGES
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';

//PAGES
import '../data/vars.dart';
import '../widget/sign_up_widget.dart';
import '../widget/logged_in_widget.dart';

class ConnectionPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: BG_COLOR,
      body: StreamBuilder(
          stream: FirebaseAuth.instance.authStateChanges(),
          builder: (context, snapshot) {
            // case: connection is waiting
            if (snapshot.connectionState == ConnectionState.waiting) {
              return Center(child: LinearProgressIndicator());
            }
            // case: connection has error
            else if (snapshot.hasError) {
              return Center(
                child: Text(
                  'Something Went Wrong',
                  style: Theme.of(context).textTheme.headline1!.copyWith(),
                ),
              );
            }
            //case: user is logged in already
            else if (snapshot.hasData){
              return LoggedInWidget();
            }
            // case: user is not logged in
            else {
              return SignUpWidget();
                //SignUpWidget();
            }
          }),
    );
  }
}

==== SIGNUPWIDGET ====

代码语言:javascript
复制
//LIBRARIES

//PACKAGES
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';

//PAGES
import '../data/vars.dart';
import '../provider/google_sign_in.dart';

class SignUpWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final data = MediaQuery.of(context);
    return Scaffold(
      appBar: AppBar(backgroundColor: BG_COLOR,),
      body: Container(
        color: BG_COLOR,
        height: data.size.height,
        width: data.size.width,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            buildSignUp(context),
          ],
        ),
      ),
    );
  }

    Widget buildSignUp(BuildContext context) =>
        ElevatedButton.icon(
          onPressed: () {
            final provider = Provider.of<GoogleSignInProvider>(context,
                listen: false); // implemented in Provider package
            provider
                .googleLogin(); // user provider to call googleLogin method
          },
          style: Theme
              .of(context)
              .elevatedButtonTheme
              .style!
              .copyWith(),
          label: Text('Google Sign In'),
          icon: FaIcon(FontAwesomeIcons.google, color: Colors.white70,),
        );

}

==== LoggedInWidget ====

代码语言:javascript
复制
//LIBRARIES
//import 'dart:js';

//PACKAGES

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

//PAGES
import '../data/vars.dart';
import '../provider/google_sign_in.dart';

class LoggedInWidget extends StatelessWidget {
  //final FirebaseAuth firebaseAuth = FirebaseAuth.instance;

  @override
  Widget build(BuildContext context) {
    final data = MediaQuery.of(context);
    final user = FirebaseAuth.instance.currentUser!;
    return Scaffold(
      appBar: AppBar(
        title: Text('Logged In'),
        centerTitle: true,
        actions: [
          TextButton(
              onPressed: () {
                final provider = Provider.of<GoogleSignInProvider>(context, listen:false);
                provider.logout();
              },
              child: Text('Log Out')
          )
        ],
      ),
      body: Container(
        height: data.size.height,
        width: data.size.width,
        padding: EdgeInsets.all(16.0),
        decoration: BoxDecoration(
          color: BG_COLOR,
          border: Border.all(
              width: 3.0, color: Colors.grey, style: BorderStyle.solid),
        ),
        alignment: Alignment.center,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              'Profile',
              style: Theme.of(context).textTheme.headline1!.copyWith(),
            ),

            //Display Avatar
            SizedBox(
              height: 20,
            ),
            CircleAvatar(
              radius: 50,
              backgroundImage: NetworkImage(user.photoURL!),
            ),

            //Display Name
            SizedBox(
              height: 8,
            ),
            Text(
              'Name: ' + user.displayName!,
              style: Theme.of(context).textTheme.caption!.copyWith(),
            ),

            //Display Email
            SizedBox(
              height: 8,
            ),
            Text(
              'Email: ' + user.email!,
              style: Theme.of(context).textTheme.caption!.copyWith(),
            ),
          ],
        ),
      ),
    );
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-09 07:44:14

在这一行中,您丢失了一个await,这就是错误消息的意义所在。改变这一点:

代码语言:javascript
复制
final googleUser = googleSignIn.signIn();

对此:

代码语言:javascript
复制
final googleUser = await googleSignIn.signIn();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70635898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档