firebase 闭包:()=>从函数'data'Map〈String,dynamic>:

e5nszbig  于 2023-02-09  发布在  其他
关注(0)|答案(4)|浏览(87)

因此,我试图从Firestore流数据,但当打印数据时,我得到:

I/扑动(8356):闭包:()=〉从函数'data'Map〈字符串,动态〉:.

我使用下面的代码来获取数据:

void messagesStream() async {
    Stream collectionStream = _firestore.collection('messages').snapshots();
    await for (var snapshot in collectionStream) {
      for (var message in snapshot.docs) {
        print(message.data());
      }
    }

当新数据被添加到消息集合时,我得到了Closure消息,因此它正在与数据库交互。
我想要的是打印出集合中新文档的内容。
任何帮助都很感激。

cig3rfwq

cig3rfwq1#

这并不是迭代Stream结果的方式,如果你有一个Stream并且你想处理它的结果,你应该使用listen()异步接收结果。

Stream collectionStream = _firestore.collection('messages').snapshots();
collectionStream.listen((QuerySnapshot querySnapshot) {
    querySnapshot.documents.forEach((document) => print(document.data()));
}

另请参阅:Firestore collection query as stream in flutter
您可能还想查看documentation,了解如何在Flutter中查询Firestore。

5sxhfpxr

5sxhfpxr2#

void getMessages() async {
   final messages= await _firestore.collection('messages').get();
   for(var message in messages.docs){
     print(message.data());

   }

这是工作检查这和调用getMessages()无论你想要一个调用

wb1gzix0

wb1gzix03#

我在几乎完全相同的代码中遇到了同样的问题(没有Stream变量)。我的建议是完全删除Stream变量(我测试了下面的代码,让它打印Firestore数据库中的数据):

void messagesStream() async {
    await for (var snapshot in _firestore.collection('messages').snapshots()) {
      for (var message in snapshot.docs) {
        print(message.data());
      }
    }
  }

或者,尝试添加QuerySnapShot作为Stream变量的数据类型(untested):

Stream<QuerySnapshot> collectionStream = _firestore.collection('messages').snapshots();

您还可以通过创建一个新的返回StreamBuilder的无状态小部件(MessagesStream)来替换整个方法:

class MessagesStream extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: _firestore.collection('messages').snapshots(),
      builder: (context, snapshot) {
       final messages = snapshot.data.docs;
       for (var message in messages) {
       print(message.data());
 }

......并在测试时以您认为合适的任何名称命名:

class _ChatScreenState extends State<ChatScreen> { (...)
body: Column(children: <Widget> [
//Just an example.
MessageStream(),
   ],
  ),
(...)
}

***如果您使用无状态小部件路径,请确保将_fireStore(应该是FirebaseFirestore.示例)设置为全局变量。

rsaldnfx

rsaldnfx4#

我在尝试抛出自定义错误类InkError时收到此错误:

  • 您需要在类中添加toMap
final response = await http.post(url, body: body, headers: headers);
    final json = jsonDecode(response.body);
    if (response.statusCode == HttpStatus.ok) {
      return json;
    } else {
      throw InkError(
        code: 0,
        message: json['message'],
        statusCode: response.statusCode,
      ).toMap();

墨水错误

class InkError {
  /// Error code.
  final int code;

  /// Error message.
  final String message;

  /// HTTP Status Code
  final int? statusCode;

  const InkError({
    required this.code,
    required this.message,
    this.statusCode,
  });

  factory InkError.fromJSON(Map<String, dynamic> json) => InkError(
        code: json['code'] as int,
        message: json['message'] as String,
        statusCode: json['statusCode'],
      );

  Map<String, dynamic> toMap() {
    return {
      'code': code,
      'message': message,
      'statusCode': statusCode,
    };
  }

  @override
  String toString() {
    return toMap().toString();
  }
}

相关问题