Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter Dart中数据库数据的提取_Flutter_Dart - Fatal编程技术网

Flutter Dart中数据库数据的提取

Flutter Dart中数据库数据的提取,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&l

我有以下功能,可以为每个用户从数据库中提取订单数据。我的目标是打印每个用户的订单。然而,我得到了一些奇怪的错误

下面是函数:

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和67890是用户ID

以下是for循环中orderData的控制台日志:

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)

知道我为什么会得到空值吗?

您使用了错误的键,这就是为什么会得到空值

要从嵌套贴图中获取数量,必须执行以下操作:

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}}}
-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}
现在,如果您仔细查看,您会发现
12345
67890
是这个复杂映射中的第一个键,即“userID” 现在,

键12345包含嵌套的
映射
,其键和数据如下:

{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}}}
-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
是一个唯一的键,您想要的数据映射到它里面

正如@Adithya Shetty所提到的,您使用了错误的键,因为您的
orderData
实际上是一个只有一个属性的对象-
{-MMqL1Tkg-XXNHbKGz62
用于用户
12345
-MNY9DoItO4Vo9K0EOd5
用于用户
67890

为了能够获得所需的结果并动态访问它,您需要在
forEach
中添加另一个
forEach

Future fetchAllOrders()异步{
最终url=
'https://tb-936.firebaseio.com/orders.json?auth=$authToken';
最终响应=等待http.get(url);
加载的最终列表顺序=[];
最终extractedData=json.decode(response.body)作为映射;
打印('提取的数据为'+extractedData.toString());
extractedData.forEach((用户ID,订单){
打印('User id:$userId');
forEach((orderKey,orderData){
打印('订单数据为'+orderData.toString());
打印('orderKey:$orderKey');
打印(orderData['amount']);
打印(orderData['dateTime']);
打印(orderData['deliveryMethod']);
打印(orderData['uniqueOrderNumber']);
打印(orderData['isOrderComplete']);
打印(orderData['userId']);
});
});
}

我不太确定我是否遵循了。在第二行中,您硬编码了订单Id。但您实际如何获取它?第二行是由firebase生成的唯一密钥,动态执行它将是一项困难的工作。如果您使用firebase插件,或者我猜这是自动生成的文档Id,则会更好ted如果您没有为所有文档明确提供唯一id,我不能100%确定这一点,但它看起来像一个文档id@kovalyovi答案是这个问题的更好方法是的,你是对的,这将是更好的方法,而不是硬编码地图