Flutter认证界面插件flutter_auth_ui的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter认证界面插件flutter_auth_ui的使用

flutter_auth_ui 是一个非官方的 FirebaseUI 包,旨在为 Flutter 提供对 Android、iOS 和 Web 的支持。它允许用户通过电子邮件、电话号码、Google 账户等进行登录。

开始使用

该插件是基于 Android/iOS/Web 原生插件封装的。在使用之前,请确保已经按照文档设置了您的 Firebase 项目:

使用方法

下面是一个完整的示例代码,展示了如何使用 flutter_auth_ui 插件来创建一个包含多种登录方式的应用程序:

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

import 'firebase_options.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.light().copyWith(
        materialTapTargetSize: MaterialTapTargetSize.padded,
      ),
      home: const MyPage(),
    );
  }
}

class MyPage extends StatelessWidget {
  const MyPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Plugin example app'),
      ),
      body: Center(
        child: Column(
          children: [
            FilledButton(
              onPressed: () async {
                final messenger = ScaffoldMessenger.of(context);

                final providers = [
                  AuthUiProvider.anonymous,
                  AuthUiProvider.email,
                  AuthUiProvider.phone,
                  AuthUiProvider.apple,
                  AuthUiProvider.github,
                  AuthUiProvider.google,
                  AuthUiProvider.microsoft,
                  AuthUiProvider.yahoo,
                ];

                final result = await FlutterAuthUi.startUi(
                  items: providers,
                  tosAndPrivacyPolicy: const TosAndPrivacyPolicy(
                    tosUrl: "https://www.google.com",
                    privacyPolicyUrl: "https://www.google.com",
                  ),
                  androidOption: const AndroidOption(
                    enableSmartLock: false, // default true
                    showLogo: true, // default false
                    overrideTheme: true, // default false
                  ),
                  emailAuthOption: const EmailAuthOption(
                    requireDisplayName: true, // default true
                    enableMailLink: false, // default false
                    handleURL: '',
                    androidPackageName: '',
                    androidMinimumVersion: '',
                  ),
                );

                messenger.showSnackBar(
                  SnackBar(
                    content: Text(
                      result ? 'Success sign-in' : 'Failed sign-in',
                    ),
                  ),
                );
              },
              child: const Text('Sign in'),
            ),
            FilledButton.tonal(
              onPressed: () async {
                final messenger = ScaffoldMessenger.of(context);
                await FlutterAuthUi.signOut();
                messenger.showSnackBar(
                  const SnackBar(
                    content: Text('Success sign-out'),
                  ),
                );
              },
              child: const Text('Sign out'),
            ),
            OutlinedButton(
              onPressed: () async {
                final user = FirebaseAuth.instance.currentUser;
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(
                    content: Text(
                      user == null
                          ? 'No user is signed in'
                          : '${user.uid} is signed in',
                    ),
                  ),
                );
              },
              child: const Text('Check sign-in status'),
            ),
          ],
        ),
      ),
    );
  }
}

需求

  • Flutter 3.13.0 或更高版本
  • firebase_auth 5.0.0 或更高版本

Android 特定需求

  • minSdkVersion 21
  • compileSdkVersion 34

iOS 特定需求

  • iOS 13 或更高版本

相关链接

小贴士

EmailLink

为了实现 EmailLink 登录,您需要提前准备;请先查阅 Firebase 文档

Android

要处理动态链接,在 onCreateonNewIntent 方法中添加 FlutterAuthUiPlugin.catchEmailLink(如果您不使用 EmailLink,则不需要添加)。

import android.content.Intent;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.dr1009.app.flutter_auth_ui.FlutterAuthUiPlugin;

import io.flutter.embedding.android.FlutterActivity;

public class MainActivity extends FlutterActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 检查 intent
        FlutterAuthUiPlugin.catchEmailLink(this, getIntent());
    }

    @Override
    protected void onNewIntent(@NonNull Intent intent) {
        super.onNewIntent(intent);

        // 检查 intent
        FlutterAuthUiPlugin.catchEmailLink(this, intent);
    }
}

国际化

Android

无需特殊设置即可支持。

iOS

请参考 更新 iOS 应用包

Web

请参考 安装选项 1:CDN - 国际化小部件

更改 Android 上的 AppBar 标题

将字符串值作为 app_namefui_default_toolbar_title 添加到应用程序的 strings.xml 文件中。行为取决于 FirebaseUI-Android

显示 Logo (Android)

  1. 将您的 Logo 资源文件添加到 android/app/src/main/res/drawable/flutter_auth_ui_logo.xmlandroid/app/src/main/res/drawable-{m~xxxhdpi}/flutter_auth_ui_logo.png
  2. 启用 AndroidOption.showLogo

更改 AppBar 和链接颜色 (Android)

  1. android/app/src/main/res/values/style.xml 中添加 flutter_auth_ui_style 样式。
  2. 启用 AndroidOption.overrideTheme

希望这些信息能帮助您更好地理解和使用 flutter_auth_ui 插件!如果有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter认证界面插件flutter_auth_ui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter认证界面插件flutter_auth_ui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 flutter_auth_ui 插件来创建认证界面的示例代码。这个插件可以简化实现登录和注册界面的过程。以下是一个基本的实现示例,展示如何使用 flutter_auth_ui 来实现用户认证界面。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_auth_ui: ^latest_version  # 请替换为最新版本号

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

接下来,你可以在你的 Flutter 应用中使用 flutter_auth_ui 来创建认证界面。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:flutter_auth_ui/flutter_auth_ui.dart';
import 'package:firebase_auth/firebase_auth.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Auth UI Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AuthScreen(),
    );
  }
}

class AuthScreen extends StatelessWidget {
  final FirebaseAuth _auth = FirebaseAuth.instance;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Authentication'),
      ),
      body: AuthUI(
        // 配置 Firebase 认证服务
        firebaseAuth: _auth,

        // 配置 UI
        signInOptions: [
          EmailSignInOption(),
          PhoneSignInOption(
            // 配置电话认证选项
            phoneNumberVerifierBuilderFactory: () => PhoneAuthProvider.verifierBuilderFactory,
          ),
          // 你可以添加更多认证选项,如 GoogleSignInOption(), AppleSignInOption() 等
        ],

        // 配置主题
        theme: AuthThemeData(
          // 自定义主题
          backgroundColor: Colors.white,
          primaryColor: Colors.blue,
          textStyle: TextStyle(fontSize: 18),
        ),

        // 自定义动作按钮
        actions: [
          AuthActionWidget(
            icon: Icons.password,
            title: 'Forgot Password?',
            onPressed: () {
              // 处理忘记密码逻辑
              ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Forgot password functionality not implemented')));
            },
          ),
        ],

        // 自定义完成后路由
        onAuthenticated: (credential) {
          // 用户认证成功后的逻辑
          return MaterialPageRoute(builder: (context) => HomeScreen());
        },
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Screen'),
      ),
      body: Center(
        child: Text('Welcome to the Home Screen!'),
      ),
    );
  }
}

说明:

  1. 依赖配置:确保在 pubspec.yaml 中添加了 flutter_auth_uifirebase_auth 依赖。
  2. Firebase Auth 实例:在 AuthScreen 中创建了一个 FirebaseAuth 实例。
  3. AuthUI 配置
    • signInOptions:配置支持的登录选项,这里示例中使用了 Email 和 Phone 认证。
    • theme:自定义认证界面的主题。
    • actions:添加自定义动作按钮,例如“忘记密码”。
    • onAuthenticated:用户认证成功后的回调,这里示例中导航到 HomeScreen
  4. 导航到首页:认证成功后,导航到一个简单的 HomeScreen

请确保你已经正确配置了 Firebase 项目,并在你的应用中初始化了 Firebase。这个示例代码提供了一个基本的认证界面实现,你可以根据需要进行进一步的自定义和扩展。

回到顶部