使用Stream从FireStore获取数据并将其映射到Class Flutter

时间:2019-12-10 03:35:49

标签: flutter dart google-cloud-firestore

我正在尝试将Firestore Map中的数据反序列化为新的类,然后使用提供程序调用该类。我已经按照一些教程(https://fireship.io/lessons/advanced-flutter-firebase/)进行了操作,但没有成功。

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

class UserCheck extends ChangeNotifier {
  final _auth = FirebaseAuth.instance;
  FirebaseUser loggedInUser;

  var userDetails;
  final String id;
  String firstName;
  final String lastName;
  final String userEmail;
  final String userOrg;
  final Timestamp regDate;
  final String date;

  UserCheck({
    this.id,
    this.firstName,
    this.lastName,
    this.userEmail,
    this.userOrg,
    this.regDate,
    this.date,
  });

  factory UserCheck.fromSnap(DocumentSnapshot ds) {
    Map data = ds.data;

    return UserCheck(
      id: ds.documentID,
      firstName: ds['fname'] ?? '',
      lastName: data['lname'] ?? '',
      userEmail: data['regEmail'] ?? '',
      userOrg: data['org'] ?? '',

    );
  }

然后我尝试使用

打电话
//database_service.dart

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:oast_app/widgets/auth_class.dart';

class DatabaseService {

    Stream<List<UserCheck>> streamUser(FirebaseUser user){
    var ref = Firestore.instance.collection('users').document('${user.uid}').snapshots();
    return ref.map((list) => {
      return list.data.map((ds) => UserCheck.fromSnap(ds)).toList()
    });
    }
}

错误消息: < 编译器消息: lib / widgets / database_service.dart:12:7:错误:意外的令牌“返回”。       返回list.data.map((ds)=> UserCheck.fromSnap(ds))。toList()       ^^^^^^ lib / widgets / database_service.dart:12:55:错误:参数类型'String'无法分配给参数类型'DocumentSnapshot'。  -'DocumentSnapshot'来自'package:cloud_firestore / cloud_firestore.dart'('../../Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.12.11/lib/cloud_firestore。镖')。       返回list.data.map((ds)=> UserCheck.fromSnap(ds))。toList()                                                       ^ lib / widgets / database_service.dart:12:46:错误:无法将类型“ UserCheck”的值分配给“ MapEntry”类型的变量。  -“ UserCheck”来自“ package:oast_app / widgets / auth_class.dart”(“ lib / widgets / auth_class.dart”)。  -“ MapEntry”来自“ dart:core”。       返回list.data.map((ds)=> UserCheck.fromSnap(ds))。toList()                                              ^ lib / widgets / database_service.dart:12:28:错误:参数类型'MapEntry Function(String)'无法分配给参数类型'MapEntry Function(String,dynamic)'。  -“ MapEntry”来自“ dart:core”。       返回list.data.map((ds)=> UserCheck.fromSnap(ds))。toList()                            ^ lib / widgets / database_service.dart:12:60:错误:未为类“ Map”定义方法“ toList”。  -“地图”来自“ dart:core”。 尝试将名称更正为现有方法的名称,或定义一个名为“ toList”的方法。       返回list.data.map((ds)=> UserCheck.fromSnap(ds))。toList()                                                            ^^^^^^ lib / widgets / database_service.dart:11:30:错误:不能将类型为“设置”的值分配给类型为“列表”的变量。  -“设置”来自“ dart:core”。  -“列表”来自“ dart:core”。  -“ UserCheck”来自“ package:oast_app / widgets / auth_class.dart”(“ lib / widgets / auth_class.dart”)。     返回ref.map((list)=> { >

2 个答案:

答案 0 :(得分:0)

一个猜测,不应该是您的以下代码;

firstName: ds['fname'] ?? '',

firstName: data['fname'] ?? '',

相反?

答案 1 :(得分:0)

代替使用.data;,您需要使用.data();来实际获取文档数据。

不过,您可以使用.data().map['[FIELD_NAME]']

直接获取Firestore地图的每个值

如前所述,名字的一部分也应该是data ['fname']。