如何在Flutter中使用Google API?

27

我想在我的Flutter应用中使用Google Cloud自然语言,我获得了Google API包。这适用于Flutter和Google API_AUTH依赖项适用于0.2.1版本。我该如何实现它们?


2
我真的怀疑 googleapis_auth 在 Flutter 上是否可行,因为它依赖于 http - Pacane
1
我是指抱歉,"html"。 - Pacane
4个回答

37

这对我有用:

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

}

2
现在我已经通过 https://stackoverflow.com/questions/50079538/flutter-send-email-using-google-api 成功实现了它。将来我会尝试使用你的方法。 - mmccabe
2
我在上面的回答中发明了它 ;) 这只是我用于自定义IOClient子类的名称。 - Günter Zöchbauer
1
谢谢你的回答。现在有了extension_google_sign_in_as_googleapis_auth包,你可以使用该包提供的即用型IOClient,而不是自己实现GoogleHttpClient。这只是一个小改变,但我已经发布了另一个答案。 - kanji
@kanji 你能告诉我更多关于 google_sign_in_as_googleapis_auth 的信息吗?我在dart/flutter方面相对较新,我必须说这份文档非常糟糕。 - Flutter Supabase
@Tananga 虽然我同意 Google API 包不是很容易上手,但我认为 google_sign_in_as_googleapis_auth 的文档 已经足够好了。文档中已经详细解释了所有内容。很抱歉我无法提供更多帮助... - kanji
显示剩余13条评论

14

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

我一直在尝试按照置顶答案中的方法创建GoogleHttpClient,但导入时出现了“library 'package:http/http.dart'没有导出名称为'IOClient'的成员”的提示。

我在这里找到了答案:https://pub.dartlang.org/packages/http#-changelog-tab-,其中提到您应该单独导入IOClient,如下所示:import 'package:http/io_client.dart';

我认为这可能会帮助其他刚接触Flutter和其Google API实现的人。


谢谢@Kim,顺便问一下如何添加"@Kim Palao"?在我的情况下,它只是一个简单的字符串。 - Flutter Supabase

4

接受的答案很可能是针对旧版SDK编写的,我无法使其正常工作。这是目前适用于我的内容。

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

依赖项

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;

第一步,登录用户并请求访问Google Drive的权限(范围):

final googleSignIn = signIn.GoogleSignIn.standard(scopes: [drive.DriveApi.DriveScope]);
final sign.GoogleSignInAccount account = await googleSignIn.signIn();

第二步,构建一个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客户端,访问谷歌驱动器API。

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

查看如何在Flutter应用中使用Google Drive API以获取详细信息。


我可以问一下这个方法和使用googleapis_auth包中的authenticatedClient函数获取已验证客户端之间有什么区别吗? - Nelson Yeung

3

更新为已接受的答案

现在,除了google_sign_ingoogleapis包之外,您还可以使用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”? - Flutter Supabase
@Tananga,我没有测试过这个特定的代码片段,因为那部分代码只是从被接受的答案中复制而来。但是,根据People API文档nextPageToken在此方法的响应中提供,并且可以省略或为空,因为它是可选的。 - kanji

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接