Flutter PopupMenuButton - 如何有条件地禁用它

Ang*_*rov 3 flutter

我有一个简单的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: ...
);
Run Code Online (Sandbox Code Playgroud)

更新 - 我意识到我最初的问题可能不太清楚,所以我在下面重新表述:

我想实现的是PopupMenuButton根据应用程序条件禁用。使用上面的代码,我可以启用/禁用onSelected方法调用,但是图标外观不会改变。

总结一下 - 我希望整个及其图标以与您传递给其方法PopupMenuButton相同的方式被禁用。这样,用户甚至无法按下按钮并调用菜单。IconButtonnullonPressed

这可以实现吗?

die*_*per 7

您可以使用小部件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),
      ],
Run Code Online (Sandbox Code Playgroud)

更多信息:https://docs.flutter.io/flutter/material/PopupMenuItem/enabled.html

更新

根据您向我们提供的有关问题的新信息,不可能使用按钮禁用该按钮PopupMenuButton,但这是 Flutter,因此您可以创建自己的 Widget。

我创建了一个自定义,PopupMenuButton您可以在其中使用该enabled属性,请看一下:

https://gist.github.com/diegovoper/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),
              ],
        )
Run Code Online (Sandbox Code Playgroud)