I am trying to pass a list of maps data(getting from firebase firestore array form) from one screen to another screen using getx in flutter.
This is my code first screen
final cartOrder = orderList.data.docs[index]['cartorder'];
final orderedDate = orderList.data.docs[index]['ordered_date'];
final delivered = orderList.data.docs[index]['delivered'];
return SizedBox(
height: 100,
width: double.infinity,
child: InkWell(
onTap: (() {
Get.toNamed("/order_details?cartOrder=$cartOrder");
// Get.to(OrderDetails(),arguments: cartOrder);
}),
child:
This is my second screen
var cartOrder = Get.parameters['cartOrder'];
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: cartOrder.length,
itemBuilder: (ctx, index) {
when passing data in the first screen the data looks like this (expandable while debugging) length of cartOrder is 2.
cartOrder =
[
{'name': 'xyz','id': '123'},
{'name': 'abc','id': '456'}
]
but when receiving on the second screen not (expandable but looks like concatenating) here length of cartorder is 4(name,id,name,id)
cartOrder =
[{'name': 'xyz','id': '123'},{'name': 'abc','id': '456'}]
how to solve this. Thanks a lot in advance.
CodePudding user response:
instead of this passing data like this.
Get.toNamed("/order_details?cartOrder=$cartOrder");
Try this.
Get.toNamed("/order_details",arguments:[cartOrder]);
and for getting data on second screen
var args = Get.arguments; // this should be placed before build method
var cartOrder = args[0]; // this should be placed after build method
CodePudding user response:
Unlike Get.arguments
, which returns dynamic
, Get.parameters
returns Map<String,String?>
. Therefore your actual data is always String
or null
.
So you shouldn't use parameters
to pass complex objects. Use arguments
instead.
If you really want to pass objects via parameters, you can serialise and send it (toJson
) and after receiving, de-serialise it. But I wouldn't recommend it.