Flutter Firebase数据增删改查插件firebase_crud的使用
Flutter Firebase数据增删改查插件firebase_crud的使用
Firebase CRUD with Logging - Dart Package
本包提供了一组可重用的混入类(mixins),用于以整洁且模块化的方式执行Firestore操作和身份验证检查。这些混入类设计遵循SOLID原则,为开发人员提供了灵活性,可以选择他们需要的功能。
特性
- Firestore读取操作:获取单个文档或从集合中检索所有文档。
- Firestore写入操作:保存或删除Firestore集合中的文档。
- 身份验证:在执行操作之前检查用户是否已认证。
- 日志记录:可选的日志记录操作、错误和完成时间,以便更好地查看操作过程。
安装
在你的pubspec.yaml
文件中添加以下依赖:
dependencies:
cloud_firestore: ^4.1.0
logger: ^1.2.0
使用
1. Firestore读取操作
FirestoreReadRepository
混入类提供了用于按ID获取文档和从集合中获取所有文档的读取操作。
示例
import 'package:your_package/firestore_mixin.dart';
// 定义一个读取用户信息的仓库
class UserReadRepository with FirestoreReadRepository {
@override
String get collection => 'users';
@override
FirestoreReadService get firestoreReadService => FirestoreServiceImpl();
@override
LoggerService? get loggerService => LoggerServiceImpl(Logger(), true);
}
// 获取用户信息
void fetchUserById(String userId) async {
final userRepository = UserReadRepository();
try {
final userDocument = await userRepository.fetchDocumentById(docId: userId);
if (userDocument.exists) {
final userData = userDocument.data();
print('User data: $userData');
} else {
print('User not found');
}
} catch (e) {
print('Error fetching user: $e');
}
}
2. Firestore写入操作
FirestoreWriteRepository
混入类提供了用于保存和删除Firestore集合中文档的写入操作。
示例
class UserWriteRepository with FirestoreWriteRepository {
@override
String get collection => 'users';
@override
FirestoreWriteService get firestoreWriteService => FirestoreWriteServiceImpl();
@override
LoggerService? get loggerService => LoggerServiceImpl(Logger(), true);
}
// 保存用户信息
void saveUser(Map<String, dynamic> userData) async {
final userRepository = UserWriteRepository();
try {
await userRepository.saveDocument(data: userData);
print('User saved successfully');
} catch (e) {
print('Error saving user: $e');
}
}
3. 身份验证
AuthRepository
混入类提供了使用AuthService
抽象类进行身份验证的检查。这可以与其他混入类结合使用,确保只有已认证的用户才能执行某些操作。
示例
class AuthenticatedUserRepository with FirestoreReadRepository, FirestoreWriteRepository, AuthRepository {
@override
String get collection => 'users';
@override
FirestoreReadService get firestoreReadService => FirestoreServiceImpl();
@override
FirestoreWriteService get firestoreWriteService => FirestoreWriteServiceImpl();
@override
AuthService get authService => FirebaseAuthService();
@override
LoggerService? get loggerService => LoggerServiceImpl(Logger(), true);
}
// 检查用户是否已认证并获取用户信息
void fetchUserIfAuthenticated(String userId) async {
final userRepository = AuthenticatedUserRepository();
try {
await userRepository.checkAuthenticated();
final userDocument = await userRepository.fetchDocumentById(docId: userId);
if (userDocument.exists) {
final userData = userDocument.data();
print('User data: $userData');
} else {
print('User not found');
}
} catch (e) {
print('Error: $e');
}
}
4. 结合读取、写入和认证
如果你希望将读取和写入操作与认证结合起来,可以创建一个包含FirestoreReadRepository
、FirestoreWriteRepository
和AuthRepository
的仓库。
示例
class FullUserRepository with FirestoreReadRepository, FirestoreWriteRepository, AuthRepository {
@override
String get collection => 'users';
@override
FirestoreReadService get firestoreReadService => FirestoreServiceImpl();
@override
FirestoreWriteService get firestoreWriteService => FirestoreWriteServiceImpl();
@override
AuthService get authService => FirebaseAuthService();
@override
LoggerService? get loggerService => LoggerServiceImpl(Logger(), true);
}
日志记录
通过提供LoggerService
,你可以启用任何操作的日志记录功能。你可以为获取或保存文档等操作记录消息、错误和完成时间。
示例
final loggerService = LoggerServiceImpl(Logger(), true); // 启用日志记录
final userRepository = FullUserRepository();
userRepository.loggerService?.log('Fetching all users...');
更多关于Flutter Firebase数据增删改查插件firebase_crud的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Firebase数据增删改查插件firebase_crud的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个使用Flutter和Firebase进行CRUD(创建、读取、更新、删除)操作的代码示例。我们将使用firebase_database
插件来实现这些功能。虽然firebase_crud
不是一个官方的Firebase插件,但大多数Firebase操作都可以通过firebase_database
或cloud_firestore
来实现。以下示例将使用firebase_database
。
首先,确保你已经在pubspec.yaml
文件中添加了firebase_database
和firebase_core
依赖:
dependencies:
flutter:
sdk: flutter
firebase_core: ^1.10.0 # 请检查最新版本
firebase_database: ^9.0.4 # 请检查最新版本
然后,在lib
目录下创建一个新的Dart文件,例如database_service.dart
,并添加以下代码来设置Firebase数据库服务:
import 'package:firebase_database/firebase_database.dart';
import 'package:firebase_core/firebase_core.dart';
class DatabaseService {
final DatabaseReference _databaseReference = FirebaseDatabase.instance.reference();
Future<void> updateUserData(String userId, Map<String, dynamic> userData) async {
_databaseReference.child('users/$userId').update(userData);
}
Future<void> createUserData(String userId, Map<String, dynamic> userData) async {
_databaseReference.child('users/$userId').set(userData);
}
Future<DataSnapshot> readUserData(String userId) async {
return _databaseReference.child('users/$userId').once();
}
Future<void> deleteUserData(String userId) async {
_databaseReference.child('users/$userId').remove();
}
}
接下来,在你的主应用文件(例如main.dart
)中,使用这些服务来执行CRUD操作:
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'database_service.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 CRUD',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final DatabaseService _databaseService = DatabaseService();
String userId = '123456789'; // 示例用户ID
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Firebase CRUD'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () async {
Map<String, dynamic> userData = {
'name': 'John Doe',
'email': 'john.doe@example.com',
};
await _databaseService.createUserData(userId, userData);
print('User data created.');
},
child: Text('Create User'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
Map<String, dynamic> userData = {
'name': 'Jane Doe',
};
await _databaseService.updateUserData(userId, userData);
print('User data updated.');
},
child: Text('Update User'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
DataSnapshot snapshot = await _databaseService.readUserData(userId);
print('User data: ${snapshot.value}');
},
child: Text('Read User'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
await _databaseService.deleteUserData(userId);
print('User data deleted.');
},
child: Text('Delete User'),
),
],
),
),
);
}
}
这个示例展示了如何使用Firebase Realtime Database在Flutter应用中执行基本的CRUD操作。请注意,你需要有一个有效的Firebase项目,并且已经在Firebase控制台中设置了数据库规则。
希望这个示例对你有帮助!如果你有任何其他问题,欢迎继续提问。