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 中删除填充

Flutter:在选择时重定向PopupMenuButton页面

悬停时显示/隐藏下拉菜单 Flutter for web

Flutter Web:需要带有子菜单的菜单

Flutter - 选择项目后弹出菜单未关闭

选择项目后如何不关闭 PopUpMenuButton?