如何根据用户角色显示类别,Firebase Flutter

How to display categories based on user role, Firebase Flutter

我有两种用户“d”和“p”。

对于他们来说,有一个特殊的集合 - roles,它存储了用户的 uid 和他的 role.

我正在尝试显示角色,并根据角色显示相应的类别。

但是,我收到以下错误。

The argument type 'Future<QuerySnapshot<Object?>>? Function(QuerySnapshot<Map<String, dynamic>>)' can't be assigned to the parameter type 'FutureOr<QuerySnapshot<Object?>> Function(QuerySnapshot<Map<String, dynamic>>)' because 'Future<QuerySnapshot<Object?>>?' is nullable and 'Future<QuerySnapshot<Object?>>' isn't.

我有哪些替代方案可以实现相同的功能?该操作发生在一个函数中,然后在 FutureBuilder 中调用和处理该函数。

getCategoryData(String _collection, {bool forMap = false}) {

  FirebaseFirestore.instance.collection('roles').where('uid', isEqualTo: FirebaseAuth.instance.currentUser!.uid).get().then((value){
      for (var element in value.docs) {
        if(forMap == false && element.data()['role'] == 'd'){
          Future<QuerySnapshot> _snapshot = FirebaseFirestore.instance.collection(_collection).where('for_d', isEqualTo: true).get();

          return _snapshot; 
        }else if((forMap == false && element.data()['role'] == 'p') || (forMap == true)){
          Future<QuerySnapshot> _snapshot = FirebaseFirestore.instance.collection(_collection).get();

          return _snapshot; 
        }
      }
  });
}

这里的问题是,您的 getCategoryData 函数有可能 return 一个空对象。

如果遍历所有文档并且其中 none 匹配给定的两个 if 条件,默认情况下 return 为空值。

您的数据库设计可能永远不会发生这种情况,但编译器并不知道。

您可以通过 return在 for 循环之后输入一个空的 future 来解决这个问题。编译器将不再显示此错误。虽然我希望你已经很好地设计了你的数据库,这种情况永远不会发生。