#flutter #dart
#flutter #dart
Вопрос:
У меня есть следующая функция, которая извлекает данные заказа из базы данных для каждого пользователя. Моя цель — распечатать заказы каждого пользователя. Однако я получаю некоторые странные ошибки.
Вот функция:
Future<void> fetchAllOrders() async {
final url =
'https://tb-936.firebaseio.com/orders.json?auth=$authToken';
final response = await http.get(url);
final List<OrderItem> loadedOrders = [];
final extractedData = json.decode(response.body) as Map<String, dynamic>;
print('Extracted data is ' extractedData.toString());
extractedData.forEach((userId, orderData) {
print('Order data is ' orderData.toString());
print(orderData['amount']);
print(orderData['dateTime']);
print(orderData['deliveryMethod']);
print(orderData['uniqueOrderNumber']);
print(orderData['isOrderComplete']);
print(orderData['userId']);
});
}
Вот журнал консоли для извлеченных данных:
{12345: {-MMqL1Tkg-XXNHbKGz62: {amount: 75000.0, dateTime: 2020-11-23T21:22:51.817939, deliveryMethod: delivery, isOrderComplete: false, products: [{id: 2020-11-23 21:22:47.023541, price: 25000.0, quantity: 3, title: Mchuzi}], uniqueOrderNumber: TBOJ43, userId: 12345}}, 67890: {-MNY9DoItO4Vo9K0EOd5: {amount: 250000.0, dateTime: 2020-12-02T14:14:12.022284, deliveryMethod: pickup, isOrderComplete: false, products: [{id: 2020-12-02 14:13:32.093068, price: 25000.0, quantity: 10, title: Mchuzi}], uniqueOrderNumber: TBQKJP, userId: 67890}}}
Где 12345 и 67890 — идентификаторы пользователей.
Вот журнал консоли для orderData внутри цикла for:
Order data is {-MMqL1Tkg-XXNHbKGz62: {amount: 75000.0, dateTime: 2020-11-23T21:22:51.817939, deliveryMethod: delivery, isOrderComplete: false, products: [{id: 2020-11-23 21:22:47.023541, price: 25000.0, quantity: 3, title: Mchuzi}], uniqueOrderNumber: TBOJ43, userId: 12345}}
I/flutter ( 5975): null
I/chatty ( 5975): uid=10227(com.example.tb) 1.ui identical 4 lines
I/flutter ( 5975): null
I/flutter ( 5975): Order data is {-MNY9DoItO4Vo9K0EOd5: {amount: 250000.0, dateTime: 2020-12-02T14:14:12.022284, deliveryMethod: pickup, isOrderComplete: false, products: [{id: 2020-12-02 14:13:32.093068, price: 25000.0, quantity: 10, title: Mchuzi}], uniqueOrderNumber: TBQKJP, userId: 67890}}
I/flutter ( 5975): null
I/chatty ( 5975): uid=10227(com.example.tb) 1.ui identical 4 lines
I/flutter ( 5975): null
D/Surface ( 5975): Surface::disconnect(this=0x7e78146000,api=1)
D/Surface ( 5975): Surface::disconnect(this=0x7e78146000,api=-1)
D/Surface ( 5975): Surface::disconnect(this=0x7e78033000,api=1)
Есть идеи, почему я получаю нули?
Ответ №1:
Как упоминалось @Adithya Shetty, вы используете неправильные ключи, потому orderData
что на самом деле ваш объект имеет только одно свойство — {-MMqL1Tkg-XXNHbKGz62
для пользователя 12345
и -MNY9DoItO4Vo9K0EOd5
для пользователя 67890
.
Чтобы иметь возможность достичь нужного вам результата и получить к нему доступ динамически, вам необходимо добавить еще forEach
один внутри вашего forEach
:
Future<void> fetchAllOrders() async {
final url =
'https://tb-936.firebaseio.com/orders.json?auth=$authToken';
final response = await http.get(url);
final List<OrderItem> loadedOrders = [];
final extractedData = json.decode(response.body) as Map<String, dynamic>;
print('Extracted data is ' extractedData.toString());
extractedData.forEach((userId, order) {
print('User id: $userId');
order.forEach((orderKey, orderData) {
print('Order data is ' orderData.toString());
print('Order key: $orderKey');
print(orderData['amount']);
print(orderData['dateTime']);
print(orderData['deliveryMethod']);
print(orderData['uniqueOrderNumber']);
print(orderData['isOrderComplete']);
print(orderData['userId']);
});
});
}
Комментарии:
1. да, вы правы, это был бы лучший подход вместо жесткого кодирования карт
Ответ №2:
Вы используете неправильные ключи, поэтому вы получаете null.
Чтобы получить сумму из вложенной карты, вам нужно будет сделать что-то вроде этого:
map data1 = orderData['12345'];
map data2 = data1['-MMqL1Tkg-XXNHbKGz62'];
map amount = data2['amount'];
Из orderData.toString
выходных данных вы можете получить представление о структуре карты.
Ваш вывод выглядит следующим образом:
{12345: {-MMqL1Tkg-XXNHbKGz62: {amount: 75000.0, dateTime: 2020-11-23T21:22:51.817939, deliveryMethod: delivery, isOrderComplete: false, products: [{id: 2020-11-23 21:22:47.023541, price: 25000.0, quantity: 3, title: Mchuzi}], uniqueOrderNumber: TBOJ43, userId: 12345}}, 67890: {-MNY9DoItO4Vo9K0EOd5: {amount: 250000.0, dateTime: 2020-12-02T14:14:12.022284, deliveryMethod: pickup, isOrderComplete: false, products: [{id: 2020-12-02 14:13:32.093068, price: 25000.0, quantity: 10, title: Mchuzi}], uniqueOrderNumber: TBQKJP, userId: 67890}}}
Теперь, если вы внимательно посмотрите, вы найдете 12345
и 67890
в качестве первого ключа внутри этой сложной карты, который
теперь является идентификатором пользователя,
ключ 12345 содержит вложенные map
ключи и данные with следующим образом:
-MMqL1Tkg-XXNHbKGz62: {amount: 75000.0, dateTime: 2020-11-23T21:22:51.817939, deliveryMethod: delivery, isOrderComplete: false, products: [{id: 2020-11-23 21:22:47.023541, price: 25000.0, quantity: 3, title: Mchuzi}], uniqueOrderNumber: TBOJ43, userId: 12345}
-MMqL1Tkg-XXNHbKGz62
это уникальный ключ, и нужные вам данные отображаются внутри него
Комментарии:
1. Я не совсем уверен, что следую. Во второй строке вы жестко закодировали идентификатор заказа. Но как вы на самом деле их извлекаете?
2. вторая строка — это уникальный ключ, который генерируется firebase, и выполнение его динамически было бы сложной задачей. Было бы лучше, если бы вы использовали плагин Firebase, или я предполагаю, что это идентификатор документа, который генерируется автоматически, если вы явно не указали уникальный идентификатор для всех документов, я не уверен в этом на 100%, но это похоже на идентификатор документа
3. Ответ @kovalyovi — лучший подход к этому вопросу