поиск двух одинаковых значений в двух различных массивах

В настоящее время я пытаюсь связать два YAML-файла во Flutter. Проблема в том, что один из YAML-файлов (например, amount.yaml) служит для хранения последовательности элементов (индекс), а другой (например, fruit_specification.yaml) - содержит информацию об элементах.

Вот пример: fruit_specification.yaml:

fruit: 
    - name: apple
      color: red
      amount: 3
    - name: banana 
      color: yellow
      amount: 2
    - name: plum 
      color: purple 
      amount: 5

и второй YAML-файл amount.yaml:, который выполняет функцию навигации и распределения значений в заданной последовательности:

- amount: 2
- amount: 3
- amount: 5

Может быть есть у кого-то идеи, как это можно реализовать?


Ответы (1 шт):

Автор решения: MiT

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

import 'package:yaml/yaml.dart';

Future<Map<String, dynamic>> _loadYaml(String path) async {
  // ...
}

Future<List<DropdownMenuItem<String>>> createDropdownItems() async {
  final amountYaml = await _loadYaml('amount.yaml');
  final fruitSpecYaml = await _loadYaml('fruit_specification.yaml');
  final amounts = amountYaml['amounts'];
  final fruits = fruitSpecYaml['fruit'];

  List<DropdownMenuItem<String>> dropdownItems = [];

  for (var amountEntry in amounts) {
    final amount = amountEntry['amount'];
    final matchingFruit = fruits.firstWhere(
        (fruit) => fruit['amount'] == amount,
        orElse: () => null);

    if (matchingFruit != null) {
      dropdownItems.add(DropdownMenuItem(
        value: matchingFruit['name'],
        child: Text(matchingFruit['name']),
      ));
    } else {
      // Обработка случая, когда фрукт с указанным количеством не найден
      dropdownItems.add(DropdownMenuItem(
        value: 'Не найдено',
        child: Text('Не найдено'),
      ));
    }
  }

  return dropdownItems;
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late Future<List<DropdownMenuItem<String>>> _dropdownItemsFuture;

  @override
  void initState() {
    super.initState();
    _dropdownItemsFuture = createDropdownItems();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('YAML Dropdown Example'),
      ),
      body: FutureBuilder<List<DropdownMenuItem<String>>>(
        future: _dropdownItemsFuture,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            return ListView.builder(
              itemCount: snapshot.data!.length,
              itemBuilder: (context, index) {
                return Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: DropdownButtonFormField<String>(
                    items: snapshot.data,
                    onChanged: (value) {
                      print('Выбранный фрукт: $value');
                    },
                    decoration: InputDecoration(
                      labelText: 'Выберите фрукт',
                    ),
                  ),
                );
              },
            );
          } else if (snapshot.hasError) {
            return Center(child: Text('Ошибка: ${snapshot.error}'));
          } else {
            return Center(child: CircularProgressIndicator());
          }
        },
      ),
    );
  }
}
  1. Функция createDropdownItems загружает оба YAML файла: amount.yaml для порядка элементов и fruit_specification.yaml для данных о фруктах.
  2. Она извлекает список фруктов из fruit_specification.yaml.
  3. Затем она проходит по каждому элементу в amount.yaml. Каждый элемент содержит значение amount.
  4. Для каждого значения amount она ищет соответствующий фрукт в списке фруктов, используя firstWhere. firstWhere находит первый элемент, удовлетворяющий условию (в данном случае, fruit['amount'] == amount).
  5. Если фрукт найден, создаётся DropdownMenuItem с именем фрукта в качестве значения и отображаемого текста.
  6. Если фрукт не найден (обработка ошибки), выводится сообщение в консоль, и создаётся DropdownMenuItem с текстом "Не найдено".
  7. Все созданные DropdownMenuItem добавляются в список dropdownItems.
→ Ссылка