名为 googleapis 的软件包公开了数十种 Google 服务,您可以在 Dart 项目中使用它们。

本页面将介绍如何使用通过 Google 身份验证来与最终用户数据进行交互的 API。

用户数据 API 的示例包括 CalendarGmailYouTube 和 Firebase。

如需显式地为 Firebase 添加身份验证,请查阅 使用 FirebaseUI 为 Flutter 应用添加用户身份验证流程 教程以及 Flutter Firebase 身份验证入门 文档。

概述

#

要使用 Google API,请按照以下步骤操作:

  1. 选择所需 API
  2. 启用 API
  3. 验证身份并确定当前用户
  4. 获取已验证的 HTTP 客户端
  5. 创建并使用所需的 API 类

1. 选择所需 API

#

package:googleapis 的文档将每个 API 列为一个单独的 Dart 库 — 采用 name_version 格式。请查看 youtube_v3 示例。

每个库可能提供许多类型,但有一个以 Api 结尾的类。对于 YouTube,它是 YouTubeApi

不仅 Api 类是您需要实例化的类(参见步骤 3),它还公开了表示使用 API 所需权限的范围。例如,YouTubeApi 类的 Constants 部分列出了可用的范围。要请求访问用户 YouTube 数据的读取(但非写入)权限,请使用 youtubeReadonlyScope 对用户进行身份验证。

dart
/// Provides the `YouTubeApi` class.
import 'package:googleapis/youtube/v3.dart';

2. 启用 API

#

要使用 Google API,您必须拥有一个 Google 帐号和一个 Google 项目。您还需要启用所需的 API。

此示例启用 YouTube Data API v3。有关详细信息,请参阅 入门说明

3. 验证身份并确定当前用户

#

使用 google_sign_in 软件包通过 Google 身份验证用户。为要支持的每个平台配置登录。

dart
/// Provides the `GoogleSignIn` class.
import 'package:google_sign_in/google_sign_in.dart';

通过 GoogleSignIn 类的静态实例访问该软件包的功能。在与实例交互之前,必须调用 initialize 方法并允许其完成。

dart
final _googleSignIn = GoogleSignIn.instance;

@override
void initState() {
  super.initState();
  _googleSignIn.initialize();
  // ···
}

在初始化完成后但用户身份验证之前,监听身份验证事件以确定用户是否已登录。

dart
GoogleSignInAccount? _currentUser;

@override
void initState() {
  super.initState();
  _googleSignIn.initialize().then((_) {
    _googleSignIn.authenticationEvents.listen((event) {
      setState(() {
        _currentUser = switch (event) {
          GoogleSignInAuthenticationEventSignIn() => event.user,
          _ => null,
        };
      });
    });
  });
}

一旦您监听了任何相关的身份验证事件,就可以尝试验证之前已登录的用户。

dart
void initState() {
  super.initState();
  _googleSignIn.initialize().then((_) {
    // ...
    // Attempt to authenticate a previously signed in user.
    _googleSignIn.attemptLightweightAuthentication();
  });
}

要允许新用户进行身份验证,请遵循 package:google_sign_in 提供的说明。

一旦用户通过身份验证,您必须获取一个已验证的 HTTP 客户端。

4. 获取已验证的 HTTP 客户端

#

一旦有了已登录的用户,请使用 authorizationForScopes 请求相关的客户端授权令牌,以满足您应用所需的 API 范围。

dart
const relevantScopes = [YouTubeApi.youtubeReadonlyScope];
final authorization = await currentUser.authorizationClient
    .authorizationForScopes(relevantScopes);

一旦您获得了相关的授权令牌,请使用 package:extension_google_sign_in_as_googleapis_auth 中的 authClient 扩展来设置一个已验证的 HTTP 客户端,并应用相关的凭据。

dart
import 'package:extension_google_sign_in_as_googleapis_auth/extension_google_sign_in_as_googleapis_auth.dart';
dart
final authenticatedClient = authorization!.authClient(
  scopes: relevantScopes,
);

5. 创建并使用所需的 API 类

#

使用 API 创建所需的 API 类型并调用方法。例如:

dart
final youTubeApi = YouTubeApi(authenticatedClient);

final favorites = await youTubeApi.playlistItems.list(
  ['snippet'],
  playlistId: 'LL', // Liked List
);

更多信息

#

您可能想查看以下内容: