如何在 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 插件?