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

问题描述 投票:0回答:2

我在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方法。这样,用户甚至无法按下按钮并调用菜单。

这可以实现吗?

flutter
2个回答
0
投票

您可以使用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),
              ],
        )

0
投票

几个小时后,我最终得到了一个符合我要求的以下解决方案,并且无需任何复杂的自定义小部件即可实现。这里是:

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: ...
);
© www.soinside.com 2019 - 2024. All rights reserved.