Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 如何在flatter中使用googleapi?_Dart_Flutter - Fatal编程技术网

Dart 如何在flatter中使用googleapi?

Dart 如何在flatter中使用googleapi?,dart,flutter,Dart,Flutter,我想在我的flatter应用程序中使用谷歌云自然语言,我得到了 这适用于颤振,相关性适用于0.2.1。 我如何实现它们?这对我来说很有效: 使用软件包google\u-sign\u-in登录,然后从中获取身份验证标题: import 'package:google_sign_in/google_sign_in.dart' show GoogleSignIn, GoogleSignInAccount; import 'package:googleapis/people/v1.dart'

我想在我的flatter应用程序中使用谷歌云自然语言,我得到了 这适用于颤振,相关性适用于0.2.1。 我如何实现它们?

这对我来说很有效:

使用软件包
google\u-sign\u-in
登录,然后从中获取身份验证标题:

import 'package:google_sign_in/google_sign_in.dart'
    show GoogleSignIn, GoogleSignInAccount;

import 'package:googleapis/people/v1.dart'
    show ListConnectionsResponse, PeopleApi;

useGoogleApi() async {
  final _googleSignIn = new GoogleSignIn(
    scopes: [
      'email',
      'https://www.googleapis.com/auth/contacts.readonly',
    ],
  );

  await _googleSignIn.signIn();

  final authHeaders = _googleSignIn.currentUser.authHeaders;

  // custom IOClient from below
  final httpClient = GoogleHttpClient(authHeaders); 

  data = await PeopleApi(httpClient).people.connections.list(
      'people/me',
      personFields: 'names,addresses',
      pageToken: nextPageToken,
      pageSize: 100,
  );
}
这是一个自定义的
IOClient
实现,它会自动将auth头添加到每个请求中。googleapis调用支持传递一个自定义HTTP客户机来使用,而不是默认的(见上文)

import'包:http/io_client.dart';
导入“包:http/http.dart”;
类GoogleHttpClient扩展IOClient{
地图标题;
GoogleHttpClient(this._headers):super();
@凌驾
未来发送(BaseRequest请求)=>
super.send(request..headers.addAll(_headers));
@凌驾
未来头(对象url,{Map headers})=>
header(url,headers:headers..addAll(_headers));
}

我还不能添加评论,所以我将把它作为答案发布

我一直试图按照上面的答案创建一个GoogleHttpClient,但在导入时,它说“库”包:http/http.dart“不会导出显示名称为“IOClient”的成员。”

我在这里找到了答案,它说您应该单独导入IOClient,例如:
import'包:http/io_client.dart'


我认为这可能会帮助其他刚刚接触flifter及其googleapi实现的人。

您需要获得2个软件包,然后才能使用googleapis软件包中列出的所有api。我会给你举个例子

import 'package:googleapis/androidpublisher/v3.dart' as androidPublisher;
import 'package:googleapis_auth/auth_io.dart' as auth;

final _credentials = new auth.ServiceAccountCredentials.fromJson(r'''
      {
        "private_key_id": ...,
        "private_key": ...,
        "client_email": ...,
        "client_id": ...,
        "type": "service_account"
      }
      ''');

    const _SCOPES = const [
      androidPublisher.AndroidpublisherApi.AndroidpublisherScope
    ];

    auth.clientViaServiceAccount(_credentials, _SCOPES).then((httpClient) {
      var publisher = new androidPublisher.AndroidpublisherApi(httpClient);
      publisher.purchases.products
          .get(
              packageName,
              productID,
              purchaseToken)
          .then((pub) {
        debugPrint(pub.toJson().toString());
      });
    });
你可以创建这样的键

在云控制台中打开IAM&Admin页面

打开IAM和管理页面

单击“选择项目”,选择项目,然后单击“打开”

在左侧导航中,单击服务帐户

查找要为其创建密钥的服务帐户的行。 在该行中,单击“更多垂直”按钮,然后单击“创建” 钥匙

选择密钥类型,然后单击“创建”


公认的答案很可能是针对旧版本的SDK编写的,我只是无法让它工作。这就是目前为止对我有效的方法

例如,以下内容允许我们访问Google Drive中的文件,Google Drive是Google的一部分

依赖关系 pubspec.yaml:

dependencies:
  google_sign_in: any
  googleapis: any
(我只是把
any
放在这里作为一个例子,但是你应该为你的实际应用指定版本。)

工作原理 必要进口:

import 'package:googleapis/drive/v3.dart' as drive;
import 'package:google_sign_in/google_sign_in.dart' as signIn;
步骤1,登录用户并请求对google drive的访问权限(范围):

final googleSignIn = signIn.GoogleSignIn.standard(scopes: [drive.DriveApi.DriveScope]);
final sign.GoogleSignInAccount account = await googleSignIn.signIn();
步骤2,构建一个
AuthenticateClient

class AuthenticateClient extends http.BaseClient {
  final Map<String, String> headers;

  final http.Client client;

  AuthenticateClient(this.headers, this.client);

  Future<http.StreamedResponse> send(http.BaseRequest request) {
    return client.send(request..headers.addAll(headers));
  }
}
签出以获取详细信息。

更新到

除了和包,现在您可以使用包(由flatter.dev提供)来配置http客户端。因此,可将公认的答案简化为以下内容。不需要实现GoogleHttpClient

import 'package:extension_google_sign_in_as_googleapis_auth/extension_google_sign_in_as_googleapis_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:googleapis/people/v1.dart';

useGoogleApi() async {
  final _googleSignIn = new GoogleSignIn(
    scopes: [
      'email',
      PeopleServiceApi.contactsReadonlyScope,
    ],
  );

  await _googleSignIn.signIn();

  // custom IOClient
  final httpClient = await _googleSignIn.authenticatedClient();

  data = await PeopleApi(httpClient!).people.connections.list(
      'people/me',
      personFields: 'names,addresses',
      pageToken: nextPageToken,
      pageSize: 100,
  );
}

我真的怀疑
googleapis\u auth
在flift上是否有效,因为它依赖于
http
html
我的意思是,对不起,我能用这个
GoogleHttpClient
用gmailAPI发送电子邮件和/或用FireBase邀请发送邀请吗?我还没有用过这些API,但如果谷歌为这些任务提供API,您应该能够使用GiigleHttpClient完成此操作。现在可以使用。将来会尝试使用您的方法。GoogleHttpClient来自哪里?我在上面的回答中发明了它;)这只是我为我的自定义子类
IOClient
使用的名称。我可以问一下,这种方法与使用
googleapis_auth
包中的
authenticatedClient
函数来获取经过身份验证的客户端有什么区别吗?请不要在您的Flatter应用程序中使用服务帐户。服务帐户的私钥是一个秘密,它不应该在客户端(电话和/或浏览器)上。这是一个安全漏洞。
final baseClient = new Client();
final authenticateClient = AuthenticateClient(authHeader, baseClient);
final driveApi = drive.DriveApi(authenticateClient);
import 'package:extension_google_sign_in_as_googleapis_auth/extension_google_sign_in_as_googleapis_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:googleapis/people/v1.dart';

useGoogleApi() async {
  final _googleSignIn = new GoogleSignIn(
    scopes: [
      'email',
      PeopleServiceApi.contactsReadonlyScope,
    ],
  );

  await _googleSignIn.signIn();

  // custom IOClient
  final httpClient = await _googleSignIn.authenticatedClient();

  data = await PeopleApi(httpClient!).people.connections.list(
      'people/me',
      personFields: 'names,addresses',
      pageToken: nextPageToken,
      pageSize: 100,
  );
}