Search code examples
flutterdart

Dart List To Map<Sub, Padding> Iterable Problem


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;
  }

Solution

  • 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.