I couldn't find what I did wrong
The argument type 'Iterable<Map<Sub, Padding>>' can't be assigned to the parameter type 'Map<Sub, Padding>'.
1
CupertinoSegmentedControl<Sub>(
groupValue: _subView,
onValueChanged: (Sub newSelection) {
setState(() {
_subView = newSelection;
});
},
children: _segment(context),
)
2
Map<Sub, Padding> _segment(BuildContext context) {
List<ProductDetails> productsSorted = _products
..sort((a, b) {
return a.rawPrice.compareTo(b.rawPrice);
});
Map<Sub, Padding> productList = <Sub, Padding>{};
productList.addAll(productsSorted.map(
(ProductDetails productDetails) {
return {productsSorted[0] == productDetails
? Sub.weekly
: productsSorted[1] == productDetails
? Sub.monthly
: Sub.months3 : Padding(
padding:
const EdgeInsets.symmetric(vertical: 20.0, horizontal: 5.0),
child: Column(
children: [
Text(
productsSorted.last == productDetails ? '3' : '1',
style: const TextStyle(fontSize: 22.0),
),
Text(productsSorted[0] == productDetails
? Localization.of(context).week
: productsSorted[1] == productDetails
? Localization.of(context).month
: Localization.of(context).months),
const SizedBox(height: 4.0),
Text(productDetails.price),
productsSorted[0] == productDetails
? const SizedBox()
: productsSorted[1] == productDetails
? Text(
'-%${_discountCalculator(productsSorted[0].rawPrice, productDetails.rawPrice, 4)}')
: Text(
'-%${_discountCalculator(productsSorted[0].rawPrice, productDetails.rawPrice, 12)}'),
],
),
)};
},
));
return productList;
}
Problem is in second snippet, 6th string: productList.addAll(productsSorted.map(...
When you use map
on some collection (including List
), it always returns Iterable
.
For your usecase, when you want to create Map
from some Iterable
you may need this:
Map<Sub, Padding> _segment(BuildContext context) {
List<ProductDetails> productsSorted = _products
..sort((a, b) {
return a.rawPrice.compareTo(b.rawPrice);
});
return Map.fromIterable(
productsSorted,
key: (product) {
if (product == productsSorted[0]) return Sub.weekly;
if (product == productsSorted[1]) return Sub.monthly;
return Sub.months3;
},
value: (product) => Padding(
padding: const EdgeInsets.symmetric(vertical: 20.0, horizontal: 5.0),
child: Column(
children: [
Text(
product == productsSorted.last ? '3' : '1',
style: const TextStyle(fontSize: 22.0),
),
Text(
product == productsSorted[0]
? Localization.of(context).week
: product == productsSorted[1]
? Localization.of(context).month
: Localization.of(context).months,
),
const SizedBox(height: 4.0),
Text(product.price),
if (product != productsSorted[0])
Text(
'-${_discountCalculator(
productsSorted[0].rawPrice,
product.rawPrice,
product == productsSorted[1] ? 4 : 12,
)}%',
),
],
),
),
);
I may messed up a little with details (cause I do not know what is ProductDetails
and your snipet is overall not easy to reproduce :) ). But main idea is to use Map.fromIterable.