【问题标题】:The method 'get' was called on null. Flutter Firebase在 null 上调用了方法“get”。颤振火力基地
【发布时间】:2021-11-20 00:10:44
【问题描述】:

我正在尝试为我的应用创建排行榜功能,我需要按他们的分数对 firebase 用户列表进行排序,并且只显示最接近我的用户分数的前五名用户。每当我尝试对它们进行排序时遇到问题(分数,isLessThanOrEqualTo:用户分数)它无法正确获得分数。

这是错误信息。

The method 'get' was called on null.
Receiver: null
Tried calling: get("score")

这是我对用户数据进行排序的类。

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

  DocumentSnapshot snapshot;


  // Collection reference
  final CollectionReference<Map<String, dynamic>> highscoresCollection =
      FirebaseFirestore.instance.collection('highscores');

  Future updateUserData(String name,int score) async {
    return await highscoresCollection.doc(uid).set({
      'score': score,
      'name': name,
    });
  }

  // high scores list from snapshot
  List<HighscoreData> _highscoresListFromSnapshot(QuerySnapshot snapshot) {
    return snapshot.docs.map((doc) {
      return HighscoreData(
          name: doc.get('name') ?? '', score: doc.get('score') ?? 0);
    }).toList();
  }


  // Get highscores stream
  Stream<List<HighscoreData>> get highscores{
    return highscoresCollection
              .where(('score'), isLessThanOrEqualTo: snapshot.get('score'))
              .orderBy('score', descending: true,).limit(5)
              .snapshots()
              .map(_highscoresListFromSnapshot);
  }


  UserData _userDataFromSnapshot(DocumentSnapshot snapshot) {
    return UserData(
      uid: uid,
      name: snapshot.get('name'),
      score: snapshot.get('score'),
    );
  }

  // Get user document
  Stream<UserData> get userData {
    return highscoresCollection.doc(uid).snapshots().map(_userDataFromSnapshot);
  }
}

感谢您的帮助,如果您需要更多代码,请告诉我!

【问题讨论】:

    标签: firebase flutter dart dart-null-safety


    【解决方案1】:

    这个问题是由于给定数据的null 值造成的。你应该尝试null safety 来避免这个问题。最好也分享您的错误行。但我认为它与snapshot.get('score') 代码之一有关。检查snapshot 的值并确保该值不为空。此外,您可以使用snapshot?.get('score') 来确保空值安全。模式如下:

    variable?.itsParameter
    

    更新:检查空值并分配默认值 您可以检查 snapshotnull?如果是,请分配一个默认值,或者按照以下方式执行您想要的所有操作:

    snapshot == null? "Your Default Value" : snapshot.get('score')
    

    【讨论】:

    • 感谢提示,我检查了快照,它不为空。我将如何检查它是否为 null 以及是否获取参数?
    • @CameronJohnson 很乐意提供帮助,请参阅我的答案的更新部分。
    猜你喜欢
    • 2020-11-04
    • 2021-06-05
    • 2021-03-10
    • 2020-07-28
    • 2020-06-26
    • 2021-07-03
    • 2021-03-19
    • 2021-02-03
    • 2021-06-05
    相关资源
    最近更新 更多