Flutter PopupMenuButton - 如何有条件地禁用它
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter PopupMenuButton - 如何有条件地禁用它相关的知识,希望对你有一定的参考价值。
我在PopupMenuButton
上有一个简单的appTitle
实现。这里是:
PopupMenuItem<int> _buildMenuItem(int size) {
return PopupMenuItem<int>(
value: size,
child: Text('${size}x$size'),
);
}
return Scaffold(
appBar: AppBar(
title: Text('Some title'),
actions: <Widget>[
PopupMenuButton<int>(
icon: Icon(Icons.refresh),
onSelected: _canReplay()
? (int size) {
// do something with the size
}
: null,
itemBuilder: (BuildContext context) => <PopupMenuItem<int>>[
_buildMenuItem(3),
_buildMenuItem(4),
_buildMenuItem(5),
],
),
],
),
body: ...
);
更新 - 我已经意识到我的初步问题可能不太清楚,所以我在下面重述:
我想要实现的是根据app条件禁用PopupMenuButton
。使用上面的代码,我可以启用/禁用onSelected
方法调用,但是,图标外观不会改变。
总结一下 - 我希望整个PopupMenuButton
及其图标以同样的方式被禁用IconButton
被禁用,你将null
传递给它的onPressed
方法。这样,用户甚至无法按下按钮并调用菜单。
这可以实现吗?
您可以使用enabled
小部件的PopupMenuItem
属性。
PopupMenuItem<int> _buildMenuItem(int size, bool enabled) {
return PopupMenuItem<int>(
value: size,
child: Text('${size}x$size'),
enabled: enabled,
);
}
itemBuilder: (BuildContext context) => <PopupMenuItem<int>>[
_buildMenuItem(3, true),
_buildMenuItem(4, false),
_buildMenuItem(5, true),
],
更多信息:https://docs.flutter.io/flutter/material/PopupMenuItem/enabled.html
UPDATE
根据您提供给我们的关于您的问题的新信息,不可能使用PopupMenuButton
按钮禁用该按钮,但这是Flutter,因此您可以创建自己的Widget。
我创建了一个自定义PopupMenuButton
,你可以使用enabled
属性,看看:
https://gist.github.com/diegoveloper/a388dd42a01ffff04cd51ec026381fe3
用法:
MyOwnPopupMenuButton<int>(
enabled: _canReplay(),
icon: Icon(
Icons.refresh,
color: _canReplay() ? Colors.black : Colors.black.withOpacity(0.4),
),
onSelected: _canReplay()
? (int size) {
// do something with the size
}
: null,
itemBuilder: (BuildContext context) => <PopupMenuItem<int>>[
_buildMenuItem(3),
_buildMenuItem(4),
_buildMenuItem(5),
],
)
几个小时后,我最终得到了一个符合我要求的以下解决方案,并且无需任何复杂的自定义小部件即可实现。这里是:
return Scaffold(
appBar: AppBar(
title: Text(allTranslations.text('Some title')),
actions: <Widget>[
_canReplay()
? PopupMenuButton<int>(
icon: Icon(Icons.refresh),
onSelected: (int size) {
// do something with size
},
itemBuilder: (BuildContext context) => <PopupMenuItem<int>>[
_buildMenuItem(3),
_buildMenuItem(4),
_buildMenuItem(5),
],
)
: IconButton(
icon: Icon(Icons.refresh),
onPressed: null,
),
],
),
body: ...
);
以上是关于Flutter PopupMenuButton - 如何有条件地禁用它的主要内容,如果未能解决你的问题,请参考以下文章
从 Flutter PopupMenuButton 中删除填充