使用自定义模型类的Stream Provider监听Firestore实时更改

时间:2020-06-24 14:45:21

标签: flutter dart google-cloud-firestore

几乎所有使用模型类的流提供程序上的示例都通过调用模型类的方法来更新数据,该方法将StreamController.sink用更新后的值括起来(如递增的整数)。然后,使用onPressed通过UI中的某个Provider.of(context)事件来调用此方法。无法通过ChangeNotifier实现吗?这样的实现如何监听实时变化,例如在Firestore collection查询快照流中?

我尝试直接使用来监听firestore流

StreamProvider<QuerySnapshot>.value(      
      value: Firestore.instance.collection('orders/' +  _auth.userID + '/orders').snapshots(),
      child: UIMain())

但是我不想直接使用此流。我希望使用我自己的模型类创建一个自定义流,该流可以实时提供此集合中所有文档的名称,根据该集合中的文档ID查询另一个集合,并将该数据也作为流提供,而无需按每次一个按钮。

我希望有人能对此提供帮助。

2 个答案:

答案 0 :(得分:2)

您可以创建自己的服务和映射器以实现所需的解决方案-

首先对数据进行模式化

product.dart

class Order {
  String id;
  String price;
  String name;

  Order({this.id, this.price, this.name,});

  factory Order.fromMap(Map snapshot,String id){
        id = id ?? '',
        price = snapshot['price'] ?? '',
        name = snapshot['name'] ?? '',
    }

  toJson() {
    return {
      "price": price,
      "name": name,
    };
  }
}

然后创建您的数据库服务,该服务将从Firestore中获取数据并进行相应的映射。

order_service.dart

import 'package:model/order.dart';
        
class OrderService extends ChangeNotifier {
          final Firestore _db = Firestore.instance;
          
        
          Stream<List<Order>> fetchOrders(String merchID) {
    return _db.collection('merchants/' + merchID + '/orders').snapshots().map(
    (snapShot) => snapShot.documents
    .map(
    (document) => Order.fromMap(document.data, document.documentID))
    .toList());
    }
}

然后,您可以在StreamProvider小部件中相应地使用此自定义OrderService。

希望这会有所帮助!

答案 1 :(得分:0)

您可以创建一个具有getter方法的模型类,该方法将返回这样的流

class Order{
   final String name;
   Order({this.name});

   Stream<List<Order>> get orderList {
     return Firestore.instance.collection('orders/' +  _auth.userID + '/orders').snapshots().map((document) => Order(
          name: document.data['name']
       )
     ).toList();
}

然后初始化您的流

StreamProvider<QuerySnapshot>.value(      
  value: Order.orderList,
  child: UIMain())
)

希望这会有所帮助:)