Flutter桌面端Firebase认证插件firebase_auth_desktop的使用

Flutter桌面端Firebase认证插件firebase_auth_desktop的使用

Firebase Auth for Flutter Desktop

pub package

该软件包是为Linux和Windows平台实现的FlutterFire。

注意: 此软件包覆盖了FlutterFire在macOS平台上的现有实现,用于开发目的。

开始使用

首先,请确保通过安装firebase_core来初始化Firebase。

  1. 在项目的根目录下运行以下命令:
dart pub add firebase_auth_desktop
  1. 导入它:
import 'package:firebase_auth_desktop/firebase_auth_desktop.dart';

使用方法

该软件包是firebase_auth的平台实现,您可以查看官方指南中的完整使用文档

桌面端电话认证

在桌面端,电话认证与Web类似。

  1. 调用signInWithPhoneNumber方法,这将触发一个reCAPTCHA网页视图在单独的窗口中进行验证。完成后,用户会收到短信验证码。
FirebaseAuth auth = FirebaseAuth.instance;

// 等待用户完成reCAPTCHA并接收短信验证码
ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456');
  1. 提示用户提供短信验证码,并确认它。
UserCredential userCredential = await confirmationResult.confirm('123456');

然而,目前有一个限制,用户接收到的短信包含您的应用名称,在Web上通常是您的认证域。但是,由于Firebase尚未完全支持桌面平台上的电话认证,当前实现会在消息中显示您的应用名称为127.0.0.1,即本地主机IP地址。

示例代码

以下是完整的示例代码,展示如何在Flutter桌面端使用firebase_auth_desktop插件。

// ignore_for_file: depend_on_referenced_packages, public_member_api_docs

import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:google_sign_in_dartio/google_sign_in_dartio.dart';
import 'package:yaru/yaru.dart';

import 'auth.dart';
import 'profile.dart';

FirebaseOptions get firebaseOptionsDefault {
  if (defaultTargetPlatform == TargetPlatform.macOS) {
    // 在macOS上使用iOS配置。
    return const FirebaseOptions(
      apiKey: 'AIzaSyAgUhHU8wSJgO5MVNy95tMT07NEjzMOfz0',
      authDomain: 'react-native-firebase-testing.firebaseapp.com',
      databaseURL: 'https://react-native-firebase-testing.firebaseio.com',
      projectId: 'react-native-firebase-testing',
      messagingSenderId: '448618578101',
      appId: '1:448618578101:web:0b650370bb29e29cac3efc',
      measurementId: 'G-F79DJ0VFGS',
    );
  } else {
    // 在Linux、Windows和Web上使用Web配置。
    return const FirebaseOptions(
      apiKey: 'AIzaSyAgUhHU8wSJgO5MVNy95tMT07NEjzMOfz0',
      authDomain: 'react-native-firebase-testing.firebaseapp.com',
      databaseURL: 'https://react-native-firebase-testing.firebaseio.com',
      projectId: 'react-native-firebase-testing',
      messagingSenderId: '448618578101',
      appId: '1:448618578101:web:0b650370bb29e29cac3efc',
      measurementId: 'G-F79DJ0VFGS',
    );
  }
}

// 需要确保Firebase Auth模拟器正在本地运行,例如通过`melos run firebase:emulator`。
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp(options: firebaseOptionsDefault);

  await FirebaseAuth.instance.useAuthEmulator('localhost', 9099);

  await GoogleSignInDart.register(
    clientId: '448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com',
  );

  runApp(const AuthExampleApp());
}

/// 应用程序的入口点。
///
/// 返回一个[MaterialApp]。
class AuthExampleApp extends StatelessWidget {
  const AuthExampleApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Firebase Example App',
      darkTheme: yaruDark,
      theme: yaruLight,
      home: Scaffold(
        body: LayoutBuilder(
          builder: (context, constraints) {
            return Row(
              children: [
                Visibility(
                  visible: constraints.maxWidth >= 1200,
                  child: Expanded(
                    child: Container(
                      height: double.infinity,
                      color: Theme.of(context).colorScheme.primary,
                      child: Center(
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: [
                            Text(
                              'Firebase Auth Desktop',
                              style: Theme.of(context).textTheme.headline4,
                            ),
                          ],
                        ),
                      ),
                    ),
                  ),
                ),
                Expanded(
                  child: StreamBuilder<User?>(
                    stream: FirebaseAuth.instance.authStateChanges(),
                    builder: (context, snapshot) {
                      if (snapshot.hasData) {
                        return const ProfilePage();
                      }
                      return const AuthGate();
                    },
                  ),
                ),
              ],
            );
          },
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter桌面端应用中使用firebase_auth_desktop插件进行Firebase认证的示例代码。这个示例将展示如何进行基本的用户注册和登录。

首先,确保你已经在你的Flutter项目中添加了firebase_authfirebase_auth_desktop依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^1.10.0 # 或者最新版本
  firebase_auth: ^3.3.3 # 或者最新版本
  firebase_auth_desktop: ^0.2.0+3 # 或者最新版本,注意这个插件通常与firebase_auth一起使用

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

接下来,你需要在你的Firebase项目中配置应用以支持桌面端。这通常涉及到下载并配置Google服务文件(如GoogleService-Info.plist对于macOS和google-services.json对于Windows/Linux),并确保在Firebase控制台中启用了相应的认证方法(如Email/Password)。

以下是Flutter桌面端应用中使用firebase_auth_desktop进行Firebase认证的示例代码:

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

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

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

class AuthScreen extends StatefulWidget {
  @override
  _AuthScreenState createState() => _AuthScreenState();
}

class _AuthScreenState extends State<AuthScreen> {
  final FirebaseAuth _auth = FirebaseAuth.instance;
  String _email = '';
  String _password = '';
  String _message = '';

  void _signUp() async {
    try {
      UserCredential result = await _auth.createUserWithEmailAndPassword(
        email: _email,
        password: _password,
      );
      User? user = result.user;
      setState(() {
        _message = '注册成功: ${user?.email}';
      });
    } catch (e) {
      setState(() {
        _message = e.message ?? '注册失败';
      });
    }
  }

  void _signIn() async {
    try {
      UserCredential result = await _auth.signInWithEmailAndPassword(
        email: _email,
        password: _password,
      );
      User? user = result.user;
      setState(() {
        _message = '登录成功: ${user?.email}';
      });
    } catch (e) {
      setState(() {
        _message = e.message ?? '登录失败';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Firebase Auth Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              keyboardType: TextInputType.emailAddress,
              decoration: InputDecoration(labelText: 'Email'),
              onChanged: (value) {
                _email = value;
              },
            ),
            SizedBox(height: 16),
            TextField(
              obscureText: true,
              decoration: InputDecoration(labelText: 'Password'),
              onChanged: (value) {
                _password = value;
              },
            ),
            SizedBox(height: 24),
            ElevatedButton(
              onPressed: _signUp,
              child: Text('注册'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: _signIn,
              child: Text('登录'),
            ),
            SizedBox(height: 24),
            Text(
              _message,
              style: TextStyle(fontSize: 18, color: Colors.red),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,包含两个按钮用于用户注册和登录。我们使用FirebaseAuth.instance来访问Firebase认证服务,并通过createUserWithEmailAndPasswordsignInWithEmailAndPassword方法处理注册和登录逻辑。

请注意,这个示例代码假设你已经在Firebase控制台中正确配置了Email/Password认证方法,并且你的Flutter项目已经正确配置了Firebase。如果你遇到任何问题,请确保检查Firebase配置和依赖版本。

回到顶部