Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 根据自定义对象变量的布尔值返回对象列表_Flutter_Dart - Fatal编程技术网

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));
}