【问题标题】:Is it possible to return my Firestore stream as a List of models?是否可以将我的 Firestore 流作为模型列表返回?
【发布时间】:2020-06-24 10:47:11
【问题描述】:

我创建了一个提供群组流的群组服务。此流的类型为Stream<List<GroupModel>>,但我真的不知道如何以得到Stream<List<GroupModel>> 的方式映射Firestore 流。这就是我迄今为止所拥有的。

import 'dart:async';

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:wally_talk/data/models/group_model.dart';

class GroupService {

  static const groupCollectionKey = 'groups';
  final CollectionReference groupCollection =
      Firestore.instance.collection(groupCollectionKey);

  Stream<List<GroupModel>> groupStream(String userID) {
    return groupCollection
        .where('members', arrayContains: userID)
        .snapshots()
        .map((snapshot) =>
            snapshot.documents.map((document) => GroupModel.fromMap(id: document.documentID, data: document.data)));
  }

  Future postGroup(String groupName) async {
    // return await groupCollection.add(Group();
  }
}

这是我的小组模型

import 'package:flutter/foundation.dart';

class GroupModel
{
  final String id;
  final String name;
  final List<String> memberIDs;
  final String adminID;

  GroupModel({@required this.id, @required this.name, @required this.memberIDs, @required this.adminID}) 
  : assert(id != null),
  assert(name != null),
  assert(memberIDs != null),
  assert(adminID != null);

  factory GroupModel.fromMap({@required String id, @required Map data})
  {
    return GroupModel(
      id: id,
      name: data['name'] ?? '',
      memberIDs: data['members'] ?? List<String>(),
      adminID: data['adminID'] ?? '',
    );
  }

  Map<String, dynamic> toMap()
  {
    return Map.fromEntries([
      MapEntry<String, String>('id', id),
      MapEntry<String, String>('name', name),
      MapEntry<String, String>('adminID', adminID)
    ]);
  }
}

目前我从终端收到以下消息

AsyncSnapshot<List<GroupModel>>(ConnectionState.active, null, type 'MappedListIterable<DocumentSnapshot, GroupModel>' is not a subtype of type 'List<GroupModel>')

当我从我的 StreamBuilder 中调用它时

stream: groupService.groupStream(userProvider.user.uid),

【问题讨论】:

  • 尝试添加一个 toList();在流的返回语句的末尾
  • 我确实尝试过,它变成了Future&lt;List&lt;Iterable&lt;GroupModel&gt;&gt;&gt;

标签: flutter dart google-cloud-firestore


【解决方案1】:
 Stream<List<GroupModel>> groupStream(String userID) {
return groupCollection
    .where('members', arrayContains: userID)
    .snapshots()
    .map((snapshot) => snapshot.documents.map((document) =>
        GroupModel.fromMap(id: document.documentID, data: document.data)).toList());

对不起,我本来想把它放在那里,我的错。这应该可以,我有一个类似的流可以这样工作!

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多