поиск двух одинаковых значений в двух различных массивах
В настоящее время я пытаюсь связать два 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());
}
},
),
);
}
}
- Функция
createDropdownItemsзагружает оба YAML файла:amount.yamlдля порядка элементов иfruit_specification.yamlдля данных о фруктах. - Она извлекает список фруктов из
fruit_specification.yaml. - Затем она проходит по каждому элементу в amount.yaml. Каждый элемент содержит значение
amount. - Для каждого значения
amountона ищет соответствующий фрукт в списке фруктов, используяfirstWhere.firstWhereнаходит первый элемент, удовлетворяющий условию (в данном случае,fruit['amount'] == amount). - Если фрукт найден, создаётся
DropdownMenuItemс именем фрукта в качестве значения и отображаемого текста. - Если фрукт не найден (обработка ошибки), выводится сообщение в консоль, и создаётся
DropdownMenuItemс текстом "Не найдено". - Все созданные
DropdownMenuItemдобавляются в списокdropdownItems.