【问题标题】:Mapping Flutter Object with List to Firebase realtime DB将带有列表的 Flutter 对象映射到 Firebase 实时数据库
【发布时间】:2021-03-22 20:41:26
【问题描述】:

我正在尝试将我的轮询对象保存到 Firebase 实时数据库,但我真的不知道如何使用我的轮询对象执行此操作,因为它有一个列表。我试图找到一个教程如何将带有地图的对象映射到 Firebase,但没有找到。

class Poll {
  String id;
  String name;
  String description;
  List<Question> questions;

  Poll({this.name, this.description, this.questions});

  Poll.fromSnapshot(DataSnapshot snapshot) {
    id = snapshot.key;
    name = snapshot.value['name'];
    description = snapshot.value['description'];
    questions = snapshot.value['questions'];
  }

  toJson() {
    return {'name': name, 'description': description, 'questions': questions};
  }
}

class Question {
  String id;
  String question;
  String customAnswer;

  Question.customAnswer({this.question, this.customAnswer});

  Question.fromSnapshot(DataSnapshot snapshot) {
    id = snapshot.key;
    question = snapshot.value['question'];
    customAnswer = snapshot.value['customAnswer'];
  }

  toJson() {
    return {'question': question, 'customAnswer': customAnswer};
  }
}

这里我尝试写入 DB:

RaisedButton(
                onPressed: () async {
                  Poll poll1 =
                      Poll(name: 'poll1', description: 'desc1', questions: [
                    Question.customAnswer(
                        question: 'who am i', customAnswer: 'Ostap'),
                    Question.customAnswer(
                        question: 'who are you', customAnswer: 'test'),
                  ]);
                  await databaseReference
                      .child('Polls')
                      .push()
                      .set(poll1.toJson());
                },
                child: Text('Write To DB'),

这是我得到的错误:

Exception has occurred.
ArgumentError (Invalid argument: Instance of 'Question')

await databaseReference引起

有人可以帮助我吗?提前致谢!

【问题讨论】:

  • 简单保存对象会保存它。但要确保每个字段成员都有 getter 和 setter。
  • 这真的有用吗?类轮询{字符串ID;字符串名称;字符串描述;列出 问题;投票({this.name,this.description,this.questions}); Poll.fromSnapshot(DataSnapshot 快照) { id = snapshot.key;名称 = 快照.值 ['名称'];描述 = 快照.值 ['描述']; questions = snapshot.value['questions']; } toJson() { return {'name': name, 'description': description, 'questions': questions}; } }
  • 是的,应该。否则发布相关错误,以便我们为您提供帮助。
  • 谢谢,我试试看
  • 我收到一个错误,它说 databaseReference 也不是问题类型,这是我的 Qestion 类问题 { String id;字符串问题;字符串自定义答案; Question.customAnswer({this.question, this.customAnswer}); Question.fromSnapshot(DataSnapshot 快照) { id = snapshot.key;问题=快照。值['问题']; customAnswer = snapshot.value['customAnswer']; } toJson() { return {'question': question, 'customAnswer': customAnswer}; } }

标签: firebase flutter dart firebase-realtime-database


【解决方案1】:

如果您想将数据设置为每个节点下每个对象都有它的 id 而不是 0, 1, 2 ... 的格式,就像下面的地图

deliveryCharges: 2
hasPromoCode: true
id: "-MhHzoacmGb5839WG9_C"
uid: "LcZXgcW2VAfz34qJbu6QCm3u2B32"
 items:
   -MhCGlHJLOExb3eXxR08
       itemId: "-MhCElzl6B7FZMakA2Kr"
       itemName: "Regular package"
       itemPerPrice: 40
       itemQuantity: 3
       subtitle: "40 p.c"
       variationId: "-MhCGlHJLOExb3eXxR08"
  -MhCGlTiT2qy317c79_n
       itemId: "-MhCElzl6B7FZMakA2Kr"
       itemName: "Regular package"
       itemPerPrice: 100
       itemQuantity: 5
       subtitle: "60 p.c"
       variationId: "-MhCGlTiT2qy317c79_n"

订单类

class Order {
 String id;
 String uid;
 int timestamp;
 bool hasPromoCode;
 String promoCode;
 num promoDiscount;
 num deliveryCharges;
 num totalAmount;
 List<Cart> items;

 Order({
   @required this.id,
   @required this.uid,
   @required this.timestamp,
   @required this.deliveryCharges,
   @required this.totalAmount,
   @required this.items,
 });

 factory Order.fromMap(Map<dynamic, dynamic> map) {
   return new Order(
     id: map['id'] as String,
     uid: map['uid'] as String,
     timestamp: map['timestamp'] as int,
     deliveryCharges: map['deliveryCharges'],
     totalAmount: map['totalAmount'],
     items: map['items'] == null ? [] :Cart.toOrderItemList(map['items']),
   );
 }

 Map<dynamic, dynamic> toSetMap() {
   return {
     'id': this.id,
     'uid': this.uid,
     'timestamp': this.timestamp,
     'deliveryCharges': this.deliveryCharges,
     'totalAmount': this.totalAmount,
     'items': Cart.toOrderMap(this.items),
   } as Map<dynamic, dynamic>;
 }

}

class Cart {
 String itemId;
 String variationId;
 String itemName;
 String subtitle;
 num itemPerPrice;
 int itemQuantity;

 Cart({
   this.itemId,
   this.variationId,
   this.itemName,
   this.subtitle,
   this.itemPerPrice = 0.0,
   this.itemQuantity = 1,
 });

 factory Cart.fromMap(Map<dynamic, dynamic> map) {
   return new Cart(
     itemId: map['itemId'] as String,
     variationId: map['variationId'] as String,
     itemName: map['itemName'] as String,
     subtitle: map['subtitle'] as String,
     itemPerPrice: map['itemPerPrice'] ,
     itemQuantity: map['itemQuantity'] as int,
   );
 }

 Map<dynamic, dynamic> toMap() {
   return {
     'itemId': this.itemId,
     'variationId': this.variationId,
     'itemName': this.itemName,
     'subtitle': this.subtitle,
     'itemPerPrice': this.itemPerPrice,
     'itemQuantity': this.itemQuantity,
   } as Map<dynamic, dynamic>;
 }

 static Map<dynamic, dynamic> toOrderMap(List<Cart> cartItems) {
   Map<dynamic, dynamic> orderMap = new Map<dynamic, dynamic>();
   for (Cart cart in cartItems) {
     orderMap[cart.variationId] = {
       'itemId': cart.itemId,
       'variationId': cart.variationId,
       'itemName': cart.itemName,
       'subtitle': cart.subtitle,
       'itemPerPrice': cart.itemPerPrice,
       'itemQuantity': cart.itemQuantity,
     };
   }
   return orderMap;
 }

 static toOrderItemList(var map) {
   Map values = map as Map;
   List<Cart> cartItem = [];
   values.forEach((key, data) {
     final Cart connect = Cart.fromMap(data);
     cartItem.add(connect);
   });
  return cartItem;
 }

} }

它工作正常,我设置我的对象列表(购物车项目)并整体获取并将订单映射转换为订单对象,然后将 CartItem 映射到 List 到 cartItems。

【讨论】:

    【解决方案2】:

    我已经从你的代码中创建了一个 JSON

    {
      "id":"",
      "name":"",
      "description":"",
      "questions": [
          {
            "id":"",
            "question":"",
            "customAnswer":""
          }
      ]
    }
    

    然后生成飞镖类Use this website。您的对象类将如下所示。

    class Welcome {
    Welcome({
        this.id,
        this.name,
        this.description,
        this.questions,
    });
    
    String id;
    String name;
    String description;
    List<Question> questions;
    
    factory Welcome.fromJson(Map<String, dynamic> json) => Welcome(
        id: json["id"],
        name: json["name"],
        description: json["description"],
        questions: List<Question>.from(json["questions"].map((x) => Question.fromJson(x))),
    );
    
    Map<String, dynamic> toJson() => {
        "id": id,
        "name": name,
        "description": description,
        "questions": List<dynamic>.from(questions.map((x) => x.toJson())),
    };
    

    }

    class Question {
    Question({
        this.id,
        this.question,
        this.customAnswer,
    });
    
    String id;
    String question;
    String customAnswer;
    
    factory Question.fromJson(Map<String, dynamic> json) => Question(
        id: json["id"],
        question: json["question"],
        customAnswer: json["customAnswer"],
    );
    
    Map<String, dynamic> toJson() => {
        "id": id,
        "question": question,
        "customAnswer": customAnswer,
    };
    

    }

    现在您可以毫无错误地拨打await ...set(poll1.toJson());

    【讨论】:

    • 继续飘飘:-D
    • 我也试过这个,但是当我将我的 Firebase 数据映射到我的模型时,我得到了这个 --> [VERBOSE-2:ui_dart_state.cc(209)] 未处理的异常:类型'String' 不是 'Map' 类型的子类型有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 2017-10-02
    • 2017-07-11
    • 2021-10-01
    • 2021-11-16
    • 2013-08-18
    相关资源
    最近更新 更多