在我的Ffltter应用程序中,我有一个屏幕,它是一个MaterialApp,上面有一个Scaffold小部件,就像它的家一样.
这个Scaffold的appBar属性是一个appBar小部件,其actions属性中填充了一些操作,并有一个弹出菜单来容纳其余的选项.
问题是,据我所知,AppBar actions
列表的子级可以是通用小部件(它将作为操作添加),也可以是PopupMenuButton
的实例,在这种情况下,它将添加特定于平台的图标,当触发该图标时,将打开AppBar弹出菜单.
在原生Android上,这不是它的工作方式.我只需要inflating 一个充满菜单项的菜单,每个菜单项都可以被强制为一个动作,强制不是一个动作,或者有一个特殊的值"ifRoom",这意味着"如果有空间就是一个动作,否则就是弹出菜单中的一个项目".
在Ffltter中,有没有一种方法可以在不编写复杂逻辑来填充AppBar的"Actions"属性的情况下具有此行为?
我研究过AppBar和PopupMenuButton文档,但到目前为止,还没有解释如何做这样的事情.我可以模拟这种行为,但接下来我必须实际编写一个 routine 来计算可用空间,并相应地构建"操作"列表.
这是一个典型的Android菜单,它混合了操作和弹出菜单项.请注意,如果有空间,"LOAD_GAME"条目可以是一个操作,如果没有空间,它将成为一个菜单项.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/new_game"
android:icon="@drawable/ic_new_game"
android:title="@string/new_game"
android:showAsAction="always"/>
<item android:id="@+id/load_game"
android:icon="@drawable/ic_load_game"
android:title="@string/load_game"
android:showAsAction="ifRoom"/>
<item android:id="@+id/help"
android:icon="@drawable/ic_help"
android:title="@string/help"
android:showAsAction="never" />
</menu>
另一方面,在Flutter 中,我必须提前决定选项是动作还是菜单项.
AppBar(
title: Text("My Incredible Game"),
primary: true,
actions: <Widget>[
IconButton(
icon: Icon(Icons.add),
tooltip: "New Game",
onPressed: null,
),
IconButton(
icon: Icon(Icons.cloud_upload),
tooltip: "Load Game",
onPressed: null,
),
PopupMenuButton(
itemBuilder: (BuildContext context) {
return <PopupMenuEntry>[
PopupMenuItem(
child: Text("Help"),
),
];
},
)
],
)
我所希望的是AppBar实际上只有一个"action"属性,而不是"actions".该属性将只是一个小部件,允许我拥有任何东西,因此如果我只想要一个操作列表,那么一行充满IconButton的就足够了.
除此之外,PopupMenuButton内的每个PopupMenuItem都有一个"showAsAction"属性.如果PopupMenuButton内的一个或多个PopupMenuItem被选中为操作或"ifRoom"并且有空间,则PopupMenuButton将水平扩展并将这些项作为操作放置.