【问题标题】:flutter: type '(DocumentSnapshot<MyObject>) => MyObject' is not a subtype of type '(DocumentSnapshot<Object>) => MyObject'颤振:类型 '(DocumentSnapshot<MyObject>) => MyObject' 不是类型 '(DocumentSnapshot<Object>) => MyObject' 的子类型
【发布时间】:2021-08-06 18:19:28
【问题描述】:

我很难从 firebase 数据库中读取(和显示)数据。 我收到这个警告: type '(DocumentSnapshot) => GivitUser' 不是 type '(DocumentSnapshot) => GivitUser' 的子类型

我真的不知道自己做错了什么,我尝试从 DocumentSnapshot 转换为 DocumentSnapshot 但没有成功。 这是我的 database.dart 文件:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:givit_app/models/givit_user.dart';

class DatabaseService {
  final String uid;
  DatabaseService({@required this.uid});

  final CollectionReference userCollection =
      FirebaseFirestore.instance.collection('Users');

  Future<void> updateGivitUserData(
      String email, String fullName, String password, int phoneNumber) async {
    return await userCollection.doc(uid).set({
      'Email': email,
      'Full Name': fullName,
      'Password': password,
      'Phone Number': phoneNumber,
    });
  }

  Future<GivitUser> getGivitUser(String uid) async {
    return await userCollection.doc(uid).get().then((user) => user.data());
  }

  GivitUser _userDataFromSnapshot(DocumentSnapshot<GivitUser> snapshot) {
    return GivitUser(
      uid: uid,
      email: snapshot.data().email,
      fullName: snapshot.data().fullName,
      phoneNumber: snapshot.data().phoneNumber,
    );
  }

  Stream<GivitUser> get userData {
    return userCollection.doc(uid).snapshots().map(_userDataFromSnapshot);
  }
}

这是我尝试使用 database.dart 文件并呈现数据的地方:

  Widget build(BuildContext context) {
    GivitUser user = Provider.of<GivitUser>(context);
    final DatabaseService db = DatabaseService(uid: user.uid);
    return StreamBuilder<GivitUser>(
        stream: db.userData,
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return Loading();
          }
          print('after getter');
          print(snapshot.data);
          GivitUser givitUser = snapshot.data;
          return Scaffold(
          ....
          ....
          ....

在此先感谢,我将不胜感激:)

编辑:错误截图: ERROR SCREENSHOT

【问题讨论】:

  • 您好。您能否发布您确切的完整错误或共享错误的屏幕截图。
  • 是的,我在帖子末尾添加了截图:)
  • 您能否检查以下答案是否解决了您的问题?
  • 很遗憾,没有。我解释了为什么现在

标签: firebase flutter google-cloud-firestore stream-builder


【解决方案1】:

这一行 userCollection.doc(uid).snapshots() 返回 Stream&lt;DocumentSnapshot&gt; 而不是 Stream&lt;DocumentSnapshot&lt;GivitUser&gt;&gt;,正如您在 _userDataFromSnapshot 参数中声明的那样。

Reference

Stream 快照({bool includeMetadataChanges = false})

您需要在下面更改此代码块:

    GivitUser _userDataFromSnapshot(DocumentSnapshot<GivitUser> snapshot) {
        //...
      }

到这里:

    GivitUser _userDataFromSnapshot(DocumentSnapshot snapshot) {
       //...
      }

snapshot.data() 返回一个Map<String, dynamic> 对象。 因此,您可以像从 Map 对象中一样获取数据。

_userDataFromSnapshot 方法可以更新为:

    GivitUser _userDataFromSnapshot(DocumentSnapshot snapshot) {
        var snapshotData = snapshot.data() as Map;
        return GivitUser(
           uid: uid,
           email: snapshotData['Email'],
           fullName: snapshotData['Full Name'],
           phoneNumber: snapshotData['Phone Number'],
        );
   }

【讨论】:

  • 这确实有道理,但是我无法读取我的快照数据,例如这一行:email: snapshot.data().email。因为他不知道 GivitUser 字段。我试图投射它,但它也不起作用
  • @JohnLennon,我已经更新了答案。检查一下,它应该可以工作。
  • 仍然没有,错误是:没有为类型“对象”定义运算符“[]”。尝试定义运算符'[]'。
  • 我在答案中将snapshot.data() 转换为Map。请检查一下。
  • 太棒了!很高兴为您提供帮助!
【解决方案2】:

我遇到了这个确切的问题,帮助我首先尝试获取集合然后处理此特定文档,也许尝试更改此代码:

final DatabaseService db = DatabaseService(uid: user.uid);
return StreamBuilder<GivitUser>(
    stream: db.userData,

到此代码:

final DatabaseService db = DatabaseService(uid: user.uid);
return StreamBuilder<GivitUser>(
    stream: db.userCollection.doc(db.uid).get(),

就像这个文件说https://firebase.flutter.dev/docs/firestore/usage/#one-time-read

然后你就可以进入如下领域:

builder: (context, snapshot) {
/...
    Map<String, dynamic> data = snapshot.data.data();

希望对你也有帮助! :)

【讨论】:

  • 也看到了这个解决方案,但在我的情况下它不起作用,但谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
相关资源
最近更新 更多