Как правильно отфильтровать два списка, которые связанными между собой полями по id в Dart/Flutter?
Я пытаюсь реализовать фильтрацию двух списков, используя id элемента. У меня есть 2 экрана. На первом экране: список по категориям: напитки, десерты, горячее, а на втором экране: элементы, которые принадлежат этим категориям. В документации и в других проектах видел, что просто в конструктор передают id. Однако у меня это не работает: на втором экране все также выводиться весь не отфильтрованный список
Я пробовал провести реализацию по методу where, передав его в параметр: FoodSel(ttId: food.where((element) => element.ttId == 'ttId').toList(), но все также выдается списком.
Как правильно отфильтровать значения и передать уже отфильтрованные значения на экран? уже все перепробовал включая методы contains() и where() вместе.
Думал над реализацией пузырьковой сортировки, но никак не могу понять, как правильно передать то, что насортировано в конструктор. (Да и нужна ли она вообще здесь?)
Буду благодарен за помощь.
Первый экран:
сlass FoodT extends StatelessWidget {
List <Food> food = <Food>[
Food(ttId: 1, ttTitle: 'Напитки'),
Food(ttId: 2, ttTitle: 'Десерты'),
Food(ttId: 3, ttTitle: 'Горячее'),
];
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: ListView.builder(itemCount: food.length,
itemBuilder: (builder, index){
return ListTile(
title: Text(food[index].ttTitle),
subtitle: Text(food[index].ttId.toString()),
onTap: (){
Navigator.push(
context,
MaterialPageRoute(builder: (context) => FoodSel(ttId: food[index].ttId)));
Второй экран:
List<FoodSelected> marsh = <FoodSelected>[
FoodSelected(ttId: 1, mrTitle: "Капучино",),
FoodSelected(ttId: 2, mrTitle: "Чизкейк",),
FoodSelected(ttId: 3, mrTitle: "Мясной стейк",),
FoodSelected(ttId: 1, mrTitle: "Американо",),
FoodSelected(ttId: 2, mrTitle: "Круассан",),
FoodSelected(ttId: 3, mrTitle: "Рыбный стейк",),
];
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: ListView.builder(itemCount: marsh.length,
itemBuilder: (builder, index){
return ListTile(
title: Text(marsh[index].mrTitle),
subtitle: Text(marsh[index].ttId.toString()),
Ответы (1 шт):
Надо делать через переменную или get:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(),
body: Center(
child: FoodT(),
),
),
);
}
}
class Food {
Food({this.ttId, this.ttTitle});
final int ttId;
final String ttTitle;
}
class FoodSelected {
FoodSelected({this.ttId, this.mrTitle});
final int ttId;
final String mrTitle;
}
class FoodT extends StatelessWidget {
List<Food> food = <Food>[
Food(ttId: 1, ttTitle: 'Напитки'),
Food(ttId: 2, ttTitle: 'Десерты'),
Food(ttId: 3, ttTitle: 'Горячее'),
];
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: food.length,
itemBuilder: (builder, index) {
return ListTile(
title: Text(food[index].ttTitle),
subtitle: Text(food[index].ttId.toString()),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => FoodSel(ttId: food[index].ttId)));
},
);
},
);
}
}
class FoodSel extends StatelessWidget {
FoodSel({this.ttId});
final int ttId;
List<FoodSelected> marsh = <FoodSelected>[
FoodSelected(ttId: 1, mrTitle: "Капучино"),
FoodSelected(ttId: 2, mrTitle: "Чизкейк"),
FoodSelected(ttId: 3, mrTitle: "Мясной стейк"),
FoodSelected(ttId: 1, mrTitle: "Американо"),
FoodSelected(ttId: 2, mrTitle: "Круассан"),
FoodSelected(ttId: 3, mrTitle: "Рыбный стейк"),
];
List<FoodSelected> get marshViaId =>
marsh.where((v) => v.ttId == ttId).toList();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(ttId.toString())),
body: ListView.builder(
itemCount: marshViaId.length,
itemBuilder: (builder, index) {
return ListTile(
title: Text(marshViaId[index].mrTitle),
subtitle: Text(
marshViaId[index].ttId.toString(),
),
);
},
),
);
}
}