Flutter Firebase Firestore类型化数据访问插件typed_firestore的使用

Flutter Firebase Firestore类型化数据访问插件typed_firestore的使用

typed_firestore 是一个用于在 Flutter 应用程序中简化与 Firebase Firestore 交互的插件。它通过类型化的方式提供了对 Firestore 数据的访问,使得开发者能够更方便地处理数据。

使用说明

首先,我们需要定义一个类来表示 Firestore 中的数据模型。以下是一个 Car 类的示例:

// 导入必要的库
import 'package:built_collection/built_collection.dart';
import 'package:built_value/serializer.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:typed_firestore/typed_firestore.dart';

// 定义Car类
abstract class Car extends DocData implements Built<Car, CarBuilder> {
  // 获取序列化器
  static Serializer<Car> get serializer => _$carSerializer;

  // 定义Car类的属性
  String get title;

  // 可选字段
  @nullable
  String get nullableField;

  // 构造函数
  Car._();

  // 工厂构造函数
  factory Car([updates(CarBuilder b)]) = _$Car;
}

// 定义序列化器
@SerializersFor(const [
  Car,
])
Serializers serializers = _$serializers;

接下来,我们需要初始化 TypedFirestore 实例,并创建一个集合引用:

// 初始化TypedFirestore实例
final firestore = new TypedFirestore(
  Firestore.instance,
  (serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build(),
);

// 创建Car集合引用
final CollRef<Car> cars = firestore.collection<Car>('cars');

增加数据

要向集合中添加一个新的文档,可以使用 add 方法:

// 创建一个新的Car对象
Car newCar = Car((b) => b
  ..title = "Tesla Model S"
  ..nullableField = "Optional Field"
);

// 将新的Car对象添加到cars集合中
cars.add(newCar);

查询数据

查询集合中的数据可以通过 get 方法实现:

// 获取cars集合中的所有文档
cars.get().then((querySnapshot) {
  querySnapshot.docs.forEach((doc) {
    print(doc.data.title); // 打印每个文档的title字段
  });
});

更新数据

更新集合中的数据可以通过 update 方法实现:

// 获取特定文档的引用
DocumentReference docRef = cars.doc("someDocumentId");

// 更新文档
docRef.update({
  'title': 'Updated Tesla Model S'
}).then((_) {
  print("Document successfully updated!");
});

删除数据

删除集合中的数据可以通过 delete 方法实现:

// 获取特定文档的引用
DocumentReference docRef = cars.doc("someDocumentId");

// 删除文档
docRef.delete().then((_) {
  print("Document successfully deleted!");
});

更多关于Flutter Firebase Firestore类型化数据访问插件typed_firestore的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Firebase Firestore类型化数据访问插件typed_firestore的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


typed_firestore 是一个用于 Flutter 的插件,旨在为 Firebase Firestore 提供类型安全的数据访问。它通过生成类型化的模型类来简化 Firestore 数据的读取和写入操作。以下是如何使用 typed_firestore 的简单指南。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 typed_firestore 作为依赖项:

dependencies:
  flutter:
    sdk: flutter
  firebase_core: latest_version
  cloud_firestore: latest_version
  typed_firestore: latest_version

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](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

3. 定义模型类

使用 typed_firestore,你可以定义类型化的模型类。例如:

import 'package:typed_firestore/typed_firestore.dart';

class User {
  final String id;
  final String name;
  final int age;

  User({required this.id, required this.name, required this.age});

  // 将 User 对象转换为 Map,以便写入 Firestore
  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'age': age,
    };
  }

  // 从 Map 中创建 User 对象,以便从 Firestore 读取
  factory User.fromMap(Map<String, dynamic> map) {
    return User(
      id: map['id'],
      name: map['name'],
      age: map['age'],
    );
  }
}

4. 使用 TypedFirestore

现在你可以使用 TypedFirestore 来进行类型化的 Firestore 操作。以下是一些基本操作的示例:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:typed_firestore/typed_firestore.dart';

class UserRepository {
  final TypedFirestore<User> _usersCollection = TypedFirestore<User>(
    FirebaseFirestore.instance.collection('users'),
    fromMap: User.fromMap,
    toMap: (user) => user.toMap(),
  );

  // 添加用户
  Future<void> addUser(User user) async {
    await _usersCollection.add(user);
  }

  // 获取用户
  Stream<List<User>> getUsers() {
    return _usersCollection.snapshots().map((snapshot) {
      return snapshot.docs.map((doc) => doc.data()).toList();
    });
  }

  // 更新用户
  Future<void> updateUser(User user) async {
    await _usersCollection.doc(user.id).update(user.toMap());
  }

  // 删除用户
  Future<void> deleteUser(String userId) async {
    await _usersCollection.doc(userId).delete();
  }
}

5. 在 UI 中使用

在你的 UI 中使用 UserRepository 来进行数据操作:

class MyHomePage extends StatelessWidget {
  final UserRepository _userRepository = UserRepository();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Typed Firestore Example'),
      ),
      body: StreamBuilder<List<User>>(
        stream: _userRepository.getUsers(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return Center(child: CircularProgressIndicator());
          }

          if (snapshot.hasError) {
            return Center(child: Text('Error: ${snapshot.error}'));
          }

          final users = snapshot.data!;
          return ListView.builder(
            itemCount: users.length,
            itemBuilder: (context, index) {
              final user = users[index];
              return ListTile(
                title: Text(user.name),
                subtitle: Text('Age: ${user.age}'),
              );
            },
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          final user = User(id: DateTime.now().toString(), name: 'John Doe', age: 30);
          await _userRepository.addUser(user);
        },
        child: Icon(Icons.add),
      ),
    );
  }
}
回到顶部