插件介绍

extension_google_sign_in_as_googleapis_auth 是一个连接 Flutter 的 google_sign_in 插件和 Dart 的 googleapis 包的桥梁包。它能够直接从 GoogleSignIn 插件创建类似 googleapis_authAuthClient 实例,使得开发者可以更方便地在 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'),
                      ),
                    ],
                  ),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. Google API 控制台配置

    • 需要在 Google API 控制台创建项目并启用所需的 API
    • 配置 OAuth 客户端 ID,包括鸿蒙应用的包名和签名信息
  2. 作用域管理

    • 根据需要的 API 访问权限,配置正确的 OAuth 作用域
    • 避免请求不必要的权限,保护用户隐私
  3. 错误处理

    • 实现完善的错误处理机制,特别是网络错误和认证错误
    • 向用户提供清晰的错误信息
  4. 用户体验

    • 添加加载状态指示器,提高用户体验
    • 实现静默登录,避免用户重复登录
  5. 鸿蒙平台适配

    • 确保 Google Sign In 在鸿蒙平台上正常工作
    • 处理鸿蒙平台特有的权限和配置要求
  6. 安全性

    • 不要在代码中硬编码敏感信息
    • 确保认证令牌的安全存储和传输
  7. 性能优化

    • 合理使用缓存,减少 API 调用次数
    • 实现分页加载,处理大量数据

总结

extension_google_sign_in_as_googleapis_auth 是一个非常有用的 Flutter 包,它简化了在 Flutter 应用中使用 Google API 的过程,通过将 google_sign_in 插件和 googleapis 包连接起来,提供了一种便捷的方式来访问 Google 的各种 API。

在鸿蒙平台上使用这个包,可以为 Flutter 应用带来以下好处:

  1. 简化开发流程:减少了手动处理认证和 API 调用的样板代码
  2. 扩展应用功能:可以轻松集成 Google 的各种服务,如联系人、日历、驱动器等
  3. 提高代码质量:使用类型安全的 API 客户端,减少运行时错误
  4. 增强用户体验:提供便捷的 Google 登录和数据访问功能

通过本文的介绍,你应该已经了解了如何在鸿蒙平台上引入和使用 extension_google_sign_in_as_googleapis_auth 包,以及如何利用它来访问 Google API。无论是构建社交应用、 productivity 工具还是内容管理系统,这个包都能为你提供强大的 Google API 访问能力,帮助你构建功能丰富、用户友好的鸿蒙应用。

在实际开发中,建议仔细阅读 Google API 的文档,了解每个 API 的具体用法和限制,并根据应用的需求合理使用这些 API。同时,注意保护用户隐私和数据安全,确保应用符合相关的隐私政策和法规要求。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐