У меня возникла странная ситуация, когда 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'] на тип продукта, очевидно, он будет сильно жаловаться на то, что не знает, как его преобразовать.
Понятия не имею.
Надеюсь, я достаточно подробно описал проблему.
Заранее спасибо