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
相关产品推荐
相关产品推荐

