Flutter谷歌登录简化插件lazy_sign_in_google的使用

Flutter谷歌登录简化插件lazy_sign_in_google的使用

google_sign_in 封装在 lazy_sign_in 接口中。

功能特性

类名 文件 描述
[lazy.SignInGoogle] lazy_sign_in_google.dart 支持在网页或应用中进行Google登录。这是对package:google_sign_in的封装

安装

flutter pub add lazy_sign_in_google

使用方法

网页/应用

对于网页,提供Google OAuth Web Application客户端ID。

对于独立应用,提供Google OAuth Chrome Application客户端ID。

import 'package:lazy_sign_in_google/lazy_sign_in_google.dart' as lazy;
const String clientId = '你的Google Chrome/Web应用客户端ID';
final lazy.SignInBase globalLazySignIn = lazy.SignInGoogle(clientId: clientId);

统一接口/API

Widget buttonSignIn = TextButton(
  onPressed: () => globalLazySignIn.signIn(),
  child: const Text('Sign-In'),
);

Widget buttonSignOut = TextButton(
  onPressed: () => globalLazySignIn.signOut(),
  child: const Text('Sign-Out'),
);

Chrome/Firefox扩展

请参阅 lazy_sign_in_extension

示例

示例文件夹

完整仓库

https://github.com/J-Siu/flutter_lazy/example/lazy_sign_in_example/

你将需要根据实际情况提供自己的clientId

示例代码

import 'package:flutter/material.dart';

// 这里只是一个占位符
import 'package:lazy_sign_in/lazy_sign_in.dart' as lazy;

final lazy.SignIn globalLazySignIn = lazy.SignInDummy(clientId: clientId);

// // 解除注释以使用Chrome/Firefox扩展
// import 'package:lazy_sign_in_extension/lazy_sign_in_extension.dart' as lazy;
// final lazy.SignIn globalLazySignIn = lazy.SignInExt(clientId: clientId);

// // 解除注释以用于Web/应用
// import 'package:lazy_sign_in_google/lazy_sign_in_google.dart' as lazy;
// final lazy.SignIn globalLazySignIn = lazy.SignInGoogle(clientId: clientId);

/// - Chrome扩展
///   - 使用Google OAuth **Chrome Application**客户端ID。
///   - 更新OAuth凭证应用程序ID与扩展ID
/// - Firefox扩展
///   - 使用Google OAuth **Web Application**客户端ID。
///   - 更新OAuth凭证授权重定向URI
///     可通过[redirectUrl]获得
/// - Web
///   - 使用Google OAuth **Web Application**客户端ID。
///   - 更新OAuth凭证授权JavaScript源
/// - 独立应用
///   - 使用Google OAuth **Chrome Application**客户端ID。
///   - 更新OAuth凭证应用程序ID
const String clientId = '你的Google OAuth客户端ID';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
  final String title = 'LazySignIn 示例';
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: title,
      home: MyHomePage(title: title),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _photoUrl = '';

  [@override](/user/override)
  void initState() {
    super.initState();
    globalLazySignIn.isSignedIn.addListener(() => _signInHandler());
  }

  [@override](/user/override)
  void dispose() {
    globalLazySignIn.isSignedIn.removeListener(() => _signInHandler());
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    Widget avatar() {
      if (_photoUrl.isNotEmpty) {
        return SizedBox(
          height: 60,
          width: 60,
          child: Image.network(_photoUrl),
        );
      } else {
        return const SizedBox();
      }
    }

    Widget buttonSignIn = TextButton(
      onPressed: () => globalLazySignIn.signIn(),
      child: const Text('Sign-In'),
    );
    Widget buttonSignOut = TextButton(
      onPressed: () => globalLazySignIn.signOut(),
      child: const Text('Sign-Out'),
    );

    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            buttonSignIn,
            buttonSignOut,
            avatar(),
          ],
        ),
      ),
    );
  }

  // 当令牌发生变化时触发此方法
  _signInHandler() {
    setState(() {
      _photoUrl = globalLazySignIn.photoUrl;
    });
  }
}

更多关于Flutter谷歌登录简化插件lazy_sign_in_google的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter谷歌登录简化插件lazy_sign_in_google的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用lazy_sign_in_google插件来实现谷歌登录的一个简化示例。

首先,确保你已经在pubspec.yaml文件中添加了lazy_sign_in_google依赖:

dependencies:
  flutter:
    sdk: flutter
  lazy_sign_in_google: ^最新版本号  # 请替换为当前最新版本号

然后,运行flutter pub get来安装依赖。

接下来,按照以下步骤配置和实现谷歌登录功能:

1. 配置Google Sign-In

在Google Cloud Console中创建一个新的项目,并启用Google Sign-In API。然后,创建一个OAuth 2.0客户端ID,选择“Web应用”类型(Flutter应用实际上会使用这个配置)。记录下生成的CLIENT_ID

2. 在android/app/src/main/AndroidManifest.xml中添加必要的权限和配置

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <!-- 添加Internet权限 -->
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        ... >
        <!-- 添加Google Sign-In配置 -->
        <meta-data
            android:name="com.google.android.gms.client.application_id"
            android:value="@string/default_web_client_id"/>
        
        <!-- 其他配置 -->
    </application>
</manifest>

android/app/src/main/res/values/strings.xml中添加:

<resources>
    <string name="default_web_client_id">你的CLIENT_ID</string>
</resources>

3. 在ios/Runner/Info.plist中添加URL Scheme

添加以下内容,替换REVERSED_CLIENT_ID为你的CLIENT_ID的反向域名部分(例如,如果你的CLIENT_ID是1234567890-abcdefghijklmnopqrstuvwxyz.apps.googleusercontent.com,那么REVERSED_CLIENT_ID就是com.googleusercontent.apps.1234567890-abcdefghijklmnopqrstuvwxyz):

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>你的REVERSED_CLIENT_ID</string>
        </array>
    </dict>
</array>
<key>GoogleService-Info.plist</key>
<dict>
    <key>CONFIGURED</key>
    <true/>
</dict>

并确保你已经将下载的GoogleService-Info.plist文件添加到ios/Runner目录中。

4. 实现谷歌登录功能

在你的Flutter代码中,你可以这样使用lazy_sign_in_google插件:

import 'package:flutter/material.dart';
import 'package:lazy_sign_in_google/lazy_sign_in_google.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: GoogleSignInPage(),
    );
  }
}

class GoogleSignInPage extends StatefulWidget {
  @override
  _GoogleSignInPageState createState() => _GoogleSignInPageState();
}

class _GoogleSignInPageState extends State<GoogleSignInPage> {
  final LazySignInGoogle _lazySignInGoogle = LazySignInGoogle();
  bool isSignedIn = false;
  String? userEmail;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Sign In Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            if (!isSignedIn)
              ElevatedButton(
                onPressed: () async {
                  try {
                    final result = await _lazySignInGoogle.signIn();
                    if (result != null) {
                      setState(() {
                        isSignedIn = true;
                        userEmail = result.email;
                      });
                    }
                  } catch (e) {
                    print('Error signing in: $e');
                  }
                },
                child: Text('Sign In with Google'),
              ),
            if (isSignedIn)
              Text('Signed in as: $userEmail'),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮用于触发谷歌登录流程。一旦用户成功登录,应用会显示用户的电子邮件地址。

请注意,这只是一个基础示例,实际项目中可能需要处理更多的错误情况、用户数据的管理、UI的定制等。

回到顶部