在AppBar中波动自定义操作

时间:2020-02-09 16:49:01

标签: flutter dart

为了使整个应用程序具有相同的AppBar,我创建了一个单独的文件,其中包含要包含在每个屏幕中的AppBar。也可以传递一些变量,例如:action。因此,对于不同的屏幕,我仍可以在同一AppBar中进行不同的操作。所有这些工作正常,如下面的代码所示。但是,如果没有传递任何动作(dropdownChoices.length == 0),如何在AppBar中隐藏动作?

class BaseAppBar extends StatelessWidget implements PreferredSizeWidget {
  final Color bgColor = HexToColor('#508bbb');
  final String title;
  final AppBar appBar;
  final TabBar tabBar;
  final List<DropdownChoices> dropdownChoices;
  final bool isHomepage;
  final bool goBack;

  final PageRouteBuilder _homeRoute = new PageRouteBuilder(
    pageBuilder: (BuildContext context, _, __) {
      return HomePage();
    },
  );

  BaseAppBar(
      {Key key,
      this.title,
      this.appBar,
      this.tabBar,
      this.dropdownChoices,
      this.isHomepage = false,
      this.goBack = false})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ...
      actions: <Widget>[
        PopupMenuButton<DropdownChoices>(
          onSelected: (value) {
            if (value.action == 'refresh') {
              Navigator.pushReplacementNamed(context, value.route);
            }
          },
          elevation: 6,
          itemBuilder: (BuildContext context) {
            return dropdownChoices.map((DropdownChoices choice) {
              return PopupMenuItem<DropdownChoices>(
                value: choice,
                child: Text(choice.title),
              );
            }).toList();
          },
        )
      ],
    );
  }
}

class DropdownChoices {
  const DropdownChoices({this.title, this.action, this.route});

  final String title;
  final String action;
  final String route;
}

2 个答案:

答案 0 :(得分:2)

我倾向于尝试类似的东西

actions: (dropdownChoices.length < 1) ? null : <Widget>[
  PopupMenuButton<DropdownChoices>(...),
],

答案 1 :(得分:1)

您可以使用集合if 根据条件排除列表项:

actions: <Widget>[
  if (dropdownChoices.length != 0) PopupMenuButton<DropdownChoices>(...),
]

这应该可以解决您的问题,因为当您提供空白列表dropdownChoices时将不包含该操作。
如果dropdownChoices可以是null,则还应检查条件是否为空。