JSONPath extracting values - scala

I want extract all the offerId's from just one of the membershipId's below:
{
"resultCode": "SUCCESS",
"errorCode": null,
"errorMessage": null,
"membershipCoupons":
[
{
"membershipId": "32021428",
"coupons":
[
{
"offerId": "000C291EE8241ED4AAF43058D8564910",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D8564910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D8564910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": 1423579699407,
"redemption": null
},
{
"offerId": "000C291EE8241ED4AAF43058D857A910",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D857A910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D857A910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": 1423579703400,
"redemption": null
},
{
"offerId": "000C291EE8241ED4AAF43058D8608910",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D8608910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D8608910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": 1423579706707,
"redemption": null
},
{
"offerId": "000C291EE8241ED4AAF43058D862E910",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D862E910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D862E910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": 1423579710047,
"redemption": null
},
{
"offerId": "000C291EE8241ED4AAF43058D87A0910",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D87A0910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D87A0910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": 1423579713540,
"redemption": null
},
{
"offerId": "000C291EE8241ED4AAF43058D877E910",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D877E910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D877E910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": 1423579717533,
"redemption": null
},
{
"offerId": "000C291EE8241ED4AAF43058D87B8910",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D87B8910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D87B8910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": 1423579721123,
"redemption": null
},
{
"offerId": "000C291EE8241ED4AAF43058D8870910",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D8870910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D8870910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": 1423579724430,
"redemption": null
},
{
"offerId": "000C297765971EE4A8C22C6999219BA4",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201504_003/000C297765971EE4A8C22C6999219BA4Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201504_003/000C297765971EE4A8C22C6999219BA4High.jpg"
}
],
"endTime": 1425168000000,
"activationDate": 1423136616203,
"redemption": null
},
{
"offerId": "000C297765971EE4A8C22C699921FBA4",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201504_003/000C297765971EE4A8C22C699921FBA4Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201504_003/000C297765971EE4A8C22C699921FBA4High.jpg"
}
],
"endTime": 1425168000000,
"activationDate": 1423139501440,
"redemption": null
},
{
"offerId": "000C297765971EE4A8C22C6999233BA4",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201504_003/000C297765971EE4A8C22C6999233BA4Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201504_003/000C297765971EE4A8C22C6999233BA4High.jpg"
}
],
"endTime": 1425168000000,
"activationDate": 1423215586673,
"redemption": null
}
]
},
{
"membershipId": "8315319211",
"coupons":
[
{
"offerId": "000C291EE8241ED4AAF43058D85CA910",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D85CA910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D85CA910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": null,
"redemption": null
},
{
"offerId": "000C291EE8241ED4AAF43058D85F6910",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D85F6910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D85F6910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": null,
"redemption": null
},
{
"offerId": "000C291EE8241ED4AAF43058D85E2910",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D85E2910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D85E2910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": null,
"redemption": null
},
{
"offerId": "000C291EE8241ED4AAF43058D85FC910",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D85FC910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D85FC910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": null,
"redemption": null
},
{
"offerId": "000C291EE8241ED4AAF43058D8776910",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D8776910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D8776910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": null,
"redemption": null
},
{
"offerId": "000C291EE8241ED4AAF43058D87A8910",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D87A8910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D87A8910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": null,
"redemption": null
},
{
"offerId": "000C291EE8241ED4AAF43058D87B6910",
"description": "nora",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D87B6910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D87B6910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": null,
"redemption": null
},
{
"offerId": "000C291EE8241ED4AAF43058D87D0910",
"description": "nora.",
"graphics":
[
{
"width": 400,
"height": 200,
"quality": "Low",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D87D0910Low.jpg"
},
{
"width": 900,
"height": 600,
"quality": "High",
"url": "https://site/02_201506_011/000C291EE8241ED4AAF43058D87D0910High.jpg"
}
],
"endTime": 1423353600000,
"activationDate": null,
"redemption": null
}
]
}
]
}
I have something that works for both memberId's but I want to parameterize so that I pick only the offerId's for a parameter I have in a session that I usually reference like this ${medlem}, I use Scala.
This works:
.check(jsonPath("$.membershipCoupons[*].coupons[?(#.activationDate==null)].offerId").findAll.optional.saveAs("itemList"))
But how can I say this with a parameter pointing to a specific memberId something like this:
.check(jsonPath("$.membershipCoupons[membershipId[${medlem}]].coupons[?(#.activationDate==null)].offerId").findAll.optional.saveAs("itemList"))

I think you need to split operation on 2 steps:
arrayMembershipId = $.membershipCoupons[*].membershipId
n = getIndex(membershipIdArray, yourcode)
arrayOffer = membershipCoupons[n].coupons[?(#.activationDate==null)].offerId

Related

MongoDB aggregation re-group deep nested array of objects

Good day all,
I need some help figuring out this aggregation issue. I have a document with nested arrays where I want to perform lookups on the nested array's values after which I want to restore the document to its original structure. see below:
[
{
"_id": "63c7fec2fe9afea23afdbcef",
"primary_language": "en",
"image_link": "avatar_image_linl",
"description": ["Some description text here"],
"source": "community",
"standard": "imperial",
"gender": "male",
"base_a": 47,
"base_w": 220,
"base_h": 71.65,
"status": "draft",
"date_created": "2023-01-18T14:14:26.201Z",
"product_plan": {
"p_len": 4,
"p_fre": 1,
"p_qua": 4,
"avg_len": 3583,
"total_wor": 16,
"total_exe": 128,
"plan": {
"field_we": 1,
"field_da": 1,
"field_ti": 1,
"field_rest_we": false,
"field_rest_da": false,
"product": {
"name": "W111",
"comment": {
"en": ""
},
"pro_diff": [
{
"itemID": 2,
"description": "Intermediate"
}
],
"pro_int": [
{
"itemID": 2,
"description": "Moderate"
}
],
"pro_dur": 3736,
"nbr_exe": 8,
"target_mus": [
{
"itemID": 1,
"description": "Adominorus"
},
{
"itemID": 16,
"description": "Tricerus"
},
{
"itemID": 5,
"description": "Chiwawak"
}
],
"target_are": [
{
"itemID": 1,
"description": "Adominorus"
},
{
"itemID": 4,
"description": "Chiwawak"
},
{
"itemID": 2,
"description": "Amanus"
}
],
"items": {
"itemid": 44,
"target_are": [
{
"itemID": 4,
"description": "Chiwawak"
}
],
"target_mus": [
{
"itemID": 5,
"description": "Chiwawak"
}
],
"nbr_ref": 4,
"int_rec": "06~10",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 520,
"_id": "63ca9b798d47745ae5589906",
"status": 0,
"pct_complete": 0,
"set": []
},
"isCustomName": false,
"status": 0,
"pct_complete": 0
},
"_id": "63ca95368d47745ae558985e"
},
"_id": "63c7fec2fe9afea23afdbcf0"
},
"title": "Short Title text here",
"itemID": "bodyfyme882212-1674051266.214",
"__v": 32
},
{
"_id": "63c7fec2fe9afea23afdbcef",
"primary_language": "en",
"image_link": "avatar_image_linl",
"description": ["Some description text here"],
"source": "community",
"standard": "imperial",
"gender": "male",
"base_a": 47,
"base_w": 220,
"base_h": 71.65,
"status": "draft",
"date_created": "2023-01-18T14:14:26.201Z",
"product_plan": {
"p_len": 4,
"p_fre": 1,
"p_qua": 4,
"avg_len": 3583,
"total_wor": 16,
"total_exe": 128,
"plan": {
"field_we": 1,
"field_da": 1,
"field_ti": 1,
"field_rest_we": false,
"field_rest_da": false,
"product": {
"name": "W111",
"comment": {
"en": ""
},
"pro_diff": [
{
"itemID": 2,
"description": "Intermediate"
}
],
"pro_int": [
{
"itemID": 2,
"description": "Moderate"
}
],
"pro_dur": 3736,
"nbr_exe": 8,
"target_mus": [
{
"itemID": 1,
"description": "Adominorus"
},
{
"itemID": 16,
"description": "Tricerus"
},
{
"itemID": 5,
"description": "Chiwawak"
}
],
"target_are": [
{
"itemID": 1,
"description": "Adominorus"
},
{
"itemID": 4,
"description": "Chiwawak"
},
{
"itemID": 2,
"description": "Amanus"
}
],
"items": {
"itemid": 339,
"target_are": [
{
"itemID": 4,
"description": "Chiwawak"
}
],
"target_mus": [
{
"itemID": 5,
"description": "Chiwawak"
}
],
"nbr_ref": 3,
"int_rec": "06~10",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 390,
"_id": "63ca9b798d47745ae5589907",
"status": 0,
"pct_complete": 0,
"set": []
},
"isCustomName": false,
"status": 0,
"pct_complete": 0
},
"_id": "63ca95368d47745ae558985e"
},
"_id": "63c7fec2fe9afea23afdbcf0"
},
"title": "Short Title text here",
"itemID": "bodyfyme882212-1674051266.214",
"__v": 32
},
{
"_id": "63c7fec2fe9afea23afdbcef",
"primary_language": "en",
"image_link": "avatar_image_linl",
"description": ["Some description text here"],
"source": "community",
"standard": "imperial",
"gender": "male",
"base_a": 47,
"base_w": 220,
"base_h": 71.65,
"status": "draft",
"date_created": "2023-01-18T14:14:26.201Z",
"product_plan": {
"p_len": 4,
"p_fre": 1,
"p_qua": 4,
"avg_len": 3583,
"total_wor": 16,
"total_exe": 128,
"plan": {
"field_we": 1,
"field_da": 2,
"field_ti": 1,
"field_rest_we": false,
"field_rest_da": false,
"product": {
"name": "W121",
"comment": {
"en": ""
},
"pro_diff": [
{
"itemID": 2,
"description": "Intermediate"
}
],
"pro_int": [
{
"itemID": 2,
"description": "Moderate"
}
],
"pro_dur": 2674,
"nbr_exe": 6,
"target_mus": [
{
"itemID": 9,
"description": "Lats"
},
{
"itemID": 10,
"description": "Lower Back"
},
{
"itemID": 11,
"description": "Middle Back"
}
],
"target_are": [
{
"itemID": 3,
"description": "Back"
}
],
"items": {
"itemid": 47,
"target_are": [
{
"itemID": 3,
"description": "Back"
}
],
"target_mus": [
{
"itemID": 10,
"description": "Lower Back"
}
],
"nbr_ref": 4,
"int_rec": "06~10",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 520,
"_id": "63caa1568d47745ae5589b25",
"status": 0,
"pct_complete": 0,
"set": []
},
"isCustomName": false,
"status": 0,
"pct_complete": 0
},
"_id": "63ca9b8e8d47745ae558994b"
},
"_id": "63c7fec2fe9afea23afdbcf0"
},
"title": "Short Title text here",
"itemID": "bodyfyme882212-1674051266.214",
"__v": 32
},
{
"_id": "63c7fec2fe9afea23afdbcef",
"primary_language": "en",
"image_link": "avatar_image_linl",
"description": ["Some description text here"],
"source": "community",
"standard": "imperial",
"gender": "male",
"base_a": 47,
"base_w": 220,
"base_h": 71.65,
"status": "draft",
"date_created": "2023-01-18T14:14:26.201Z",
"product_plan": {
"p_len": 4,
"p_fre": 1,
"p_qua": 4,
"avg_len": 3583,
"total_wor": 16,
"total_exe": 128,
"plan": {
"field_we": 1,
"field_da": 2,
"field_ti": 1,
"field_rest_we": false,
"field_rest_da": false,
"product": {
"name": "W121",
"comment": {
"en": ""
},
"pro_diff": [
{
"itemID": 2,
"description": "Intermediate"
}
],
"pro_int": [
{
"itemID": 2,
"description": "Moderate"
}
],
"pro_dur": 2674,
"nbr_exe": 6,
"target_mus": [
{
"itemID": 9,
"description": "Lats"
},
{
"itemID": 10,
"description": "Lower Back"
},
{
"itemID": 11,
"description": "Middle Back"
}
],
"target_are": [
{
"itemID": 3,
"description": "Back"
}
],
"items": {
"itemid": 495,
"target_are": [
{
"itemID": 3,
"description": "Back"
}
],
"target_mus": [
{
"itemID": 11,
"description": "Middle Back"
}
],
"nbr_ref": 3,
"int_rec": "10~12",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 414,
"_id": "63caa1568d47745ae5589b26",
"status": 0,
"pct_complete": 0,
"set": []
},
"isCustomName": false,
"status": 0,
"pct_complete": 0
},
"_id": "63ca9b8e8d47745ae558994b"
},
"_id": "63c7fec2fe9afea23afdbcf0"
},
"title": "Short Title text here",
"itemID": "bodyfyme882212-1674051266.214",
"__v": 32
},
{
......
}
]
Now i want to get the document back to this structure using aggregation.
{
"_id": "63c7fec2fe9afea23afdbcef",
"primary_language": "en",
"image_link": "avatar_image_linl",
"description": ["Some description text here"],
"source": "community",
"standard": "imperial",
"gender": "male",
"base_a": 47,
"base_w": 220,
"base_h": 71.65,
"status": "draft",
"date_created": "2023-01-18T14:14:26.201Z",
"product_plan": {
"p_len": 4,
"p_fre": 1,
"p_qua": 4,
"avg_len": 3583,
"total_wor": 16,
"total_exe": 128,
// Group plan here by product_plan._id
"plan": [
{
"field_we": 1,
"field_da": 1,
"field_ti": 1,
"field_rest_we": false,
"field_rest_da": false,
"product": {
"name": "W111",
"comment": {
"en": ""
},
"pro_diff": [
{
"itemID": 2,
"description": "Intermediate"
}
],
"pro_int": [
{
"itemID": 2,
"description": "Moderate"
}
],
"pro_dur": 3736,
"nbr_exe": 8,
"target_mus": [
{
"itemID": 1,
"description": "Adominorus"
},
{
"itemID": 16,
"description": "Tricerus"
},
{
"itemID": 5,
"description": "Chiwawak"
}
],
"target_are": [
{
"itemID": 1,
"description": "Adominorus"
},
{
"itemID": 4,
"description": "Chiwawak"
},
{
"itemID": 2,
"description": "Amanus"
}
],
// group items by plan._id
"items": [
{
"itemid": 44,
"target_are": [
{
"itemID": 4,
"description": "Chiwawak"
}
],
"target_mus": [
{
"itemID": 5,
"description": "Chiwawak"
}
],
"nbr_ref": 4,
"int_rec": "06~10",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 520,
"_id": "63ca9b798d47745ae5589906",
"status": 0,
"pct_complete": 0,
"set": []
},
{
"itemid": 339,
"target_are": [
{
"itemID": 4,
"description": "Chiwawak"
}
],
"target_mus": [
{
"itemID": 5,
"description": "Chiwawak"
}
],
"nbr_ref": 3,
"int_rec": "06~10",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 390,
"_id": "63ca9b798d47745ae5589907",
"status": 0,
"pct_complete": 0,
"set": []
},
],
"isCustomName": false,
"status": 0,
"pct_complete": 0
},
"_id": "63ca95368d47745ae558985e"
},
{
"field_we": 1,
"field_da": 2,
"field_ti": 1,
"field_rest_we": false,
"field_rest_da": false,
"product": {
"name": "W121",
"comment": {
"en": ""
},
"pro_diff": [
{
"itemID": 2,
"description": "Intermediate"
}
],
"pro_int": [
{
"itemID": 2,
"description": "Moderate"
}
],
"pro_dur": 2674,
"nbr_exe": 6,
"target_mus": [
{
"itemID": 9,
"description": "Lats"
},
{
"itemID": 10,
"description": "Lower Back"
},
{
"itemID": 11,
"description": "Middle Back"
}
],
"target_are": [
{
"itemID": 3,
"description": "Back"
}
],
// group items by plan._id
"items": [
{
"itemid": 47,
"target_are": [
{
"itemID": 3,
"description": "Back"
}
],
"target_mus": [
{
"itemID": 10,
"description": "Lower Back"
}
],
"nbr_ref": 4,
"int_rec": "06~10",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 520,
"_id": "63caa1568d47745ae5589b25",
"status": 0,
"pct_complete": 0,
"set": []
},
{
"itemid": 495,
"target_are": [
{
"itemID": 3,
"description": "Back"
}
],
"target_mus": [
{
"itemID": 11,
"description": "Middle Back"
}
],
"nbr_ref": 3,
"int_rec": "10~12",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 414,
"_id": "63caa1568d47745ae5589b26",
"status": 0,
"pct_complete": 0,
"set": []
}
],
"isCustomName": false,
"status": 0,
"pct_complete": 0
},
"_id": "63ca9b8e8d47745ae558994b"
}
],
"_id": "63c7fec2fe9afea23afdbcf0"
},
"title": "Short Title text here",
"itemID": "bodyfyme882212-1674051266.214",
"__v": 32
}
Any help would be greatly appreciated

Vega custom tooltip data visualisation

Could anyone help be to develop a tooltip at line chart that looks like this?
Here is my spec at Vega Lite Editor.
Tooltips work on key:value pairs. If you amend your input data to an object of key value pairs and create a flatten transform, you can achieve your desired behaviour. I have changed all the tooltips below to be identical for speed but you should see the pattern.
{
"description": "Total Count line chart.",
"width": 1200,
"height": 450,
"padding": 5,
"signals": [{"name": "interpolate", "value": "linear"}],
"legends": [
{
"fill": "color",
"orient": "bottom",
"direction": "horizontal",
"symbolType": "square"
}
],
"data": [
{
"name": "table",
"values": [
{
"x": 0,
"y": 30,
"c": "Passenger Vessel",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 1,
"y": 20,
"c": "Passenger Vessel",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 2,
"y": 90,
"c": "Passenger Vessel",
"tooltip": [
{
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 3,
"y": 60,
"c": "Passenger Vessel",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 4,
"y": 50,
"c": "Passenger Vessel",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 5,
"y": 40,
"c": "Passenger Vessel",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 6,
"y": 10,
"c": "Passenger Vessel",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 0,
"y": 50,
"c": "Pleasure Craft",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 1,
"y": 10,
"c": "Pleasure Craft",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 2,
"y": 50,
"c": "Pleasure Craft",
"tooltip": [
{
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 3,
"y": 40,
"c": "Pleasure Craft",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 4,
"y": 110,
"c": "Pleasure Craft",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 5,
"y": 40,
"c": "Pleasure Craft",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 6,
"y": 20,
"c": "Pleasure Craft",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{"x": 0, "y": 50, "c": "Unknown", "tooltip": [{}]},
{"x": 1, "y": 60, "c": "Unknown", "tooltip": [{}]},
{"x": 2, "y": 90, "c": "Unknown", "tooltip": [{}]},
{"x": 3, "y": 40, "c": "Unknown", "tooltip": [{}]},
{"x": 4, "y": 50, "c": "Unknown", "tooltip": [{}]},
{"x": 5, "y": 20, "c": "Unknown", "tooltip": [{}]},
{"x": 6, "y": 40, "c": "Unknown", "tooltip": [{}]}
],
"transform": [{"type": "flatten", "fields": ["tooltip"]}]
}
],
"scales": [
{
"name": "x",
"type": "point",
"range": "width",
"domain": {"data": "table", "field": "x"}
},
{
"name": "y",
"type": "linear",
"range": "height",
"nice": true,
"zero": true,
"domain": {"data": "table", "field": "y"}
},
{
"name": "color",
"type": "ordinal",
"range": ["#BA20CE", "#60cf85", "#cd2c4f"],
"domain": {"data": "table", "field": "c"}
}
],
"axes": [
{"orient": "bottom", "scale": "x"},
{"orient": "left", "scale": "y"}
],
"config": {
"style": {
"guide-label": {"fontSize": 14, "fill": "#cccccc", "fontWeight": 800}
},
"axis": {"grid": true, "gridColor": "#333333"}
},
"marks": [
{
"type": "group",
"from": {"facet": {"name": "series", "data": "table", "groupby": "c"}},
"marks": [
{
"type": "line",
"from": {"data": "series"},
"encode": {
"enter": {
"x": {"scale": "x", "field": "x"},
"y": {"scale": "y", "field": "y"},
"stroke": {"scale": "color", "field": "c"},
"strokeWidth": {"value": 2}
},
"update": {
"interpolate": {"signal": "interpolate"},
"strokeOpacity": {"value": 1}
},
"hover": {"strokeOpacity": {"value": 0.5}}
}
},
{
"type": "symbol",
"from": {"data": "series"},
"encode": {
"update": {
"x": {"scale": "x", "field": "x"},
"y": {"scale": "y", "field": "y"},
"fillOpacity": {"value": 0}
},
"hover": {
"fillOpacity": {"value": 1},
"fill": {"scale": "color", "field": "c"},
"cursor": {"value": "pointer"},
"tooltip": {"signal": "datum['tooltip'] "}
}
}
}
]
}
]
}

Flutter Http response body from String to List of Object

Hi I am currently trying to fetch some data from an API, for later casting it to my Object Class.
The json answer i receive is instead of a list, directly a String.
{
"00-01": {
"date": "24-08-2022",
"hour": "00-01",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 617.5,
"units": "€/Mwh"
},
"01-02": {
"date": "24-08-2022",
"hour": "01-02",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 640.05,
"units": "€/Mwh"
},
"02-03": {
"date": "24-08-2022",
"hour": "02-03",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 670.26,
"units": "€/Mwh"
},
"03-04": {
"date": "24-08-2022",
"hour": "03-04",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 683.64,
"units": "€/Mwh"
},
"04-05": {
"date": "24-08-2022",
"hour": "04-05",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 692.88,
"units": "€/Mwh"
},
"05-06": {
"date": "24-08-2022",
"hour": "05-06",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 681.87,
"units": "€/Mwh"
},
"06-07": {
"date": "24-08-2022",
"hour": "06-07",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 624.35,
"units": "€/Mwh"
},
"07-08": {
"date": "24-08-2022",
"hour": "07-08",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 624.82,
"units": "€/Mwh"
},
"08-09": {
"date": "24-08-2022",
"hour": "08-09",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 623.24,
"units": "€/Mwh"
},
"09-10": {
"date": "24-08-2022",
"hour": "09-10",
"is-cheap": false,
"is-under-avg": true,
"market": "PVPC",
"price": 558.55,
"units": "€/Mwh"
},
"10-11": {
"date": "24-08-2022",
"hour": "10-11",
"is-cheap": false,
"is-under-avg": true,
"market": "PVPC",
"price": 511.3,
"units": "€/Mwh"
},
"11-12": {
"date": "24-08-2022",
"hour": "11-12",
"is-cheap": false,
"is-under-avg": true,
"market": "PVPC",
"price": 493.36,
"units": "€/Mwh"
},
"12-13": {
"date": "24-08-2022",
"hour": "12-13",
"is-cheap": true,
"is-under-avg": true,
"market": "PVPC",
"price": 484.42,
"units": "€/Mwh"
},
"13-14": {
"date": "24-08-2022",
"hour": "13-14",
"is-cheap": true,
"is-under-avg": true,
"market": "PVPC",
"price": 487.58,
"units": "€/Mwh"
},
"14-15": {
"date": "24-08-2022",
"hour": "14-15",
"is-cheap": true,
"is-under-avg": true,
"market": "PVPC",
"price": 426.72,
"units": "€/Mwh"
},
"15-16": {
"date": "24-08-2022",
"hour": "15-16",
"is-cheap": true,
"is-under-avg": true,
"market": "PVPC",
"price": 418.28,
"units": "€/Mwh"
},
"16-17": {
"date": "24-08-2022",
"hour": "16-17",
"is-cheap": true,
"is-under-avg": true,
"market": "PVPC",
"price": 422.18,
"units": "€/Mwh"
},
"17-18": {
"date": "24-08-2022",
"hour": "17-18",
"is-cheap": true,
"is-under-avg": true,
"market": "PVPC",
"price": 430.63,
"units": "€/Mwh"
},
"18-19": {
"date": "24-08-2022",
"hour": "18-19",
"is-cheap": false,
"is-under-avg": true,
"market": "PVPC",
"price": 495.26,
"units": "€/Mwh"
},
"19-20": {
"date": "24-08-2022",
"hour": "19-20",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 579.65,
"units": "€/Mwh"
},
"20-21": {
"date": "24-08-2022",
"hour": "20-21",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 614.08,
"units": "€/Mwh"
},
"21-22": {
"date": "24-08-2022",
"hour": "21-22",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 625.97,
"units": "€/Mwh"
},
"22-23": {
"date": "24-08-2022",
"hour": "22-23",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 582.99,
"units": "€/Mwh"
},
"23-24": {
"date": "24-08-2022",
"hour": "23-24",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 617.25,
"units": "€/Mwh"
}
}
I would like to cast that result into a LightHours, where every one would be a class Hour inside.
My main ideas was to get a List<LightHours> = {Hours,...}
Also I have tried to do the following: LightPrice lightPrice = LightPrice.fromJson(jsonDecode(response.body)); but it only gets me every field as null.
But using the json to Dart converter it doesn't allow me.
How could i convert that response into both objects classes?
Something like this maybe works:
List<LightPrice> list = (jsonDecode(response.body) as Map<String,
Map<String, dynamic>>).values.map<LightPrice>((value) =>
LightPrice.fromJson(value)).toList();
//your json string
String jsonString = json.encode(data);
//convert json string to list
List<String> newData = List<String>.from(json.decode(jsonString));
this will help to convert

Flutter: Populate listview with headers and items from complex list

I have following List:
[
{
"ID": "1",
"ParentID": "0",
"CategoryName": "FourWheeler",
"Children": [
{
"ID": "9",
"ParentID": "1",
"CategoryName": "Jeep",
"ParentCategoryName": "FourWheeler"
},
{
"ID": "10",
"ParentID": "1",
"CategoryName": "Taxi",
"ParentCategoryName": "FourWheeler"
},
{
"ID": "11",
"ParentID": "1",
"CategoryName": "Car",
"ParentCategoryName": "FourWheeler"
},
{
"ID": "12",
"ParentID": "1",
"CategoryName": "Van",
"ParentCategoryName": "FourWheeler"
},
{
"ID": "13",
"ParentID": "1",
"CategoryName": "Other",
"ParentCategoryName": "FourWheeler"
}]
},
{
"ID": "2",
"ParentID": "0",
"CategoryName": "Boat",
"Children": [
{
"ID": "14",
"ParentID": "2",
"CategoryName": "Motorboat",
"ParentCategoryName": "Boat"
},
{
"ID": "15",
"ParentID": "2",
"CategoryName": "Sailingboat",
"ParentCategoryName": "Boat"
},
{
"ID": "16",
"ParentID": "2",
"CategoryName": "SteamBoat",
"ParentCategoryName": "Boat"
},
{
"ID": "17",
"ParentID": "2",
"CategoryName": "Other",
"ParentCategoryName": "Boat"
}]
}
]
I need to populate ListView on the basis of this list. We should have listview populated such a way that there are headers and each headers will have their respective items.
For Example, ListView should look something like,
**FourWheeler**
Jeep
Taxi
Car
Van
Other
**Boat**
Motorboat
Sailingboat
Steamboat
Other
For simple list like this:
List Fruits = ['Apple','Orange','Kiwi','Avocado'];
I would have done like this
Fruits.map<Widget>((fruit)=>Container(child: Text(fruit))).toList();
But I don't know how to deal with the scenario I have. Any help will be appreciated. Thanks
This is one way you can populate a ListView as you have described:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
#override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: ListView(
children: [
for (final header in data) ...[
ListTile(title: Text('**${header['CategoryName']}**')),
for (final item in header['Children'] ?? [])
ListTile(title: Text(' ${item['CategoryName']}')),
],
],
),
),
);
}
}
const List<Map<String, dynamic>> data = [
{
"ID": "1",
"ParentID": "0",
"CategoryName": "FourWheeler",
"Children": [
{
"ID": "9",
"ParentID": "1",
"CategoryName": "Jeep",
"ParentCategoryName": "FourWheeler"
},
{
"ID": "10",
"ParentID": "1",
"CategoryName": "Taxi",
"ParentCategoryName": "FourWheeler"
},
{
"ID": "11",
"ParentID": "1",
"CategoryName": "Car",
"ParentCategoryName": "FourWheeler"
},
{
"ID": "12",
"ParentID": "1",
"CategoryName": "Van",
"ParentCategoryName": "FourWheeler"
},
{
"ID": "13",
"ParentID": "1",
"CategoryName": "Other",
"ParentCategoryName": "FourWheeler"
}
]
},
{
"ID": "2",
"ParentID": "0",
"CategoryName": "Boat",
"Children": [
{
"ID": "14",
"ParentID": "2",
"CategoryName": "Motorboat",
"ParentCategoryName": "Boat"
},
{
"ID": "15",
"ParentID": "2",
"CategoryName": "Sailingboat",
"ParentCategoryName": "Boat"
},
{
"ID": "16",
"ParentID": "2",
"CategoryName": "SteamBoat",
"ParentCategoryName": "Boat"
},
{
"ID": "17",
"ParentID": "2",
"CategoryName": "Other",
"ParentCategoryName": "Boat"
}
]
}
];
You could also group each header with something like an ExpansionTile:
ListView(
children: [
for (final header in data)
ExpansionTile(
title: Text('**${header['CategoryName']}**'),
children: [
for (final item in header['Children'] ?? [])
ListTile(title: Text(' ${item['CategoryName']}')),
],
),
],
),

List<Widgets> in rows and lines dynamically in Flutter

I have json:
{
"name": "Test",
"groupsCount": 5,
"groups": [
{
"name": "William Cooper",
"number": 1,
"linesCount": 2,
"lines": [
{
"name": "Brittany Ramirez",
"number": 1,
"placesCount": 15,
"places": [
{
"name": "Elizabeth Welch",
"number": 1
},
{
"name": "Bradley Pugh",
"number": 2
},
{
"name": "Noah Johnson",
"number": 3
},
{
"name": "Laura Cox",
"number": 4
},
{
"name": "Tiffany Hatfield",
"number": 5
},
{
"name": "Patricia Hayes",
"number": 6
},
{
"name": "Kevin Jenkins MD",
"number": 7
},
{
"name": "Brent Wilkins",
"number": 8
},
{
"name": "Mr. Bruce Hart",
"number": 9
},
{
"name": "Courtney Newman",
"number": 10
},
{
"name": "Dawn Campbell",
"number": 11
},
{
"name": "Ashley Scott",
"number": 12
},
{
"name": "Robert Becker",
"number": 13
},
{
"name": "Kevin Williams",
"number": 14
},
{
"name": "Elizabeth Davidson",
"number": 15
}
]
},
{
"name": "Carol Watson",
"number": 2,
"placesCount": 12,
"places": [
{
"name": "Kathleen Jones",
"number": 16
},
{
"name": "Robin Smith",
"number": 17
},
{
"name": "David Johnson",
"number": 18
},
{
"name": "Richard Boyd",
"number": 19
},
{
"name": "Mason Randolph",
"number": 20
},
{
"name": "James Bernard",
"number": 21
},
{
"name": "Timothy Miller",
"number": 22
},
{
"name": "Thomas Stone",
"number": 23
},
{
"name": "Steven Jones",
"number": 24
},
{
"name": "William Hernandez",
"number": 25
},
{
"name": "Joy Duarte",
"number": 26
},
{
"name": "Justin Anderson",
"number": 27
}
]
}
]
},
{
"name": "Sarah Jordan",
"number": 2,
"linesCount": 1,
"lines": [
{
"name": "Lacey Estrada",
"number": 3,
"placesCount": 15,
"places": [
{
"name": "Madison Smith",
"number": 28
},
{
"name": "Kathleen Wells",
"number": 29
},
{
"name": "Dale Gross",
"number": 30
},
{
"name": "Brandy Cabrera",
"number": 31
},
{
"name": "Ashley Torres",
"number": 32
},
{
"name": "Ralph Long",
"number": 33
},
{
"name": "Christopher Walker",
"number": 34
},
{
"name": "Kimberly Moore",
"number": 35
},
{
"name": "Andrea Ortiz",
"number": 36
},
{
"name": "Heidi Todd",
"number": 37
},
{
"name": "Austin Wang",
"number": 38
},
{
"name": "Bryan Adams",
"number": 39
},
{
"name": "Jeffrey Alvarado",
"number": 40
},
{
"name": "Richard Morrison",
"number": 41
},
{
"name": "Jennifer Hodge",
"number": 42
}
]
}
]
},
{
"name": "Tiffany Lynch",
"number": 3,
"linesCount": 1,
"lines": [
{
"name": "Kimberly Howe DVM",
"number": 4,
"placesCount": 15,
"places": [
{
"name": "Nancy King",
"number": 43
},
{
"name": "Angela Cabrera",
"number": 44
},
{
"name": "Elizabeth Mack",
"number": 45
},
{
"name": "Shelly Riggs",
"number": 46
},
{
"name": "Jeremy French",
"number": 47
},
{
"name": "Deborah Myers",
"number": 48
},
{
"name": "Robert Kramer",
"number": 49
},
{
"name": "Brian Cunningham MD",
"number": 50
},
{
"name": "Christopher Brown",
"number": 51
},
{
"name": "Kathryn James",
"number": 52
},
{
"name": "Cassandra Martinez",
"number": 53
},
{
"name": "Nathan Long",
"number": 54
},
{
"name": "Molly Wilson",
"number": 55
},
{
"name": "Matthew Reilly",
"number": 56
},
{
"name": "Erin Maddox",
"number": 57
}
]
}
]
},
{
"name": "Christopher Martin",
"number": 4,
"linesCount": 1,
"lines": [
{
"name": "Gina Brewer",
"number": 5,
"placesCount": 13,
"places": [
{
"name": "Dennis Owens",
"number": 58
},
{
"name": "Rebecca Caldwell",
"number": 59
},
{
"name": "James Mckinney",
"number": 60
},
{
"name": "Donna Lee",
"number": 61
},
{
"name": "Michelle Martinez",
"number": 62
},
{
"name": "Jennifer Davis",
"number": 63
},
{
"name": "Shawn Moore",
"number": 64
},
{
"name": "Jeremiah Reilly",
"number": 65
},
{
"name": "Bruce Mendoza",
"number": 66
},
{
"name": "Juan Weaver",
"number": 67
},
{
"name": "Brian Bates",
"number": 68
},
{
"name": "Caitlin Jenkins",
"number": 69
},
{
"name": "Rachel Thomas",
"number": 70
}
]
}
]
},
{
"name": "Michelle Thompson",
"number": 5,
"linesCount": 2,
"lines": [
{
"name": "Kathleen Hall",
"number": 6,
"placesCount": 12,
"places": [
{
"name": "Jennifer Vaughan",
"number": 71
},
{
"name": "Glenn Mayer",
"number": 72
},
{
"name": "Allison Coleman",
"number": 73
},
{
"name": "Brittany Harris",
"number": 74
},
{
"name": "John Mccullough",
"number": 75
},
{
"name": "James Curtis",
"number": 76
},
{
"name": "John Smith",
"number": 77
},
{
"name": "Alison Morales",
"number": 78
},
{
"name": "Matthew Jones",
"number": 79
},
{
"name": "Jessica Watson",
"number": 80
},
{
"name": "Yvonne Anderson",
"number": 81
},
{
"name": "David Price",
"number": 82
}
]
},
{
"name": "Sarah White",
"number": 7,
"placesCount": 10,
"places": [
{
"name": "Kathleen Owen",
"number": 83
},
{
"name": "Amy Strickland",
"number": 84
},
{
"name": "James Collier",
"number": 85
},
{
"name": "Keith Smith Jr.",
"number": 86
},
{
"name": "Christopher York",
"number": 87
},
{
"name": "Patricia Todd",
"number": 88
},
{
"name": "Matthew Harris",
"number": 89
},
{
"name": "Betty Mckee",
"number": 90
},
{
"name": "Kayla Hahn",
"number": 91
},
{
"name": "Craig Duncan",
"number": 92
}
]
}
]
}
]
}
and I want to build view using lines and places. So if group have 2 lines and each line has 15 places I want to build something like that:
...............
...............
This is my code:
import 'package:flutter/material.dart';
import 'package:parking/models/groups.dart';
import 'package:parking/models/parking_group.dart';
import 'package:parking/services/parking_service.dart';
class ParkingDetailsScreen extends StatefulWidget {
#override
createState() => ParkingDetailsState();
}
class ParkingDetailsState extends State<ParkingDetailsScreen> {
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Parking Details"),
),
body: FutureBuilder<ParkingGroup>(
future: ParkingService.getParking(),
builder: (context, snapshot) {
if (snapshot.hasError) print(snapshot.error);
return snapshot.hasData
? _buildParking(snapshot.data)
: Center(child: CircularProgressIndicator());
},
)
);
}
}
final _parkings = <Groups>[];
Widget _buildParking(ParkingGroup parkingGroup) {
_parkings.clear();
_parkings.addAll(parkingGroup.groups);
return ListView.builder(
itemCount: _parkings.length,
itemBuilder: (context, index) {
return _buildRow(_parkings[index], context);
},
);
}
Widget _buildRow(Groups parkingGroup, BuildContext context) {
return Container(
padding: const EdgeInsets.all(16.0),
child: Row(
children: _buildRowList(parkingGroup),
),
);
}
List<Widget> _buildRowList(Groups parkingGroup) {
List<Widget> places = [];
for (var place in parkingGroup.lines) {
for (var placeLine in place.places) {
places.add(_buildPlace(placeLine));
}
}
return places;
}
Widget _buildPlace(place) {
return Container(
padding: const EdgeInsets.only(bottom: 8.0),
child:
SizedBox(
height: 5,
width: 5,
child: DecoratedBox(
decoration: BoxDecoration(
border: Border.all(color: Colors.blueAccent),
)),
),
);
}
//
//Widget _buildRow(Groups parkingGroup, BuildContext context) {
// return Container(
// padding: const EdgeInsets.all(16.0),
// child: Row(
// children: [
// Container(
// padding: const EdgeInsets.only(bottom: 8.0),
// child:
// SizedBox(
// height: 30,
// width: 30,
// child: DecoratedBox(
// decoration: BoxDecoration(
// border: Border.all(color: Colors.blueAccent),
// )),
// ),
// ),
// ],
// ),
// );
//}
but for this code I see all places in one line:
..............................
instead of
...............
...............
What I need to change in my code to get good result?
You need to change your _buildRow() and _buildRowList() methods:
Widget _buildRow(Groups parkingGroup, BuildContext context) {
return Container(
padding: const EdgeInsets.all(16.0),
child: Column( // As you expect multiple lines you need a column not a row
children: _buildRowList(parkingGroup),
),
);
}
List<Widget> _buildRowList(Groups parkingGroup) {
List<Widget> lines = []; // this will hold Rows according to available lines
for (var line in parkingGroup.lines) {
List<Widget> placesForLine = [] // this will hold the places for each line
for (var placeLine in line.places) {
placesForLine.add(_buildPlace(placeLine));
}
lines.add(Row(children: placesForLine));
}
return lines;
}