在鸿蒙上使用 extension_google_sign_in_as_googleapis_auth Flutter 包
extension_google_sign_in_as_googleapis_auth 是一个为鸿蒙平台定制的 Flutter 插件,它作为 google_sign_in 和 googleapis 之间的桥梁,简化了 Google API 的访问流程。该插件提供了无缝集成、类型安全和减少样板代码等特性,支持访问 People API、Drive API 等多种 Google 服务。 使用步骤包括:
插件介绍
extension_google_sign_in_as_googleapis_auth 是一个连接 Flutter 的 google_sign_in 插件和 Dart 的 googleapis 包的桥梁包。它能够直接从 GoogleSignIn 插件创建类似 googleapis_auth 的 AuthClient 实例,使得开发者可以更方便地在 Flutter 应用中使用 Google API。
主要特点:
- 无缝集成:作为
GoogleSignIn插件的扩展方法实现,使用方式简单直观 - 类型安全:提供类型安全的 API 客户端创建方式
- 减少样板代码:自动处理认证流程,减少手动编写 HTTP 请求的工作量
- 广泛的 API 支持:可用于访问 Google 的各种 API,如 People API、Drive API、Calendar API 等
在鸿蒙平台上使用这个包,可以为 Flutter 应用提供便捷的 Google API 访问能力,扩展应用的功能范围。
如何使用插件
包的引入
由于这是一个为鸿蒙平台定制修改的版本,需要以 git 形式引入。在项目的 pubspec.yaml 文件中添加以下依赖配置:
dependencies:
google_sign_in:
git:
url: "https://gitcode.com/openharmony-tpc/flutter_packages.git"
path: "packages/google_sign_in"
extension_google_sign_in_as_googleapis_auth:
git:
url: "https://gitcode.com/openharmony-tpc/flutter_packages.git"
path: "packages/extension_google_sign_in_as_googleapis_auth"
googleapis:
# 根据需要选择合适的版本
version: ^12.0.0
googleapis_auth:
# 根据需要选择合适的版本
version: ^1.6.0
添加依赖后,运行 flutter pub get 命令来获取包:
flutter pub get
导入包
在需要使用 Google 登录和 Google API 的 Dart 文件中导入以下包:
import 'package:google_sign_in/google_sign_in.dart';
import 'package:extension_google_sign_in_as_googleapis_auth/extension_google_sign_in_as_googleapis_auth.dart';
// 导入需要使用的 Google API
import 'package:googleapis/people/v1.dart' as people;
API 的调用
初始化 GoogleSignIn
首先,初始化 GoogleSignIn 实例,并指定需要的作用域(scopes):
final GoogleSignIn _googleSignIn = GoogleSignIn(
scopes: <String>[
'email',
'https://www.googleapis.com/auth/contacts.readonly',
],
);
作用域定义了应用需要访问的 Google API 权限,不同的 API 需要不同的作用域。
执行 Google 登录
使用 GoogleSignIn 实例执行登录操作:
Future<void> _handleSignIn() async {
try {
await _googleSignIn.signIn();
} catch (error) {
print('Error signing in: $error');
}
}
获取认证客户端
登录成功后,使用扩展方法 authenticatedClient() 获取认证客户端:
Future<void> _loadData() async {
if (_googleSignIn.currentUser == null) {
await _handleSignIn();
}
final authClient = await _googleSignIn.authenticatedClient();
if (authClient != null) {
// 使用认证客户端访问 Google API
_fetchGoogleContacts(authClient);
}
}
使用 Google API
使用获取到的认证客户端创建 Google API 客户端,并调用相应的 API:
Future<void> _fetchGoogleContacts(AuthClient client) async {
final peopleApi = people.PeopleApi(client);
try {
final response = await peopleApi.people.connections.list(
'people/me',
personFields: 'names,emailAddresses',
);
// 处理 API 响应
final contacts = response.connections;
if (contacts != null) {
for (var contact in contacts) {
final names = contact.names;
if (names != null && names.isNotEmpty) {
print('Contact: ${names.first.displayName}');
}
}
}
} catch (error) {
print('Error fetching contacts: $error');
}
}
完整的 API 调用示例
// 初始化 GoogleSignIn
final GoogleSignIn _googleSignIn = GoogleSignIn(
scopes: <String>[
'email',
'https://www.googleapis.com/auth/people.readonly',
],
);
// 执行登录并获取用户信息
Future<void> signInAndFetchUserData() async {
try {
// 执行登录
await _googleSignIn.signIn();
// 获取认证客户端
final authClient = await _googleSignIn.authenticatedClient();
if (authClient != null) {
// 创建 People API 客户端
final peopleApi = people.PeopleApi(authClient);
// 调用 People API 获取用户信息
final response = await peopleApi.people.get(
'people/me',
personFields: 'names,emailAddresses',
);
// 处理响应数据
final names = response.names;
final emails = response.emailAddresses;
if (names != null && names.isNotEmpty) {
print('Name: ${names.first.displayName}');
}
if (emails != null && emails.isNotEmpty) {
print('Email: ${emails.first.value}');
}
}
} catch (error) {
print('Error: $error');
}
}
// 登出
Future<void> signOut() async {
await _googleSignIn.signOut();
}
完整示例
以下是一个在鸿蒙应用中使用 extension_google_sign_in_as_googleapis_auth 包的完整示例:
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:extension_google_sign_in_as_googleapis_auth/extension_google_sign_in_as_googleapis_auth.dart';
import 'package:googleapis/people/v1.dart' as people;
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
Widget build(BuildContext context) {
return MaterialApp(
title: 'Google Sign In Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const GoogleSignInPage(),
);
}
}
class GoogleSignInPage extends StatefulWidget {
const GoogleSignInPage({Key? key}) : super(key: key);
State<GoogleSignInPage> createState() => _GoogleSignInPageState();
}
class _GoogleSignInPageState extends State<GoogleSignInPage> {
final GoogleSignIn _googleSignIn = GoogleSignIn(
scopes: <String>[
'email',
'https://www.googleapis.com/auth/people.readonly',
],
);
GoogleSignInAccount? _currentUser;
String _userInfo = '';
List<String> _contacts = [];
void initState() {
super.initState();
_googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount? account) {
setState(() {
_currentUser = account;
});
});
_googleSignIn.signInSilently();
}
Future<void> _handleSignIn() async {
try {
await _googleSignIn.signIn();
await _loadUserData();
} catch (error) {
print('Error signing in: $error');
setState(() {
_userInfo = 'Sign in failed: $error';
});
}
}
Future<void> _handleSignOut() async {
_googleSignIn.disconnect();
setState(() {
_userInfo = '';
_contacts = [];
});
}
Future<void> _loadUserData() async {
if (_currentUser == null) {
setState(() {
_userInfo = 'No user signed in';
});
return;
}
setState(() {
_userInfo = 'Loading user data...';
_contacts = [];
});
try {
// 获取认证客户端
final authClient = await _googleSignIn.authenticatedClient();
if (authClient != null) {
// 创建 People API 客户端
final peopleApi = people.PeopleApi(authClient);
// 获取用户信息
final userResponse = await peopleApi.people.get(
'people/me',
personFields: 'names,emailAddresses',
);
// 获取联系人信息
final contactsResponse = await peopleApi.people.connections.list(
'people/me',
personFields: 'names,emailAddresses',
);
// 处理用户信息
final names = userResponse.names;
final emails = userResponse.emailAddresses;
String info = '';
if (names != null && names.isNotEmpty) {
info += 'Name: ${names.first.displayName}\n';
}
if (emails != null && emails.isNotEmpty) {
info += 'Email: ${emails.first.value}\n';
}
// 处理联系人信息
final contacts = contactsResponse.connections;
final contactList = <String>[];
if (contacts != null) {
for (var contact in contacts) {
final contactNames = contact.names;
if (contactNames != null && contactNames.isNotEmpty) {
contactList.add(contactNames.first.displayName ?? 'Unknown');
}
}
}
setState(() {
_userInfo = info;
_contacts = contactList;
});
}
} catch (error) {
print('Error loading data: $error');
setState(() {
_userInfo = 'Failed to load data: $error';
});
}
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Google Sign In Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
_currentUser != null
? Column(
children: [
ListTile(
leading: GoogleUserCircleAvatar(
identity: _currentUser,
),
title: Text(_currentUser!.displayName ?? ''),
subtitle: Text(_currentUser!.email),
),
const SizedBox(height: 20),
Text(_userInfo),
const SizedBox(height: 20),
if (_contacts.isNotEmpty) ...[
const Text(
'Contacts:',
style: TextStyle(fontWeight: FontWeight.bold),
),
const SizedBox(height: 10),
SizedBox(
height: 200,
child: ListView.builder(
itemCount: _contacts.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_contacts[index]),
);
},
),
),
],
ElevatedButton(
onPressed: _handleSignOut,
child: const Text('Sign Out'),
),
],
)
: Column(
children: [
const Text('No user signed in.'),
ElevatedButton(
onPressed: _handleSignIn,
child: const Text('Sign In'),
),
],
),
],
),
),
);
}
}
注意事项
-
Google API 控制台配置:
- 需要在 Google API 控制台创建项目并启用所需的 API
- 配置 OAuth 客户端 ID,包括鸿蒙应用的包名和签名信息
-
作用域管理:
- 根据需要的 API 访问权限,配置正确的 OAuth 作用域
- 避免请求不必要的权限,保护用户隐私
-
错误处理:
- 实现完善的错误处理机制,特别是网络错误和认证错误
- 向用户提供清晰的错误信息
-
用户体验:
- 添加加载状态指示器,提高用户体验
- 实现静默登录,避免用户重复登录
-
鸿蒙平台适配:
- 确保 Google Sign In 在鸿蒙平台上正常工作
- 处理鸿蒙平台特有的权限和配置要求
-
安全性:
- 不要在代码中硬编码敏感信息
- 确保认证令牌的安全存储和传输
-
性能优化:
- 合理使用缓存,减少 API 调用次数
- 实现分页加载,处理大量数据
总结
extension_google_sign_in_as_googleapis_auth 是一个非常有用的 Flutter 包,它简化了在 Flutter 应用中使用 Google API 的过程,通过将 google_sign_in 插件和 googleapis 包连接起来,提供了一种便捷的方式来访问 Google 的各种 API。
在鸿蒙平台上使用这个包,可以为 Flutter 应用带来以下好处:
- 简化开发流程:减少了手动处理认证和 API 调用的样板代码
- 扩展应用功能:可以轻松集成 Google 的各种服务,如联系人、日历、驱动器等
- 提高代码质量:使用类型安全的 API 客户端,减少运行时错误
- 增强用户体验:提供便捷的 Google 登录和数据访问功能
通过本文的介绍,你应该已经了解了如何在鸿蒙平台上引入和使用 extension_google_sign_in_as_googleapis_auth 包,以及如何利用它来访问 Google API。无论是构建社交应用、 productivity 工具还是内容管理系统,这个包都能为你提供强大的 Google API 访问能力,帮助你构建功能丰富、用户友好的鸿蒙应用。
在实际开发中,建议仔细阅读 Google API 的文档,了解每个 API 的具体用法和限制,并根据应用的需求合理使用这些 API。同时,注意保护用户隐私和数据安全,确保应用符合相关的隐私政策和法规要求。
更多推荐


所有评论(0)