Flutter 颤栗:我无法用谷歌登录库注销我的应用程序。如何做到这一点?

Flutter 颤栗:我无法用谷歌登录库注销我的应用程序。如何做到这一点?,flutter,Flutter,我已经尝试了下面的谷歌登录示例,它运行良好。但当我将_handleSignOut()函数移到另一个屏幕时,它并没有注销。我的要求是登录成功后,我的主页是可见的。在主页顶部,有一个注销按钮。点击它,我想用谷歌注销我的应用程序 import 'dart:async'; import 'dart:convert' show json; import "package:http/http.dart" as http; import 'package:flutter/mat

我已经尝试了下面的谷歌登录示例,它运行良好。但当我将_handleSignOut()函数移到另一个屏幕时,它并没有注销。我的要求是登录成功后,我的主页是可见的。在主页顶部,有一个注销按钮。点击它,我想用谷歌注销我的应用程序

    import 'dart:async';
    import 'dart:convert' show json;
    import "package:http/http.dart" as http;
    import 'package:flutter/material.dart';
    import 'package:google_sign_in/google_sign_in.dart';

    GoogleSignIn _googleSignIn = GoogleSignIn(
      scopes: <String>[
        'email',
        'https://www.googleapis.com/auth/contacts.readonly',
      ],
    );

    void main() {
      runApp(
        MaterialApp(
          title: 'Google Sign In',
          home: SignInDemo(),
        ),
      );
    }

    class SignInDemo extends StatefulWidget {
      @override
      State createState() => SignInDemoState();
    }

    class SignInDemoState extends State<SignInDemo> {
      GoogleSignInAccount _currentUser;
      String _contactText;

      @override
      void initState() {
        super.initState();
        _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account) {
          setState(() {
            _currentUser = account;
          });
          if (_currentUser != null) {
            _handleGetContact();
          }
        });
        _googleSignIn.signInSilently();
      }

      Future<void> _handleGetContact() async {
        setState(() {
          _contactText = "Loading contact info...";
        });
        final http.Response response = await http.get(
          'https://people.googleapis.com/v1/people/me/connections'
              '?requestMask.includeField=person.names',
          headers: await _currentUser.authHeaders,
        );
        if (response.statusCode != 200) {
          setState(() {
            _contactText = "People API gave a ${response.statusCode} "
                "response. Check logs for details.";
          });
          print('People API ${response.statusCode} response: ${response.body}');
          return;
        }
        final Map<String, dynamic> data = json.decode(response.body);
        final String namedContact = _pickFirstNamedContact(data);
        setState(() {
          if (namedContact != null) {
            _contactText = "I see you know $namedContact!";
          } else {
            _contactText = "No contacts to display.";
          }
        });
      }

      String _pickFirstNamedContact(Map<String, dynamic> data) {
        final List<dynamic> connections = data['connections'];
        final Map<String, dynamic> contact = connections?.firstWhere(
          (dynamic contact) => contact['names'] != null,
          orElse: () => null,
        );
        if (contact != null) {
          final Map<String, dynamic> name = contact['names'].firstWhere(
            (dynamic name) => name['displayName'] != null,
            orElse: () => null,
          );
          if (name != null) {
            return name['displayName'];
          }
        }
        return null;
      }

      Future<void> _handleSignIn() async {
        try {
          await _googleSignIn.signIn();
        } catch (error) {
          print(error);
        }
      }

      Future<void> _handleSignOut() async {
        _googleSignIn.disconnect();
      }

      Widget _buildBody() {
        if (_currentUser != null) {
          return Column(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: <Widget>[
              ListTile(
                leading: GoogleUserCircleAvatar(
                  identity: _currentUser,
                ),
                title: Text(_currentUser.displayName),
                subtitle: Text(_currentUser.email),
              ),
              const Text("Signed in successfully."),
              Text(_contactText),
              RaisedButton(
                child: const Text('SIGN OUT'),
                onPressed: _handleSignOut,
              ),
              RaisedButton(
                child: const Text('REFRESH'),
                onPressed: _handleGetContact,
              ),
            ],
          );
        } else {
          return Column(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: <Widget>[
              const Text("You are not currently signed in."),
              RaisedButton(
                child: const Text('SIGN IN'),
                onPressed: _handleSignIn,
              ),
            ],
          );
        }
      }

      @override
      Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
              title: const Text('Google Sign In'),
            ),
            body: ConstrainedBox(
              constraints: const BoxConstraints.expand(),
              child: _buildBody(),
            ));
      }
    }
导入'dart:async';
导入“dart:convert”显示json;
将“package:http/http.dart”导入为http;
进口“包装:颤振/材料.省道”;
导入“包:google_sign_in/google_sign_in.dart”;
谷歌签名(
范围:[
“电子邮件”,
'https://www.googleapis.com/auth/contacts.readonly',
],
);
void main(){
runApp(
材料聚丙烯(
标题:“谷歌登录”,
主页:SignInDemo(),
),
);
}
类SignInDemo扩展StatefulWidget{
@凌驾
状态createState()=>SignInDemoState();
}
类SignInDemoState扩展状态{
GoogleSignInAccount\u currentUser;
字符串_contactText;
@凌驾
void initState(){
super.initState();
_googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount帐户){
设置状态(){
_当前用户=帐户;
});
如果(_currentUser!=null){
_handleGetContact();
}
});
_googleSignIn.signizely();
}
Future _handleGetContact()异步{
设置状态(){
_contactText=“正在加载联系人信息…”;
});
final http.Response Response=wait http.get(
'https://people.googleapis.com/v1/people/me/connections'
“?requestMask.includeField=person.names”,
headers:await\u currentUser.authHeaders,
);
如果(response.statusCode!=200){
设置状态(){
_contactText=“People API提供了${response.statusCode}”
“响应。有关详细信息,请查看日志。”;
});
打印('People API${response.statusCode}响应:${response.body}');
返回;
}
最终映射数据=json.decode(response.body);
最终字符串namedContact=\u pickFirstNamedContact(数据);
设置状态(){
if(namedContact!=null){
_contactText=“我知道你知道$namedContact!”;
}否则{
_contactText=“没有要显示的联系人。”;
}
});
}
字符串\u pickFirstNamedContact(地图数据){
最终列表连接=数据[‘连接’];
最终地图联系人=连接?.firstWhere(
(动态联系人)=>联系人['names'!=null,
orElse:()=>null,
);
如果(联系人!=null){
最终地图名称=联系人['names']。firstWhere(
(动态名称)=>name['displayName']!=null,
orElse:()=>null,
);
if(name!=null){
返回名称['displayName'];
}
}
返回null;
}
Future\u handleSignIn()异步{
试一试{
等待谷歌签名;
}捕获(错误){
打印(错误);
}
}
Future\u handleSignOut()异步{
_googlesign.disconnect();
}
小部件_buildBody(){
如果(_currentUser!=null){
返回列(
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[
列表砖(
领先:谷歌用户Circleavatar(
标识:_当前用户,
),
标题:文本(_currentUser.displayName),
字幕:文本(_currentUser.email),
),
const Text(“已成功登录”),
文本(_contactText),
升起的按钮(
子项:常量文本(“注销”),
按下按钮:_handleSignOut,
),
升起的按钮(
子项:常量文本(“刷新”),
按下按钮:_handleGetContact,
),
],
);
}否则{
返回列(
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[
const Text(“您当前未登录。”),
升起的按钮(
子项:常量文本(“登录”),
按下按钮:_handleSignIn,
),
],
);
}
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:const Text(“谷歌登录”),
),
主体:约束框(
约束:const-BoxConstraints.expand(),
子项:_buildBody(),
));
}
}
改用
注销()。如果您使用的是
FirebaseAuth
,则需要同时从这两个站点注销

Future<void> _handleSignOut() async {
  await FirebaseAuth.instance.signOut();
  await _googleSignIn.signOut();
}
Future\u handleSignOut()异步{
等待FirebaseAuth.instance.signOut();
等待(googlesign.signOut);
}

我找到了解决方案。我在注销屏幕上再次创建了一个googlesignin对象。 这是我的错误。 使用与上述声明相同的googlesignin对象

谷歌登录(GoogleSignIn)u GoogleSignIn=注销屏幕中的谷歌登录(..)将起作用。我只需要像_googlesign.signOut()一样调用这个对象。

不,我没有使用firebase auth。我试过了,但失败了。问题在于从主页注销。在同一页上,如果我将添加登录注销功能,那么它将完美工作。请把那一行删掉。“但是失败了”不知道那意味着什么,完美地完成了。这是我的错误。我再次初始化GoogleSignIn,就像最终的GoogleSignIn=GoogleSignIn(作用域:[‘email’,'',]);在我的主页上。这造成了问题。现在我通过使用login类的GoogleSignIn对象解决了这个问题,并调用