Flutter Firebase服务集成插件flutter_firebase_services的使用
Flutter Firebase服务集成插件flutter_firebase_services的使用
本Flutter项目展示了如何集成Firebase服务,包括Firestore的CRUD操作、Firebase认证(Auth)用于用户注册和登录,以及Firebase存储用于上传图像。
开始使用
在你的Flutter项目中添加依赖:
dependencies:
flutter_firebase_services: ^0.0.4
导入包:
import 'package:firebase_service/firebase_service.dart';
创建实例
Db db = Db();
Firestore CRUD操作
创建文档
要向Firestore集合中添加新文档:
// 示例代码:创建文档
await db.addDocument(
collectionName: 'users',
data: {'name': '张三', 'age': 25},
);
读取文档
要读取集合中的所有文档:
StreamBuilder(
stream: db.getDocumentsStream(collectionName: "users"),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
}
if (snapshot.hasError) {
return Text('错误: ${snapshot.error}');
}
List<DocumentSnapshot> documents = snapshot.data?.docs ?? [];
return ListView.builder(
itemCount: documents.length,
itemBuilder: (context, index) {
Map<String, dynamic> data =
documents[index].data() as Map<String, dynamic>;
return ListTile(
title: Text(data['name']),
subtitle: Text("${data['age']}"),
);
},
);
},
),
示例模型:
class User {
final String id;
final String name;
final int age;
final String imageURL;
User({required this.id, required this.name, required this.age, required this.imageURL});
// 必须包含id的fromMap方法
factory User.fromMap(String id, Map<String, dynamic> map) {
return User(
id: id,
name: map['name'] ?? '',
age: map['age'] ?? 0,
imageURL: map['imageURL'] ?? '',
);
}
}
要以模型列表的形式检索所有文档:
StreamBuilder(
stream: db.getDocumentsAsModelsStream<User>(
collectionName: 'users',
fromMap: (documentId, data) => User.fromMap(documentId, data),
),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
}
if (snapshot.hasError) {
return Text('错误: ${snapshot.error}');
}
List<User> users = snapshot.data ?? [];
return ListView.builder(
itemCount: users.length,
itemBuilder: (context, index) {
User user = users[index];
return ListTile(
title: Text('姓名: ${user.name}'),
subtitle: Text('年龄: ${user.age}'),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => UserDetailPage(docid: user.id),
));
},
);
},
);
},
),
读取单个文档
要以模型形式检索文档:
StreamBuilder(
stream: db.getDocumentAsModelStream(
collectionName: "users", documentId: docid, fromMap: User.fromMap),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
}
if (snapshot.hasError) {
return Text('错误: ${snapshot.error}');
}
User? user = snapshot.data;
if (user == null) {
return const Center(child: Text('未找到用户'));
}
return ListTile(
title: Text("姓名: ${user.name}"),
subtitle: Text("年龄: ${user.age}"),
);
},
),
根据条件检索文档:
StreamBuilder(
stream: db.getDocStreamWhere(
collectionName: "users",
field: "age",
isEqualTo: 25, // 替换为所需的条件
),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
}
if (snapshot.hasError) {
return Text('错误: ${snapshot.error}');
}
List<DocumentSnapshot> documents = snapshot.data?.docs ?? [];
return ListView.builder(
itemCount: documents.length,
itemBuilder: (context, index) {
Map<String, dynamic> data =
documents[index].data() as Map<String, dynamic>;
return ListTile(
title: Text(data['name']),
subtitle: Text("${data['age']}"),
);
},
);
},
),
更新文档
根据文档ID更新文档:
// 示例代码:更新文档
await db.updateDocument(
collectionName: 'users',
documentId: 'documentId123',
data: {'age': 26},
);
根据条件更新文档:
await updateWhere(
collectionName: 'your_collection_name',
field: 'your_field',
isEqualTo: 'your_value',
dataToUpdate: {'fieldToUpdate': 'new_value'},
);
删除文档
根据文档ID删除文档:
// 示例代码:删除文档
await db.deleteDocument(
collectionName: 'users',
documentId: 'documentId123',
);
根据条件删除文档:
await deleteWhere(
collectionName: 'your_collection_name',
field: 'your_field',
isEqualTo: 'your_value',
);
Firebase认证
注册
使用电子邮件和密码进行注册:
await db.register(email, password);
登录
使用电子邮件和密码进行登录:
await db.login(email, password);
登出
从Firebase认证中登出:
await db.signOut();
Firebase存储
上传图像
向Firebase存储上传图像:
import 'dart:io';
import 'package:crud/db.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
class UploadImageToFirebase extends StatefulWidget {
const UploadImageToFirebase({super.key});
[@override](/user/override)
State<UploadImageToFirebase> createState() => _UploadImageToFirebaseState();
}
class _UploadImageToFirebaseState extends State<UploadImageToFirebase> {
XFile? selectedImage;
Db db = Db();
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("上传图像"),
),
body: SingleChildScrollView(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (selectedImage != null) Image.file(File(selectedImage!.path)),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () {
_pickImage();
},
child: const Text('选择图像'),
),
const SizedBox(height: 10),
ElevatedButton(
onPressed: () async {
String url = await db.uploadImage(
file: selectedImage!,
folderName: "Images",
fileName: "Image Name");
},
child: const Text('上传图像到Firebase存储')),
],
),
),
),
);
}
// 选择图像的方法
Future<void> _pickImage() async {
final XFile? image =
await ImagePicker().pickImage(source: ImageSource.camera);
if (image != null) {
setState(() {
selectedImage = image;
});
}
}
}
网站上传图像
在网站上上传图像:
import 'package:file_picker/file_picker.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
class UploadImageToFirebase extends StatefulWidget {
const UploadImageToFirebase({super.key});
[@override](/user/override)
State<UploadImageToFirebase> createState() => _UploadImageToFirebaseState();
}
class _UploadImageToFirebaseState extends State<UploadImageToFirebase> {
String _imageFile = ''; // 保存选中的图像文件
Uint8List? selectedImageInBytes;
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("上传图像"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (_imageFile.isNotEmpty || _imageFile != '')
Image.memory(selectedImageInBytes!),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// 调用pickImage方法
pickImage();
},
child: const Text('选择图像'),
),
const SizedBox(height: 10),
ElevatedButton(
onPressed: () async {
// 调用uploadImage方法
await uploadImage(selectedImageInBytes!);
},
child: const Text('上传图像到Firebase存储')),
],
),
),
);
}
// 在Flutter Web中选择图像的方法
Future<void> pickImage() async {
try {
// 使用file_picker包选择图像
FilePickerResult? fileResult = await FilePicker.platform.pickFiles(
type: FileType.image,
);
// 如果用户选择了图像,则将选中的图像保存到变量中
if (fileResult != null) {
setState(() {
_imageFile = fileResult.files.first.name;
selectedImageInBytes = fileResult.files.first.bytes;
});
}
} catch (e) {
// 如果发生错误,则显示包含错误消息的SnackBar
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text("错误:$e")));
}
}
}
更多关于Flutter Firebase服务集成插件flutter_firebase_services的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Firebase服务集成插件flutter_firebase_services的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_firebase_services
是一个 Flutter 插件,用于简化 Firebase 服务的集成和使用。虽然官方并没有名为 flutter_firebase_services
的插件,但你可以通过官方的 firebase_core
插件以及其他特定的 Firebase 服务插件来集成 Firebase 功能。
以下是使用官方 Firebase 插件的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加所需的 Firebase 插件依赖。例如:
dependencies:
flutter:
sdk: flutter
firebase_core: ^latest_version
firebase_auth: ^latest_version
firebase_firestore: ^latest_version
firebase_storage: ^latest_version
# 添加其他需要的 Firebase 服务插件
然后运行 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
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Firebase Demo',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Firebase Demo'),
),
body: Center(
child: Text('Hello, Firebase!'),
),
);
}
}
3. 使用 Firebase 服务
Firebase 认证 (Firebase Auth)
import 'package:firebase_auth/firebase_auth.dart';
Future<void> signInWithEmailAndPassword(String email, String password) async {
try {
UserCredential userCredential = await FirebaseAuth.instance.signInWithEmailAndPassword(
email: email,
password: password,
);
print('User signed in: ${userCredential.user!.uid}');
} on FirebaseAuthException catch (e) {
print('Failed to sign in: ${e.message}');
}
}
Firestore
import 'package:cloud_firestore/cloud_firestore.dart';
Future<void> addDataToFirestore() async {
FirebaseFirestore firestore = FirebaseFirestore.instance;
await firestore.collection('users').add({
'name': 'John Doe',
'email': 'john.doe@example.com',
});
print('Data added to Firestore');
}
Future<void> getDataFromFirestore() async {
FirebaseFirestore firestore = FirebaseFirestore.instance;
QuerySnapshot snapshot = await firestore.collection('users').get();
snapshot.docs.forEach((doc) {
print('Document data: ${doc.data()}');
});
}
Firebase Storage
import 'package:firebase_storage/firebase_storage.dart';
Future<void> uploadFile() async {
FirebaseStorage storage = FirebaseStorage.instance;
Reference ref = storage.ref().child('images/my_image.jpg');
UploadTask uploadTask = ref.putFile(File('path_to_your_local_file.jpg'));
TaskSnapshot taskSnapshot = await uploadTask;
String downloadURL = await taskSnapshot.ref.getDownloadURL();
print('File uploaded, download URL: $downloadURL');
}
4. 配置 Firebase
在 android/app
目录下的 build.gradle
文件中添加 Google 服务插件:
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services' // Add this line
dependencies {
// Other dependencies
implementation platform('com.google.firebase:firebase-bom:latest_version')
implementation 'com.google.firebase:firebase-analytics'
// Add other Firebase dependencies if needed
}
在 android/build.gradle
文件中添加 Google 服务插件:
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.0'
classpath 'com.google.gms:google-services:4.3.10' // Add this line
}
}