You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter 如何实现按下一个RaisedButton后禁用其余未选中的按钮

实现方案

你可以通过调整按钮点击时的状态更新逻辑+RaisedButton的禁用规则实现需求,RaisedButton在onPressed为null时会自动进入禁用状态,具体修改如下:

1. 状态逻辑调整

无需新增变量,仅修改按钮点击时的状态赋值逻辑,保证每次只有一个按钮处于选中状态:

  • 点击任意按钮时,将当前按钮状态设为true,另外两个按钮状态强制设为false
  • 按钮的onPressed参数加判断:如果已有其他按钮处于选中状态,当前按钮未被选中的话,就把onPressed设为null实现禁用

2. 修改后完整代码

bool pressMensual = false;
bool pressTrimes = false;
bool pressAnual = false;

Container(
 padding: EdgeInsets.symmetric(horizontal: 2.0),
 child: Column(
  crossAxisAlignment: CrossAxisAlignment.start,
  mainAxisSize: MainAxisSize.min,
  children: <Widget>[
   Container(
    padding: EdgeInsets.only(left: 10.0, right: 10.0),
    child: Column(
     children: [
      Text('PERIODO'),
      Row(
       mainAxisAlignment: MainAxisAlignment.spaceBetween,
       children: <Widget>[
        Padding(
         padding: const EdgeInsets.all(3.0),
         child: RaisedButton(
          shape: RoundedRectangleBorder(
           borderRadius: BorderRadius.circular(10.0)
          ),
          child: Text('MENSUAL'),
          color:  pressMensual ? Colors.blue[100] : Color(0xFF94D500),
          // 其他按钮已选中且当前按钮未选中时,禁用当前按钮
          onPressed: (pressTrimes || pressAnual) ? null : () {
           setState(() {
            pressMensual = true;
            pressTrimes = false;
            pressAnual = false;
           });
          },
         ),
        ),
        RaisedButton(
         shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(10.0)
         ),
         color: pressTrimes ? Colors.blue[100]  : Color(0xFF94D500),
         child: Text('TRIMESTRAL'),
         onPressed: (pressMensual || pressAnual) ? null : () {
            setState(() {
             pressMensual = false;
             pressTrimes = true;
             pressAnual = false;
            });
         },
        ),
        RaisedButton(
         shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(10.0)
         ),
         color: pressAnual ? Colors.blue[100] : Color(0xFF94D500),
         child: Text('ANUAL'),
          onPressed: (pressMensual || pressTrimes) ? null : () {
           setState(() {
            pressMensual = false;
            pressTrimes = false;
            pressAnual = true;
           });
          },
         ),
       ],
      ),
     ],
    ),
   )
  ],
 ),
);

附加说明

如果需要支持取消选中(点击已选中的按钮恢复全部可点状态),可以把每个按钮的点击逻辑改成判断当前按钮是否已选中,如果已选中就把全部状态设为false即可,示例(以月度按钮为例):

onPressed: (pressTrimes || pressAnual) ? null : () {
 setState(() {
  if(pressMensual){
    // 已选中时点击取消
    pressMensual = false;
  }else{
    pressMensual = true;
    pressTrimes = false;
    pressAnual = false;
  }
 });
},

内容的提问来源于stack exchange,提问作者paola

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:15:04