簡體   English   中英

如何從 firebase 數據庫 flutter 中的 map 獲取值

[英]how to get value from map in firebase database flutter

我有這樣的 json 結構

{
  "-My6relBpWvPaY_I4JvN": {
    "idUser": "4dca8440-a37d-11ec-9c66-9b8f61be17f0", 
    "message": "777777"
  }
}

我想使用 fromJson 保存到 map,這是我的 model:

class Message {
  final String userId;
  final String message;

  const Message({
    @required this.userId,
    @required this.message,
  });

  static Message fromJson(Map<String, dynamic> json) => Message(
        userId: json['idUser'],
        message: json['message'],
      );


  Map<String, dynamic> toJson() => {
        'idUser': userId,
        'message': message,
      };
}

現在我總是從 Frank 的幫助下得到 null,

final data = Map<String, dynamic>.from(snapshot.value as Map);
Message message = Message.fromJson(data);

print('message value${message.message}'); // here i got null

請告訴我哪里錯了。

----------更新----------

嗨,弗蘭克,首先感謝您的回復,我將從 firebase RTDB 中獲得一個 stream,因為數據結構如上所示,使用我從以下方法獲得的數據,

final Map<String, dynamic> data = Map<String, dynamic>.from(snapshot.value as Map);

數據中的鍵為{"-My6relBpWvPaY_I4JvN"} ,值為

{
    "idUser": "4dca8440-a37d-11ec-9c66-9b8f61be17f0", 
    "message": "777777"
  }

所以在這種情況下我需要更新你展示的方法

//**instead** snapshot.children.forEach((msgSnapshot) {
  data.values.forEach((msgSnapshot) {

  final Map<String, dynamic> messageData = Map<String, dynamic>.from(msgSnapshot as Map);
  //i am not sure whether I need to use msgSnapshot.value as Map, since msgSnaphot is already the right Map<String, dynamic> that I can put to fromJson      

  Message message = Message.fromJson(messageData);

})

我理解正確嗎? 感謝您提供更多信息!

在我的情況下,我的設置是這樣的,女巫工作得很好:

  static Message model({required Map map}) => Message(
        messageID: map[kModelMessengerID],
        owner: map[kModelMessageOwner],
        type: map[kModelMessageType],
        msg: map[kModelMessageMsg],
        membersIDs: (map[kModelMessageMembersIDs] as List<dynamic>)
            .map((e) => e.toString())
            .toList(),
        createdAt: map[kModelMessageCreatedAt] == null
            ? DateTime.now()
            : (map[kModelMessageCreatedAt] as Timestamp).toDate(),
      );

以及我如何將數據傳遞給它:

final ref = FirebaseDatabase.instance.ref();
final snapshot = await ref.child(...).get();

if (snapshot.exists) {
    var m  = Message.model(map: snapshot.value as Map))
} else {
    print('No data available.');
}

您問題中的代碼沒有顯示snapshot是如何初始化的,但我的猜測是它包含一個消息列表。 即使是包含 1 條消息的列表仍然是一個列表,因此您必須在代碼中通過迭代快照的children屬性來處理它:

snapshot.children.forEach((msgSnapshot) {
  final data = Map<String, dynamic>.from(msgSnapshot.value as Map);
  Message message = Message.fromJson(data);

  print('message value${message.message}');
})

您的 JSON 應如下所示:

{"userId": "4dca8440-a37d-11ec-9c66-9b8f61be17f0", "message": "777777"}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM