Сортировать вложенный список во флаттере - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть вложенные Json продуктов, которые я хотел бы отсортировать по их цене, вложенной в структуру json. Прямо сейчас, когда я пытаюсь отсортировать по цене, я получаю сообщение об ошибке, и я не понимаю ошибку:

Class 'List<Product>' has no instance getter 'sizes'.
Receiver: Instance(length:5) of '_GrowableList'
Tried calling: sizes

Если я пытаюсь отсортировать вложенный фильтр, не должен ли я назвать размеры? Я не могу заставить работать дела 1 или 2.

Я пытаюсь отфильтровать мои так:

  void _sortProductsDropDown(_fabSort) {
    var tempProducts;

    setState(() {
      switch (_fabSort) {
        case 0:
tempProducts = [];
          break;
        case 1:
          tempProducts =
              filteredProducts.sizes.sort((a, b) => a.price.compareTo(b.price));

          print('Attempt $tempProducts');

          break;
        case 2:
          tempProducts = filteredProducts
              .Sodium.sort;
          print('Sodium sort + ${tempProducts.length}');

          break;
        case 3:
          tempProducts =
              filteredProducts.where((e) => e.caloriesContent == 0.0).toList();
          print(‘no cal  ${tempProducts}');

          break;
      }
    });
  }

Мои json данные

            "id": 49,
            "name": “Celery Combo”,
            "short_description": “Yummy no calories”,

            "quantity": 26,
            "sizes": [
                {
                    "id": 47,
                    "size": 6,
                    "product_id": 49,
                    "price": 8.99
                }
            ],
            "image": "https://ges3334.amazonaws.com/product_images/
            “sodium,”: 7.0
        },
        {
            "id": 48,
            "name": “Beef Burger“,
            "short_description": “Mad Cow Calories”,

            "quantity": 30,
            "sizes": [
                {
                    "id": 46,
                    "size": 6,
                    "product_id": 48,
                    "price": 8.99
                }
            ],
            "image": "https://ges3334.amazonaws.com/product_images/single_cRIoNU8.png",


            “calorie”: 1200.0,
            “sodium”: 26.0
        }
    ]
}

1 Ответ

1 голос
/ 07 апреля 2020

Список не имеет свойства размеров, размеры являются свойством каждого продукта. Это генерируется этой строкой

filteredProducts.sizes.sort((a, b) => a.price.compareTo(b.price));

и четко указывается:

Class 'List<Product>' has no instance getter 'sizes'.
Receiver: Instance(length:5) of '_GrowableList'
Tried calling: sizes

В своем комментарии вы говорите, что хотите отсортировать товары по цене, где цена Продукта найдена по глядя на первый элемент в списке sizes.

Это легко сделать (здесь я использовал вспомогательную функцию, но лямбда тоже в порядке):

int compareProductBySmallestSize(Product lhs, Product rhs) {
  var lhsPrice = lhs.sizes[0].price;
  var rhsPrice = rhs.sizes[0].price;
  return lhsPrice.compareTo(rhsPrice);
}

void _sortProductsDropDown(_fabSort) {
   // ...
   products.sort(compareProductBySmallestSize);
   // ...
}

Обратите внимание, что если продукты с пустой список sizes разрешен, небольшая поправка должна быть внесена в вспомогательную функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...