Flutter 根据自定义对象变量的布尔值返回对象列表
我希望根据自定义对象(Flutter 根据自定义对象变量的布尔值返回对象列表,flutter,dart,Flutter,Dart,我希望根据自定义对象(AvailableService)变量的布尔值返回菜单列表 像这样的 class Menu{ List<SubMenu> subMenus; } class SubMenu{ AvailableService; } class AvailableService{ bool supportsDelivery; bool supportsCollection; bool supportsTable; } 这是因为您正在分配一个新值以支持交付,因此应改用以下代
AvailableService
)变量的布尔值返回菜单列表
像这样的
class Menu{
List<SubMenu> subMenus;
}
class SubMenu{
AvailableService;
}
class AvailableService{
bool supportsDelivery;
bool supportsCollection;
bool supportsTable;
}
这是因为您正在分配一个新值以支持交付,因此应改用以下代码:
List<Menu> menus = menus.where((m) => m.submenus.toList().where((s) => s.availableService.supportsDelivery).isNotEmpty).toList();
但是这个函数不返回True或False;它返回null。这是因为=用于赋值。您应该使用==进行布尔运算。因此,您应该将=替换为==。但是使用value==True类似于直接返回值(至少在您的情况下)
这等于
(s) => s.availableService.supportsDelivery
你忘了。我希望我正确地理解了您,并创建了适当的数据集。我还提高了所有的课程
最好的选择是使用正确的命名在类中移动所有可能的逻辑。从那时起,它更具可读性,更容易找到bug
我还允许自己在List
上创建一个扩展,以避免将来出现重复的逻辑。它包含解决方案
class Menu {
final List<SubMenu> subMenus;
Menu(this.subMenus);
bool get doesContainItemWithDeliverySupport =>
onlyWithSupportedDelivery.length > 0;
List<SubMenu> get onlyWithSupportedDelivery =>
subMenus.where((submenu) => submenu.doesSupportDelivery).toList();
@override
String toString() => 'Menu(subMenus: $subMenus)\n\n';
}
class SubMenu {
final AvailableService availableService;
SubMenu(this.availableService);
bool get doesSupportDelivery => availableService.doesSupportDelivery;
@override
String toString() => 'SubMenu(availableService: $availableService)\n';
}
class AvailableService {
final bool supportsDelivery;
final bool supportsCollection;
final bool supportsTable;
AvailableService(
this.supportsDelivery,
this.supportsCollection,
this.supportsTable,
);
bool get doesSupportDelivery => true == supportsDelivery;
@override
String toString() =>
'AvailableService(supportsDelivery: $supportsDelivery, supportsCollection: $supportsCollection, supportsTable: $supportsTable)';
}
extension on List<Menu> {
List<Menu> get onlyWithSupportedDelivery {
var filteredMenus = <Menu>[];
forEach((menu) {
if (menu.doesContainItemWithDeliverySupport) {
filteredMenus.add(Menu(menu.onlyWithSupportedDelivery));
}
});
return filteredMenus;
}
}
main() {
final menu1 = Menu([
SubMenu(
AvailableService(
true,
true,
true,
),
),
SubMenu(
AvailableService(
false,
true,
true,
),
),
SubMenu(
AvailableService(
true,
false,
true,
),
),
SubMenu(
AvailableService(
true,
true,
false,
),
),
]);
final menu2 = Menu([
SubMenu(
AvailableService(
true,
true,
true,
),
),
SubMenu(
AvailableService(
false,
true,
true,
),
),
]);
final menu3 = Menu([
SubMenu(
AvailableService(
false,
true,
true,
),
),
]);
final menus = <Menu>[menu1, menu2, menu3];
var filteredMenus = menus.onlyWithSupportedDelivery;
filteredMenus.forEach((menu) => print(menu));
}
类菜单{
最终列表子菜单;
菜单(此子菜单);
bool get doesContainItemWithDeliverySupport=>
仅支持Delivery.length>0的情况;
List get onlyWithSupportedDelivery=>
子菜单,其中((子菜单)=>submenu.doesSupportDelivery.toList();
@凌驾
String toString()=>'菜单(子菜单:$subMenus)\n\n';
}
类子菜单{
最终可用服务可用服务;
子菜单(this.availableService);
bool get doesupportdelivery=>availableService.doesupportdelivery;
@凌驾
String-toString()=>'子菜单(availableService:$availableService)\n';
}
类可用性服务{
最终bool支持交付;
最终bool支持集合;
最终布尔支持稳定;
可用服务(
这是我的交货单,
这个.支持集合,
这是稳定的,
);
bool get doesSupportDelivery=>true==supportsDelivery;
@凌驾
字符串toString()=>
'可用服务(supportsDelivery:$supportsDelivery,supportsCollection:$supportsCollection,supportsTable:$supportsTable)';
}
名单上的延期{
列表仅获取支持的交付{
变量filteredMenus=[];
forEach((菜单){
if(menu.doesContainItemWithDeliverySupport){
filteredMenus.add(Menu(Menu.onlywhithsupporteddelivery));
}
});
返回filteredMenus;
}
}
main(){
最终菜单1=菜单([
子菜单(
可用服务(
符合事实的
符合事实的
符合事实的
),
),
子菜单(
可用服务(
错误的
符合事实的
符合事实的
),
),
子菜单(
可用服务(
符合事实的
错误的
符合事实的
),
),
子菜单(
可用服务(
符合事实的
符合事实的
错误的
),
),
]);
最终菜单2=菜单([
子菜单(
可用服务(
符合事实的
符合事实的
符合事实的
),
),
子菜单(
可用服务(
错误的
符合事实的
符合事实的
),
),
]);
最终菜单3=菜单([
子菜单(
可用服务(
错误的
符合事实的
符合事实的
),
),
]);
最终菜单=[menu1、menu2、menu3];
var filteredMenus=菜单。仅支持交付;
filteredMenus.forEach((菜单)=>打印(菜单));
}
请提供一个最小的可重复示例。您提供的不是有效的dart。也就是说,问题很可能是您制作了一个类型,并且使用了=
而不是=
。您也不应该对文字布尔进行显式比较。同样,这是不清楚的,因为其余的代码是无效的。确定将重做…感谢您的伟大的答案。我只是想举一个最小的可复制的例子,但你抢先一步。
(s) => s.availableService.supportsDelivery == True
(s) => s.availableService.supportsDelivery
class Menu {
final List<SubMenu> subMenus;
Menu(this.subMenus);
bool get doesContainItemWithDeliverySupport =>
onlyWithSupportedDelivery.length > 0;
List<SubMenu> get onlyWithSupportedDelivery =>
subMenus.where((submenu) => submenu.doesSupportDelivery).toList();
@override
String toString() => 'Menu(subMenus: $subMenus)\n\n';
}
class SubMenu {
final AvailableService availableService;
SubMenu(this.availableService);
bool get doesSupportDelivery => availableService.doesSupportDelivery;
@override
String toString() => 'SubMenu(availableService: $availableService)\n';
}
class AvailableService {
final bool supportsDelivery;
final bool supportsCollection;
final bool supportsTable;
AvailableService(
this.supportsDelivery,
this.supportsCollection,
this.supportsTable,
);
bool get doesSupportDelivery => true == supportsDelivery;
@override
String toString() =>
'AvailableService(supportsDelivery: $supportsDelivery, supportsCollection: $supportsCollection, supportsTable: $supportsTable)';
}
extension on List<Menu> {
List<Menu> get onlyWithSupportedDelivery {
var filteredMenus = <Menu>[];
forEach((menu) {
if (menu.doesContainItemWithDeliverySupport) {
filteredMenus.add(Menu(menu.onlyWithSupportedDelivery));
}
});
return filteredMenus;
}
}
main() {
final menu1 = Menu([
SubMenu(
AvailableService(
true,
true,
true,
),
),
SubMenu(
AvailableService(
false,
true,
true,
),
),
SubMenu(
AvailableService(
true,
false,
true,
),
),
SubMenu(
AvailableService(
true,
true,
false,
),
),
]);
final menu2 = Menu([
SubMenu(
AvailableService(
true,
true,
true,
),
),
SubMenu(
AvailableService(
false,
true,
true,
),
),
]);
final menu3 = Menu([
SubMenu(
AvailableService(
false,
true,
true,
),
),
]);
final menus = <Menu>[menu1, menu2, menu3];
var filteredMenus = menus.onlyWithSupportedDelivery;
filteredMenus.forEach((menu) => print(menu));
}