Flutter简化登录流程插件lazy_sign_in_extension的使用

Flutter简化登录流程插件lazy_sign_in_extension的使用

支持浏览器

lazy_sign_in_extension 自动检测浏览器并相应地使用API。

浏览器 身份API
Chrome chrome.identity
Firefox browser.identity
Orion browser.identity

安装

flutter pub add lazy_sign_in_extension

使用

import 'package:lazy_sign_in_extension/lazy_sign_in_extension.dart' as lazy;

const String clientId = '你的Google OAuth客户端ID';
final lazy.SignInBase globalLazySignIn = lazy.SignInExt(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'),
);
Web/App

使用lazy_sign_in_google

import 'package:lazy_sign_in_google/lazy_sign_in_google.dart' as lazy;
final lazy.SignIn globalLazySignIn = lazy.SignInGoogle(clientId: clientId);

示例

你需要提供自己的clientId

import 'package:flutter/material.dart';

// 为Chrome/Firefox扩展取消注释
import 'package:lazy_sign_in_extension/lazy_sign_in_extension.dart' as lazy;

// 为Chrome扩展取消注释
final globalLazySignIn = lazy.SignInExtChrome(clientId: clientId);

// 为Firefox扩展取消注释
// final globalLazySignIn = lazy.SignInExtMoz(clientId: clientId);

// // 为Web/App取消注释
// 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应用**客户端ID。
///   - 更新OAuth凭证应用程序ID为扩展ID。
/// - Firefox 扩展
///   - 使用Google OAuth **Web应用**客户端ID。
///   - 更新OAuth凭证授权重定向URI。
///     这可以通过[redirectUrl]获得。
/// - Web
///   - 使用Google OAuth **Web应用**客户端ID。
///   - 更新OAuth凭证授权JavaScript源。
/// - 独立App
///   - 使用Google OAuth **Chrome应用**客户端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,
      theme: ThemeData(
        primarySwatch: Colors.orange,
      ),
      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: [
            buttonSignIn,
            buttonSignOut,
            avatar(),
          ],
        ),
      ),
    );
  }

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

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

1 回复

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


当然,以下是如何在Flutter项目中使用lazy_sign_in_extension插件来简化登录流程的示例代码。lazy_sign_in_extension通常与Firebase Authentication结合使用,用于管理用户的登录状态。

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

dependencies:
  flutter:
    sdk: flutter
  firebase_auth: ^x.y.z  # 使用最新版本
  firebase_core: ^x.y.z  # 使用最新版本
  lazy_sign_in: ^x.y.z   # 使用最新版本
  lazy_sign_in_extension: ^x.y.z  # 使用最新版本

然后,运行flutter pub get来获取这些依赖项。

接下来,设置Firebase项目,并获取必要的配置信息(如google-services.json文件),这些步骤通常在你的Firebase控制台中完成。

以下是一个完整的示例代码,展示了如何使用lazy_sign_in_extension来简化登录流程:

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:lazy_sign_in/lazy_sign_in.dart';
import 'package:lazy_sign_in_extension/lazy_sign_in_extension.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化Firebase应用
  await Firebase.initializeApp();

  // 配置LazySignIn
  final lazySignIn = LazySignIn.instance;
  lazySignIn.configure(
    authProvider: FirebaseAuthProvider(), // 使用FirebaseAuth作为认证提供者
    onSignedIn: (User user) {
      // 用户登录后的回调
      print('User signed in: ${user.email}');
    },
    onSignedOut: () {
      // 用户登出后的回调
      print('User signed out');
    },
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Lazy Sign In Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  // 触发登录流程
                  await LazySignIn.instance.signIn();
                },
                child: Text('Sign In'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  // 触发登出流程
                  await LazySignIn.instance.signOut();
                },
                child: Text('Sign Out'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

// FirebaseAuthProvider 类实现,用于与Firebase Authentication集成
class FirebaseAuthProvider implements AuthProvider {
  @override
  Future<User?> signIn({required BuildContext context}) async {
    // 在这里实现Firebase的登录逻辑,例如显示登录UI
    // 这里只是简单返回一个null表示登录流程需要用户交互
    // 实际项目中,你可能需要调用FirebaseAuth的signInWithEmailAndPassword等方法
    // 并处理结果
    return null;
  }

  @override
  Future<void> signOut() async {
    // 调用FirebaseAuth的signOut方法
    await FirebaseAuth.instance.signOut();
  }

  @override
  User? getCurrentUser() {
    // 获取当前登录用户
    return FirebaseAuth.instance.currentUser;
  }
}

请注意,上述代码中的FirebaseAuthProvider类实现了AuthProvider接口,但signIn方法仅返回null,因为在大多数实际应用中,登录UI(如电子邮件/密码登录、Google登录等)需要用户交互。因此,你可能需要根据自己的需求实现具体的登录逻辑。

此外,lazy_sign_in_extension插件可能包含一些额外的功能或配置选项,建议查阅其官方文档以获取更多详细信息和高级用法。

回到顶部