Flutter Firebase集成辅助插件firebase_facilitator的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter Firebase集成辅助插件firebase_facilitator的使用

简介

firebase_facilitator 是一个多功能的Flutter包,旨在简化与Firestore的CRUD(创建、读取、更新、删除)操作。它提供了处理常见任务的mixin,如创建、读取、更新和删除数据,以及可选的日志记录功能。

平台支持

平台 支持情况
Android
iOS
Web
macOS
Windows
Linux

依赖要求

  • Flutter >= 3.3.0
  • cloud_firestore: ^5.5.1
  • fake_cloud_firestore: ^3.0.3
  • firebase_auth: ^5.3.4 (可选,用于身份验证)
  • firebase_core: ^3.8.1
  • firebase_storage: ^12.3.7
  • logger: ^2.4.0 (可选,用于日志记录)

使用示例

1. 导入必要的mixin
import 'package:firebase_facilitator/mixin/crud_repos.dart';
import 'package:firebase_facilitator/mixin/firestore_read_service.dart';
import 'package:firebase_facilitator/mixin/firestore_write_service.dart';
import 'package:firebase_facilitator/mixin/logger_service.dart';
2. 创建Firestore服务类
/// `ItemFirestoreService` 处理 "items" 集合的Firestore CRUD操作。
/// 它使用 `FirestoreReadRepository` 和 `FirestoreWriteRepository` mixin 来执行读取和写入操作,
/// 并提供日志记录服务以记录操作(可选)。
class ItemFirestoreService with FirestoreReadRepository, FirestoreWriteRepository {
  /// 提供从Firestore获取数据的读取服务实现。
  [@override](/user/override)
  FirestoreReadService get firestoreReadService => FirestoreServiceImpl();

  /// 提供在Firestore中保存和删除数据的写入服务实现。
  [@override](/user/override)
  FirestoreWriteService get firestoreWriteService => FirestoreWriteServiceImpl();

  /// 日志记录服务,用于跟踪操作。这里设置为 `true`,启用日志记录。
  [@override](/user/override)
  LoggerService? get loggerService => LoggerServiceImpl(true); // 可选

  /// 指定此服务操作的Firestore集合名称。
  [@override](/user/override)
  String get collection => "items";
}
3. 创建数据仓库类
/// `ItemRepository` 作为Firestore服务的抽象层,
/// 提供与 `ItemModel` 对象交互的具体方法。
class ItemRepository {
  final ItemFirestoreService firestoreService;

  /// 构造函数,需要传递一个 `ItemFirestoreService` 实例。
  ItemRepository(this.firestoreService);

  /// 从 "items" 集合中获取所有项目。
  Future<List<ItemModel>> fetchAllItems() async {
    try {
      final List<Map<String, dynamic>> rawData = await firestoreService.fetchAllDocuments();
      return rawData.map((element) => ItemModel.fromJson(element)).toList();
    } catch (e) {
      log('Error fetching items: $e');
      rethrow; // 传播错误以便进一步处理
    }
  }

  /// 获取分页文档。
  ///
  /// 此函数从Firestore集合中检索指定数量的文档(`limit`),从第一个文档开始或从由 `lastDocument` 指定的文档开始(用于继续分页)。
  /// 文档按指定字段(`orderByField`)排序,默认按 'createdAt' 字段排序。
  ///
  /// 分页是一种分批获取数据的技术,而不是一次性加载所有文档,这可以提高性能并减少内存使用。
  ///
  /// 参数:
  /// - [limit] (可选): 每页最大文档数,默认为10。
  /// - [lastDocument] (可选): 上一页最后一条文档的引用。如果提供,则从该文档之后开始下一页。如果没有提供,则从头开始。
  /// - [orderByField] (可选): 用于排序的Firestore字段,默认为 'createdAt'。
  ///
  /// 返回:
  /// - 一个包含已获取文档和其他分页相关信息的 `PaginationResult` 对象。
  ///
  /// 示例用法:
  /// ```dart
  /// final PaginationResult result = await fetchPaginatedDocuments(
  ///   limit: 20,
  ///   lastDocument: lastDocument, // 上一页的最后一条文档
  ///   orderByField: 'updatedAt',
  /// );
  /// ```
  ///
  /// 此函数使用 `firestoreService` 中的 `fetchPaginatedDocuments` 方法来处理Firestore读取操作。
  Future<PaginationResult> fetchPaginatedDocuments({
    int limit = 10,
    DocumentSnapshot? lastDocument,
    String orderByField = 'createdAt',
  }) async {
    // 使用提供的参数从Firestore获取分页文档。
    final PaginationResult paginationResult = await firestoreService.fetchPaginatedDocuments(
      limit: limit,
      lastDocument: lastDocument,
      orderByField: orderByField,
    );

    // 返回包含文档和分页元数据的结果。
    return paginationResult;
  }

  /// 保存新的 `ItemModel` 到Firestore。
  Future<void> saveItem({required ItemModel itemModel}) async {
    try {
      await firestoreService.saveDocument(data: itemModel.toJson());
    } catch (e) {
      log('Error saving item: $e');
    }
  }

  /// 根据ID从Firestore中获取单个项目。
  Future<ItemModel> fetchItemByID({required String itemId}) async {
    try {
      final Map<String, dynamic>? rawData = await firestoreService.fetchDocumentById(docId: itemId);
      if (rawData == null) throw Exception("Item not found");
      return ItemModel.fromJson(rawData);
    } catch (e) {
      log('Error fetching item by ID: $e');
      rethrow;
    }
  }

  /// 根据ID从Firestore中删除项目。
  Future<void> deleteItem({required String id}) async {
    try {
      await firestoreService.deleteDocument(documentId: id);
    } catch (e) {
      log('Error deleting item: $e');
    }
  }

  /// 将文件上传到Firebase Storage并记录生成的URL。
  Future<void> uploadFile() async {
    final FilePickerResult? result = await FilePicker.platform.pickFiles(type: FileType.image);
    if (result == null) return; // 未选择文件

    final String? filePath = result.paths.firstOrNull;
    if (filePath == null) return;

    try {
      final String imageUrl = await firestoreService.uploadFile(
        filePath: filePath,
        storagePath: "$imagePath/file.jpg",
      );
      log('File uploaded successfully. URL: $imageUrl');
    } catch (e) {
      log('Error uploading file: $e');
    }
  }

  /// 从Firebase Storage下载文件到本地目录。
  Future<void> downloadFile() async {
    final String? directoryPath = await FilePicker.platform.getDirectoryPath();
    if (directoryPath == null) return;

    try {
      await firestoreService.downloadFile(
        storagePath: "$imagePath/file.jpg",
        destinationPath: "$directoryPath/file.jpg",
      );
      log('File downloaded successfully');
    } catch (e) {
      log('Error downloading file: $e');
    }
  }

  /// 从Firebase Storage删除文件。
  Future<void> deleteFile() async {
    try {
      await firestoreService.deleteFile(storagePath: "$imagePath/file.jpg");
      log('File deleted successfully');
    } catch (e) {
      log('Error deleting file: $e');
    }
  }
}
4. 创建数据模型类
/// `ItemModel` 表示 "items" 集合中的项目,包含 `id`、`name` 和 `price` 字段。
class ItemModel {
  final String id;
  final String name;
  final double price;

  /// 构造函数,用于创建 `ItemModel` 对象。
  ItemModel({required this.id, required this.name, required this.price});

  /// 从JSON创建 `ItemModel`。
  factory ItemModel.fromJson(Map<String, dynamic> json) {
    return ItemModel(
      id: json['id'] as String,
      name: json['name'] as String,
      price: (json['price'] as num).toDouble(),
    );
  }

  /// 将 `ItemModel` 转换为JSON。
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'name': name,
      'price': price,
    };
  }
}
5. 主应用程序入口
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:file_picker/file_picker.dart';
import 'package:firebase_facilitator/mixin/crud_repos.dart';
import 'package:firebase_facilitator/mixin/firestore_read_service.dart';
import 'package:firebase_facilitator/mixin/firestore_write_service.dart';
import 'package:firebase_facilitator/mixin/logger_service.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 Facilitator Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ItemListScreen(),
    );
  }
}

class ItemListScreen extends StatefulWidget {
  [@override](/user/override)
  _ItemListScreenState createState() => _ItemListScreenState();
}

class _ItemListScreenState extends State<ItemListScreen> {
  final ItemFirestoreService _firestoreService = ItemFirestoreService();
  final ItemRepository _itemRepository = ItemRepository(_firestoreService);
  List<ItemModel> _items = [];

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

  Future<void> _fetchItems() async {
    try {
      final items = await _itemRepository.fetchAllItems();
      setState(() {
        _items = items;
      });
    } catch (e) {
      print('Error fetching items: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Item List'),
      ),
      body: ListView.builder(
        itemCount: _items.length,
        itemBuilder: (context, index) {
          final item = _items[index];
          return ListTile(
            title: Text(item.name),
            subtitle: Text('Price: ${item.price}'),
            trailing: IconButton(
              icon: Icon(Icons.delete),
              onPressed: () async {
                try {
                  await _itemRepository.deleteItem(id: item.id);
                  setState(() {
                    _items.removeAt(index);
                  });
                } catch (e) {
                  print('Error deleting item: $e');
                }
              },
            ),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          final newItem = ItemModel(
            id: DateTime.now().millisecondsSinceEpoch.toString(),
            name: 'New Item',
            price: 9.99,
          );
          await _itemRepository.saveItem(itemModel: newItem);
          setState(() {
            _items.add(newItem);
          });
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


在Flutter项目中集成Firebase并使用辅助插件firebase_facilitator可以大大简化配置和管理工作。虽然firebase_facilitator并不是一个官方或广泛认可的Flutter插件名(可能是个自定义插件或者概念),但基于你的要求,我将展示一个标准的Flutter项目如何集成Firebase的几个核心服务(如身份验证和实时数据库),并提供相关代码示例。

1. 设置Flutter项目

首先,确保你的Flutter环境已经正确安装。然后,创建一个新的Flutter项目:

flutter create my_flutter_app
cd my_flutter_app

2. 添加Firebase依赖

pubspec.yaml文件中添加Firebase相关的依赖,比如firebase_corefirebase_authcloud_firestore

dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^1.10.0 # 检查最新版本
  firebase_auth: ^3.3.3 # 检查最新版本
  cloud_firestore: ^3.1.0 # 检查最新版本

运行flutter pub get来安装这些依赖。

3. 配置Firebase项目

在Firebase控制台创建一个新的项目,并添加你的Flutter应用的包名(对于iOS是Bundle ID,对于Android是应用ID)。下载并解压生成的GoogleService-Info.plist(iOS)和google-services.json(Android)文件,将它们分别放置在ios/Runnerandroid/app目录下。

4. 初始化Firebase

lib/main.dart文件中初始化Firebase:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  FirebaseApp.configure();

  // 初始化Firebase应用
  await Firebase.initializeApp();

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Firebase Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

5. 使用Firebase身份验证

lib/main.dart中添加Firebase身份验证的代码示例:

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

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

  void _signInAnonymously() async {
    try {
      UserCredential result = await _auth.signInAnonymously();
      User? user = result.user;
      print('User (${user!.uid}) signed in anonymously.');
    } catch (e) {
      print(e.toString());
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Firebase Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _signInAnonymously,
          child: Text('Sign in Anonymously'),
        ),
      ),
    );
  }
}

6. 使用Firebase实时数据库

lib/main.dart中添加与Firebase实时数据库交互的代码示例:

class _MyHomePageState extends State<MyHomePage> {
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final FirebaseFirestore _firestore = FirebaseFirestore.instance;

  void _writeToDatabase() async {
    User? user = _auth.currentUser;
    if (user != null) {
      await _firestore.collection('users').doc(user.uid).set({
        'username': 'John Doe',
        'email': user.email!,
      });
      print('User data written to Firestore!');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Firebase Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _signInAnonymously,
              child: Text('Sign in Anonymously'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _writeToDatabase,
              child: Text('Write to Database'),
            ),
          ],
        ),
      ),
    );
  }
}

总结

上述代码展示了如何在Flutter项目中集成Firebase并进行基本的身份验证和数据库操作。如果你提到的firebase_facilitator是一个特定的第三方库,你可能需要查找该库的官方文档来获取具体的集成和使用指南。不过,上述步骤涵盖了Flutter与Firebase集成的基础,希望能帮助你入门。

回到顶部