Firebase 統合
Firebase は Google が提供するモバイルおよび Web アプリ開発プラットフォームです。このセクションでは、Flutter に Firebase を統合する方法を紹介します。
Firebase 概要
Firebase は、認証、データベース、ストレージ、分析など、さまざまなバックエンドサービスを提供します。
| サービス | 説明 |
|---|---|
| Firebase Auth | ユーザー認証 |
| Cloud Firestore | クラウド NoSQL データベース |
| Realtime Database | リアルタイムデータベース |
| Cloud Storage | クラウドファイルストレージ |
| Firebase Analytics | アプリデータ分析 |
| Cloud Functions | クラウドサーバーレス関数 |
インストールと設定
依存関係の追加
dependencies: firebase_core: ^2.0.0 firebase_auth: ^4.0.0 cloud_firestore: ^4.0.0
Firebase 初期化
例:Firebase の初期化
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Firebase を初期化
await Firebase.initializeApp();
runApp(const MyApp());
}
import 'package:flutter/material.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Firebase を初期化
await Firebase.initializeApp();
runApp(const MyApp());
}
Firebase Auth - ユーザー認証
例:メールアドレスとパスワードでのログイン
import 'package:firebase_auth/firebase_auth.dart';
class AuthService {
final FirebaseAuth _auth = FirebaseAuth.instance;
// 登録
Future<User?> registerWithEmail(String email, String password) async {
try {
final credential = await _auth.createUserWithEmailAndPassword(
email: email,
password: password,
);
return credential.user;
} on FirebaseAuthException catch (e) {
print('登録失敗: ${e.message}');
return null;
}
}
// ログイン
Future<User?> signInWithEmail(String email, String password) async {
try {
final credential = await _auth.signInWithEmailAndPassword(
email: email,
password: password,
);
return credential.user;
} on FirebaseAuthException catch (e) {
print('ログイン失敗: ${e.message}');
return null;
}
}
// ログアウト
Future<void> signOut() async {
await _auth.signOut();
}
// ログイン状態の監視
Stream<User?> get authStateChanges {
return _auth.authStateChanges();
}
}
class AuthService {
final FirebaseAuth _auth = FirebaseAuth.instance;
// 登録
Future<User?> registerWithEmail(String email, String password) async {
try {
final credential = await _auth.createUserWithEmailAndPassword(
email: email,
password: password,
);
return credential.user;
} on FirebaseAuthException catch (e) {
print('登録失敗: ${e.message}');
return null;
}
}
// ログイン
Future<User?> signInWithEmail(String email, String password) async {
try {
final credential = await _auth.signInWithEmailAndPassword(
email: email,
password: password,
);
return credential.user;
} on FirebaseAuthException catch (e) {
print('ログイン失敗: ${e.message}');
return null;
}
}
// ログアウト
Future<void> signOut() async {
await _auth.signOut();
}
// ログイン状態の監視
Stream<User?> get authStateChanges {
return _auth.authStateChanges();
}
}
Cloud Firestore - データベース
例:Firestore 基本操作
import 'package:cloud_firestore/cloud_firestore.dart';
class FirestoreService {
final FirebaseFirestore _db = FirebaseFirestore.instance;
// ドキュメントを追加
Future<void> addUser(Map<String, dynamic> user) async {
await _db.collection('users').add(user);
// または ID を指定
// await _db.collection('users').doc('user_id').set(user);
}
// 単一ドキュメントを取得
Future<Map<String, dynamic>?> getUser(String id) async {
final doc = await _db.collection('users').doc(id).get();
return doc.data();
}
// コレクションの全ドキュメントを取得
Future<List<Map<String, dynamic>>> getUsers() async {
final snapshot = await _db.collection('users').get();
return snapshot.docs.map((doc) => doc.data()).toList();
}
// 条件クエリ
Future<List<Map<String, dynamic>>> getUsersByAge(int age) async {
final snapshot = await _db
.collection('users')
.where('age', isGreaterThanOrEqualTo: age)
.get();
return snapshot.docs.map((doc) => doc.data()).toList();
}
// ドキュメントを更新
Future<void> updateUser(String id, Map<String, dynamic> data) async {
await _db.collection('users').doc(id).update(data);
}
// ドキュメントを削除
Future<void> deleteUser(String id) async {
await _db.collection('users').doc(id).delete();
}
// リアルタイム監視
Stream<QuerySnapshot> watchUsers() {
return _db.collection('users').snapshots();
}
}
class FirestoreService {
final FirebaseFirestore _db = FirebaseFirestore.instance;
// ドキュメントを追加
Future<void> addUser(Map<String, dynamic> user) async {
await _db.collection('users').add(user);
// または ID を指定
// await _db.collection('users').doc('user_id').set(user);
}
// 単一ドキュメントを取得
Future<Map<String, dynamic>?> getUser(String id) async {
final doc = await _db.collection('users').doc(id).get();
return doc.data();
}
// コレクションの全ドキュメントを取得
Future<List<Map<String, dynamic>>> getUsers() async {
final snapshot = await _db.collection('users').get();
return snapshot.docs.map((doc) => doc.data()).toList();
}
// 条件クエリ
Future<List<Map<String, dynamic>>> getUsersByAge(int age) async {
final snapshot = await _db
.collection('users')
.where('age', isGreaterThanOrEqualTo: age)
.get();
return snapshot.docs.map((doc) => doc.data()).toList();
}
// ドキュメントを更新
Future<void> updateUser(String id, Map<String, dynamic> data) async {
await _db.collection('users').doc(id).update(data);
}
// ドキュメントを削除
Future<void> deleteUser(String id) async {
await _db.collection('users').doc(id).delete();
}
// リアルタイム監視
Stream<QuerySnapshot> watchUsers() {
return _db.collection('users').snapshots();
}
}
Firebase Storage - ファイルストレージ
例:ファイルアップロード
import 'package:firebase_storage/firebase_storage.dart';
import 'dart:io';
class StorageService {
final FirebaseStorage _storage = FirebaseStorage.instance;
// ファイルをアップロード
Future<String?> uploadFile(File file, String path) async {
try {
final ref = _storage.ref().child(path);
final result = await ref.putFile(file);
return await result.ref.getDownloadURL();
} on FirebaseException catch (e) {
print('アップロード失敗: ${e.message}');
return null;
}
}
// ファイル URL をダウンロード
Future<String?> getDownloadURL(String path) async {
try {
final ref = _storage.ref().child(path);
return await ref.getDownloadURL();
} on FirebaseException catch (e) {
print('URL の取得失敗: ${e.message}');
return null;
}
}
// ファイルを削除
Future<void> deleteFile(String path) async {
await _storage.ref().child(path).delete();
}
}
import 'dart:io';
class StorageService {
final FirebaseStorage _storage = FirebaseStorage.instance;
// ファイルをアップロード
Future<String?> uploadFile(File file, String path) async {
try {
final ref = _storage.ref().child(path);
final result = await ref.putFile(file);
return await result.ref.getDownloadURL();
} on FirebaseException catch (e) {
print('アップロード失敗: ${e.message}');
return null;
}
}
// ファイル URL をダウンロード
Future<String?> getDownloadURL(String path) async {
try {
final ref = _storage.ref().child(path);
return await ref.getDownloadURL();
} on FirebaseException catch (e) {
print('URL の取得失敗: ${e.message}');
return null;
}
}
// ファイルを削除
Future<void> deleteFile(String path) async {
await _storage.ref().child(path).delete();
}
}
その他の拡張Firebase は強力なバックエンドサービスを提供しており、Flutter アプリのバックエンドを迅速に構築するための最良の選択肢です。