簡體   English   中英

Flutter/Firestore 返回類型列表<review>不是類型“Map”的子類型<string, dynamic> ' 從 Stream 檢索快照時</string,></review>

[英]Flutter/Firestore returns type List<Review> is not a subtype of type 'Map<String, dynamic>' when retrieving snapshots from Stream

我正在嘗試使用 firestore 實時數據庫檢索一個集合及其子集合並在 ListView 中顯示結果但是我得到type List<Review> is not a subtype of type 'Map<String, dynamic>'我無法得到周圍。

問題我應該更改什么才能正確返回所需的結果?

這是reviews_service.dart

class ReviewsService {
  var currentUser = FirebaseAuth.instance.currentUser;
  var firestoreInstance = FirebaseFirestore.instance;

  Stream<List<T>> reviewsCollectionStream<T>({
    @required String path,
    @required T builder(Map<String, dynamic> data),
  }) {
    final reference = firestoreInstance.collection(path);
    final snapshots = reference.snapshots();
    return snapshots.map((snapshot) =>
        snapshot.docs.map((snapshot) => builder(snapshot.data())).toList());
}

這些是我的 model 類review.dartclient.dart

class Review {
  final String reviewTitle;
  final String reviewContent;
  final Client owner;

  Review(
    {this.reviewTitle,
    this.reviewContent,
    this.owner});

  factory Review.fromMap(Map<String, dynamic> map) {
    if (map == null) return null;

    return Review(
      reviewTitle: map['revieewTitle'],
      reviewContent: map['reviewContent'],
      owner: Client.fromMap(map['owner']),
    );
  }
}

class Client {
  final String clientUID;
  final String clientEmail;
  final String clientName;

  Client({this.clientUID, this.clientEmail, this.clientName});

  factory Client.fromMap(Map<String, dynamic> map) {
    if (map == null) return null;

    return EndUser(
      clientUID: map['clientId'],
      clientEmail: map['clientEmail'],
      clientDisplayName: map['clientName'],
    );
  }
}

這是我檢索數據並將它們顯示在reviews_page.dart中的地方:

class _ReviewsPageState extends State<ReviewsPage> {
  final reviews = _mReviewService.reviewssCollectionStream(path: "reviews", builder: (data) => Review.fromMap(data));
  @override
  Widget build(BuildContext context) {
    return Expanded(
      child: Container(
        child: StreamBuilder<Object>(
           stream: reviews,
           builder: (context, snapshot) {
              if (snapshot.hasData) {
                return ListView.builder(
                  controller: _scrollController,
                  itemBuilder: (BuildContext context, int index) {
                    Review rev = new Review(
                        reviewTitle: (snapshot.data as Map)["reviewTitle"][index].toString(),
                        reviewContent: (snapshot.data as Map)["reviewContent"][index].toString(),                      
                        owner: (snapshot.data as Map)["reviewOwner"][index]);
                    return Review(review: rev,);
                  },
               );
              } else {return Center(child: Text('there are no reviews'));}
            }),
      ),
    );
  }
}

更新我開始工作檢索運行正常我現在唯一的問題是Client端子集合為空! Stream<List<T>> reviewsCollectionStream<T>({...})有什么問題嗎?

這就是我所做的:在reviews_page.dartitemBuilder

代替

Review rev = new Review(
                reviewTitle: (snapshot.data as Map)["reviewTitle"][index].toString(),
                reviewContent: (snapshot.data as Map)["reviewContent"][index].toString(),                      
                owner: (snapshot.data as Map)["reviewOwner"][index]);

我將其恢復as List

//only one line that's all what it takes
Review rev = (snapshot.data as List)[index]; 

但我仍然無法檢索clients的子集合

Firestore 快照不包含子集合

如果您想要子集合數據,則必須使用您提前知道的子集合名稱進行新查詢

另外,請參閱此鏈接以獲取有關如何獲取子集合數據的參考

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM