Firestore ожидает другого типа при добавлении документа - PullRequest
0 голосов
/ 30 октября 2018

У меня возникла странная ситуация, когда Firestore ожидает объект, который я создал, вместо DocumentReference, который я пытаюсь передать функции add ().

Нажав на кнопку отправки, я звоню submitForm ()

submitForm() {
    // mockup of an order list
    orderListInput = [{
      'product': _ws.products.firstWhere((p) => p.id == 'i5ZLMIyT6gu7NcNkWNkB'), // a Product object
      'quantity': 43,
      'unit': 'st',
    }];
    deliveryListInput = orderListInput;
    statusInput = 'approved';

    if (true) { // TODO: do some check
      _os.postItem(Order(
          customerInput,
          DateTime.now(),
          deliveryDateInput,
          orderListInput,
          statusInput,
          deliveryNoteInput,
          deliveryListInput,
          etaInput,
          deliveredDateInput,
      ));
    }
  }

Файл класса My Order:

library mango.order;

import 'package:firebase/firebase.dart' as fb;
import 'customer.dart';
import 'product.dart';

const String jsonTagId = 'id';
const String jsonTagCustomer = 'customer';
const String jsonTagDateAdded = 'dateAdded';
const String jsonTagDeliveryDate = 'deliveryDate';
const String jsonTagOrderList = 'orderList';
const String jsonTagStatus = 'status';
const String jsonTagETA = 'eta';
const String jsonTagDeliveryNote = 'deliveryNote';
const String jsonTagDeliveryList = 'deliveryList';
const String jsonTagDeliveredDate = 'deliveredDate';

class Order {
  String id;
  Customer customer;
  DateTime dateAdded;
  DateTime deliveryDate;
  List<Map<String, dynamic>> orderList;
  DateTime eta;
  String status;
  String deliveryNote;
  List<Map<String, dynamic>> deliveryList;
  DateTime deliveredDate;

  Order(
      this.customer,
      this.dateAdded,
      this.deliveryDate,
      this.orderList,
      this.status, [
        this.deliveryNote,
        this.deliveryList,
        this.eta,
        this.deliveredDate,
        this.id,
      ]);

  static Map toMap(Order item) {
    item.orderList.forEach((e) {
      e['product'] = fb.firestore().doc((e['product'] as Product).path);
    });

    item.deliveryList.forEach((e) {
      e['product'] = fb.firestore().doc((e['product'] as Product).path);
    });

    Map<String, dynamic> order = {
      jsonTagCustomer: fb.firestore().doc(item.customer.path),
      jsonTagDateAdded: item.dateAdded,
      jsonTagDeliveryDate: item.deliveryDate,
      jsonTagOrderList: item.orderList,
      jsonTagStatus: item.status,
      jsonTagDeliveryNote: item.deliveryNote,
      jsonTagDeliveryList: item.deliveryList,
      jsonTagETA: item.eta,
      jsonTagDeliveredDate: item.deliveredDate,
    };
    return order;
  }
}

Файл класса My Product:

library mango.product;

const String jsonTagId = 'id';
const String jsonTagName = 'name';
const String jsonTagQuantity = 'quantity';
const String jsonTagDefaultUnit = 'defaultUnit';

class Product {
  String id;
  String path;
  String name;
  num quantity;
  String defaultUnit;

  Product(this.name, this.quantity, this.defaultUnit, [this.id, this.path]);

  static Map toMap(Product item) {
    Map<String, dynamic> product = {
      jsonTagName: item.name,
      jsonTagQuantity: item.quantity,
      jsonTagDefaultUnit: item.defaultUnit,
    };
    return product;
  }
}

и метод postItem службы OrderService делают это:

postItem(Order item) async {
    try {
      await _rootRef.add(Order.toMap(item));
    }
    catch (err) {
      print('Error adding Order to database: $err');
    }
  }
}

получение этой ошибки при запуске:

Error adding Order to database: Type 'DocumentReference' is not a subtype of expected type 'Product'.

относится к orderListInput и deliveryListInput , которые структурированы следующим образом:

[
    {
        'product': DocumentReference,
        'quantity': num,
        'unit': String,
    },
    ...
]

изменение orderListInput [0] ['product'] на тип продукта, очевидно, он будет сильно жаловаться на то, что не знает, как его преобразовать.

Понятия не имею. Надеюсь, я достаточно подробно описал проблему.

Заранее спасибо

...