如何在 Flutter 中使用 Google API?

Posted

技术标签:

【中文标题】如何在 Flutter 中使用 Google API?【英文标题】:How to use Google API in flutter? 【发布时间】:2018-07-06 18:04:55 【问题描述】:

我想在我的 Flutter 应用中使用 Google Cloud Natural Language,我收到了Google API package 这适用于颤振,Google API_AUTH 依赖适用于 0.2.1。 如何实现它们?

【问题讨论】:

我真的怀疑 googleapis_auth 是否适用于颤振,因为它依赖于 http html 对不起 【参考方案1】:

更新到the accepted answer

与google_sign_in 和googleapis 包一起,现在您可以使用extension_google_sign_in_as_googleapis_auth 包(由flutter.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,
  );

【讨论】:

在哪里可以找到“nextPageToken”? @Tananga,我没有使用这段特定的代码进行测试,因为这部分代码只是从接受的答案中复制而来。但是,根据People API documentation,nextPageToken在该方法的响应中提供,并且可以省略或为空,因为它是可选的。【参考方案2】:

接受的答案很可能是针对旧版本的 SDK 编写的,我只是无法让它工作。到目前为止,这对我有用。

例如,以下允许我们访问属于googleapis 一部分的Google Drive 中的文件。

依赖关系

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步,登录用户并请求访问谷歌驱动器的权限(范围):

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));
  

正如http 中所建议的,这是使用带有额外身份验证标头的BaseClient(可组合)。

第 3 步,使用第 1 步和第 2 步创建经过身份验证的 http 客户端并访问 google drive API。

final baseClient = new Client();
final authenticateClient = AuthenticateClient(authHeader, baseClient);
final driveApi = drive.DriveApi(authenticateClient);

结帐How to Use the Google Drive API With Flutter Apps了解详情。

【讨论】:

请问这种方法和使用googleapis_auth包中的authenticatedClient函数获取认证客户端有什么区别?【参考方案3】:

这对我有用:

使用包google_sign_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 实现,它会自动将身份验证标头添加到每个请求中。 googleapis 调用支持传递要使用的自定义 HTTP 客户端而不是默认客户端(见上文)

import 'package:http/io_client.dart';
import 'package:http/http.dart';

class GoogleHttpClient extends IOClient 
  Map<String, String> _headers;

  GoogleHttpClient(this._headers) : super();

  @override
  Future<StreamedResponse> send(BaseRequest request) =>
      super.send(request..headers.addAll(_headers));

  @override
  Future<Response> head(Object url, Map<String, String> headers) =>
      super.head(url, headers: headers..addAll(_headers));


【讨论】:

我可以使用这个GoogleHttpClient 使用 gmailAPI 发送电子邮件和/或使用 FireBase 邀请发送邀请吗? 我没用过这些API,但是如果谷歌为这些任务提供了API,你应该可以用GiigleHttpClient来做。 现在可以使用 ***.com/questions/50079538/… 让它工作。将来会尝试使用您的方法。 我在上面的回答中发明了它;)这只是我用于IOClient的自定义子类的名称 感谢您的回答。现在有了 extension_google_sign_in_as_googleapis_auth 包,您可以使用该包提供的即用型 IOClient 代替您自己的 GoogleHttpClient 实现。这是一个小的变化,但我发布了另一个答案。【参考方案4】:

我还不能添加 cmets,所以我将它作为答案发布。

我一直在尝试按照最佳答案创建 GoogleHttpClient,但在导入时,它显示“库 'package:http/http.dart' 不会导出显示名称为 'IOClient' 的成员。”

我在这里找到了答案https://pub.dartlang.org/packages/http#-changelog-tab-,它说你应该单独导入 IOClient:import 'package:http/io_client.dart';

我认为这可能会帮助其他不熟悉 Flutter 及其 Google API 实现的人。

【讨论】:

谢谢@Kim btw 如何添加这个“@Kim Palao”?就我而言,它只是一个简单的字符串

以上是关于如何在 Flutter 中使用 Google API?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中添加 XML Google Pay 按钮

如何在 Flutter 中使用 rest api 不使用 firebase 以 google 或 facebook 登录

如何向 google_map_location_picker 添加语言环境支持? (扑)

如何知道在 Flutter 应用中使用哪个版本的 Google Firebase 插件?

在 Flutter 中使用 Google Play 游戏服务?

如何使用Flutter访问Google Drive appdata文件夹文件?