Flutter Firebase UI集成插件firebase_ui的使用

Firebase UI 在 Flutter 中的使用

Firebase UI 概述

截图

截图

firebase_ui 是一个帮助快速实现 Firebase 认证的库。它提供了常见的身份提供商(如 Facebook、Google、Twitter 和电子邮件)的用户界面。

注意:此插件使用 firebase_auth,您必须按照 这里 的说明进行配置。

您可以查看 firebase_ui 示例


使用步骤

1. 添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  firebase_auth: ^3.3.0
  firebase_ui: ^0.1.0

运行 flutter pub get 来安装依赖。


2. 配置 Firebase

确保您已经在 Firebase 控制台中正确配置了您的项目,并添加了 Android 和 iOS 平台。具体步骤可以参考官方文档 这里


3. 创建示例应用

以下是一个完整的示例代码,展示如何使用 firebase_ui 实现登录和注销功能。

示例代码

import 'dart:async';

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:firebase_ui/flutter_firebase_ui.dart';
import 'package:firebase_ui/l10n/localization.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Firebase UI Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        FFULocalizations.delegate, // Firebase UI 提供的本地化支持
      ],
      supportedLocales: [
        const Locale('fr', 'FR'),
        const Locale('en', 'US'),
        const Locale('de', 'DE'),
        const Locale('pt', 'BR'),
        const Locale('es', 'MX'),
      ],
      home: MyHomePage(title: 'Flutter Firebase UI Demo'),
    );
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  final FirebaseAuth _auth = FirebaseAuth.instance;
  StreamSubscription<FirebaseUser> _listener;

  FirebaseUser _currentUser;

  [@override](/user/override)
  void initState() {
    super.initState();
    _checkCurrentUser();
  }

  [@override](/user/override)
  void dispose() {
    _listener.cancel();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    if (_currentUser == null) {
      return SignInScreen(
        title: "Demo",
        header: Padding(
          padding: const EdgeInsets.symmetric(vertical: 16.0),
          child: Padding(
            padding: const EdgeInsets.all(16.0),
            child: Text("Demo"),
          ),
        ),
        showBar: true,
        horizontalPadding: 12,
        bottomPadding: 5,
        avoidBottomInset: true,
        color: Color(0xFF363636),
        providers: [
          ProvidersTypes.google,
          ProvidersTypes.facebook,
          ProvidersTypes.twitter,
          ProvidersTypes.email
        ],
        twitterConsumerKey: "",
        twitterConsumerSecret: "",
      );
    } else {
      return HomeScreen(user: _currentUser);
    }
  }

  void _checkCurrentUser() async {
    _currentUser = await _auth.currentUser();
    _currentUser?.getIdToken(refresh: true);

    _listener = _auth.onAuthStateChanged.listen((FirebaseUser user) {
      setState(() {
        _currentUser = user;
      });
    });
  }
}

class HomeScreen extends StatelessWidget {
  final FirebaseUser user;

  HomeScreen({this.user});

  [@override](/user/override)
  Widget build(BuildContext context) => Scaffold(
        appBar: AppBar(
          title: Text("Bienvenue"),
          elevation: 4.0,
        ),
        body: Container(
          padding: const EdgeInsets.all(16.0),
          decoration: BoxDecoration(color: Colors.amber),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text("Welcome,"),
                ],
              ),
              SizedBox(height: 8.0),
              Text(user.displayName ?? user.email),
              SizedBox(height: 32.0),
              RaisedButton(
                child: Text("Déconnexion"),
                onPressed: _logout,
              )
            ],
          ),
        ),
      );

  void _logout() {
    signOutProviders(); // 调用 Firebase UI 提供的登出方法
  }
}

更多关于Flutter Firebase UI集成插件firebase_ui的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Firebase UI集成插件firebase_ui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


firebase_ui 是一个 Flutter 插件,旨在简化与 Firebase 的集成,特别是与 Firebase Authentication 和 Firestore 的集成。它提供了一组预构建的 UI 组件,可以帮助你快速实现用户认证、数据展示等功能。

以下是如何使用 firebase_ui 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 firebase_uifirebase_core 依赖:

dependencies:
  flutter:
    sdk: flutter
  firebase_core: latest_version
  firebase_ui_auth: latest_version
  firebase_ui_firestore: latest_version

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

2. 初始化 Firebase

在你的 main.dart 文件中初始化 Firebase:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Firebase UI Example',
      home: HomeScreen(),
    );
  }
}

3. 使用 Firebase UI 进行用户认证

firebase_ui_auth 提供了预构建的登录和注册界面。你可以使用 SignInScreenRegisterScreen 来快速实现用户认证。

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

class HomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Firebase UI Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => SignInScreen(
                  providers: [EmailAuthProvider()],
                  actions: [
                    AuthStateChangeAction<SignedIn>((context, state) {
                      Navigator.pushReplacementNamed(context, '/profile');
                    }),
                  ],
                ),
              ),
            );
          },
          child: Text('Sign In'),
        ),
      ),
    );
  }
}

4. 使用 Firebase UI 展示 Firestore 数据

firebase_ui_firestore 提供了 FirestoreListViewFirestoreGridView 等组件,用于展示 Firestore 数据。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_ui_firestore/firebase_ui_firestore.dart';
import 'package:flutter/material.dart';

class ProfileScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Profile'),
      ),
      body: FirestoreListView<Map<String, dynamic>>(
        query: FirebaseFirestore.instance.collection('users'),
        itemBuilder: (context, snapshot) {
          final user = snapshot.data();
          return ListTile(
            title: Text(user['name']),
            subtitle: Text(user['email']),
          );
        },
      ),
    );
  }
}

5. 处理认证状态

你可以使用 AuthStateListener 来监听用户的认证状态,并根据状态跳转到不同的页面。

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

class AuthWrapper extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return AuthStateListener(
      listener: (oldState, newState, context) {
        if (newState is SignedIn) {
          Navigator.pushReplacementNamed(context, '/profile');
        } else if (newState is SignedOut) {
          Navigator.pushReplacementNamed(context, '/signin');
        }
      },
      child: HomeScreen(),
    );
  }
}

6. 配置路由

最后,你可以在 MaterialApp 中配置路由,以便在不同的认证状态之间切换。

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Firebase UI Example',
      initialRoute: '/',
      routes: {
        '/': (context) => AuthWrapper(),
        '/signin': (context) => SignInScreen(
              providers: [EmailAuthProvider()],
            ),
        '/profile': (context) => ProfileScreen(),
      },
    );
  }
}
回到顶部