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. 结合读取、写入和认证

如果你希望将读取和写入操作与认证结合起来,可以创建一个包含FirestoreReadRepositoryFirestoreWriteRepositoryAuthRepository的仓库。

示例
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

1 回复

更多关于Flutter Firebase数据增删改查插件firebase_crud的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个使用Flutter和Firebase进行CRUD(创建、读取、更新、删除)操作的代码示例。我们将使用firebase_database插件来实现这些功能。虽然firebase_crud不是一个官方的Firebase插件,但大多数Firebase操作都可以通过firebase_databasecloud_firestore来实现。以下示例将使用firebase_database

首先,确保你已经在pubspec.yaml文件中添加了firebase_databasefirebase_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控制台中设置了数据库规则。

希望这个示例对你有帮助!如果你有任何其他问题,欢迎继续提问。

回到顶部