为了使整个应用程序具有相同的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;
}
答案 0 :(得分:2)
我倾向于尝试类似的东西
actions: (dropdownChoices.length < 1) ? null : <Widget>[
PopupMenuButton<DropdownChoices>(...),
],
答案 1 :(得分:1)
您可以使用集合if
根据条件排除列表项:
actions: <Widget>[
if (dropdownChoices.length != 0) PopupMenuButton<DropdownChoices>(...),
]
这应该可以解决您的问题,因为当您提供空白列表dropdownChoices
时将不包含该操作。
如果dropdownChoices
可以是null
,则还应检查条件是否为空。