Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 管制及;禁用颤振中的下拉按钮?_Flutter - Fatal编程技术网

Flutter 管制及;禁用颤振中的下拉按钮?

Flutter 管制及;禁用颤振中的下拉按钮?,flutter,Flutter,我想控制一个下拉按钮,并使用按钮使其不可点击 有没有办法让它禁用。基本上不允许它改变 new DropdownButton( value: animalName, items: animals.map( (String value) { return new DropdownMenuItem<String>( value: value,

我想控制一个下拉按钮,并使用按钮使其不可点击

有没有办法让它禁用。基本上不允许它改变

new DropdownButton(
          value: animalName,
          items: animals.map(
            (String value) {
              return new DropdownMenuItem<String>(
                value: value,
                child: new Text('$value'),
              );
            },
          ).toList(),
          onChanged: (value) {
            setState(() {
              animalName = value;
            });
          },
        ),
新建下拉按钮(
值:animalName,
物品:动物地图(
(字符串值){
返回新的DropdownMenuItem(
价值:价值,
子项:新文本(“$value”),
);
},
).toList(),
一旦更改:(值){
设置状态(){
动物名=值;
});
},
),

这是我目前在下拉按钮上使用的代码,但我无法禁用它。

这不是你想听到的,但我认为目前没有简单的方法。我试着简单地删除所有的项目,这导致了一个很好的小崩溃。也许值得在github上向Flatter的人提出一个问题

现在有一个可能对你来说足够好的替代方案。如果将DropdownButton包装在IgnorePointer中,当您希望禁用它时,可以将IgnorePointer的
忽略
属性更改为true

这样,如果用户点击它,它不会做任何事情

但是您可能希望以某种方式向用户指示它也被禁用,比如设置提示文本(因为它是灰色的)

child:新的IgnorePointer(
是的,
孩子:新的下拉按钮(
提示:新文本(“已禁用”),
项目:[“asdf”、“wehee”、“asdf2”、“qwer”]地图(
(字符串值){
返回新的DropdownMenuItem(
价值:价值,
子项:新文本(“$value”),
);
},
).toList(),
一旦更改:(值){},
),

好吧,我找到了一个让我满意的窍门 我想让它根据具体情况隐藏/显示

课堂上 首先创建一个函数,例如:

  _buildDropDown(bool enable) {
    if (enable) {
      return DropdownButton<String>(
        hint: Text("Hint"),
        items: <String>[
          'item 1',
          'item 2',
          'item 3',
        ].map((String value) {
          return new DropdownMenuItem<String>(
            value: value,
            child: new Text(value),
          );
        }).toList(),
        onChanged: (value) {},
      );
    } else { // Just Divider with zero Height xD
      return Divider(color: Colors.white, height: 0.0);
    }
  }
\u构建下拉列表(bool启用){
如果(启用){
返回下拉按钮(
提示:文本(“提示”),
项目:[
“项目1”,
“项目2”,
“项目3”,
].map((字符串值){
返回新的DropdownMenuItem(
价值:价值,
子项:新文本(值),
);
}).toList(),
一旦更改:(值){},
);
}else{//仅为高度为零的除法器xD
返回分隔符(颜色:Colors.white,高度:0.0);
}
}
现在正在建造中

bool enable = true;

@override
Widget build(BuildContext context) {
  return Column(
    children: <Widget>[
      CheckboxListTile(
        title: const Text('Switcher'),
        selected: true,
        value: enable,
        onChanged: (bool value) {
          setState(() {
            enable = value;
          });
        },
      ),
      _buildDropDown(enable),
    ],
  );
}
bool enable=true;
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
CheckboxListTile(
标题:常量文本(“切换器”),
选择:正确,
值:启用,
一旦更改:(布尔值){
设置状态(){
启用=值;
});
},
),
_构建下拉列表(启用),
],
);
}

现在,每次更改enable时,它都会显示和隐藏在DropdownButton文档中找到的

如果items或onChanged为空,则按钮将被禁用,向下箭头将变灰,并且将显示disabledHint(如果提供)

如果items或onChanged为空,则按钮将被禁用,按钮将关闭 箭头将灰显,并且将显示disabledHint(禁用)(如果 (提供)

因此,类似这样的方法应该有效:

DropdownButton<String>(
  ...
  onChanged: this.enabled ? (id) => setState(() => this.id = id) : null,
)
下拉按钮(
...
onChanged:this.enabled?(id)=>setState(()=>this.id=id):null,
)

如果将
onChanged
设置为null,则可以禁用
dropdownbutonformfield
DropdownButton
,如果希望该下拉列表仍显示选定值,则必须设置
disabledHint
。例如:

     DropdownButtonFormField<String>(
        disabledHint: Text(_selectedItem),
        value: _selectedItem,
        onChanged: enabled ? (value) => setState(() => _selectedItem = value) : null,
        items: items.map<DropdownMenuItem<String>>((item) {
          return DropdownMenuItem(
            value: item,
            child: Text(item),
          );
        }).toList(),
      )
DropdownButtonFormField(
disabledHint:文本(_selectedItem),
值:_selectedItem,
一旦更改:已启用?(值)=>setState(()=>\u selectedItem=value):空,
items:items.map((item){
返回下拉菜单项(
价值:项目,,
子项:文本(项),
);
}).toList(),
)
以下是简单的答案。 您可以使用IgnorePointer小部件将其包装,以使DropdownButton禁用

IgnorePointer(
      ignoring:  enabled,
      child: new DropdownButton(
          value: animalName,
          items: animals.map(
            (String value) {
              return new DropdownMenuItem<String>(
                value: value,
                child: new Text('$value'),
              );
            },
          ).toList(),
          onChanged: (value) {
            setState(() {
              animalName = value;
            });
          },
        ),
);
IgnorePointer(
忽略:已启用,
孩子:新的下拉按钮(
值:animalName,
物品:动物地图(
(字符串值){
返回新的DropdownMenuItem(
价值:价值,
子项:新文本(“$value”),
);
},
).toList(),
一旦更改:(值){
设置状态(){
动物名=值;
});
},
),
);
用于禁用 onChange:null

用于禁用标题
disabledHint:Text(“您的提示文本”)

不更改其他小部件是什么意思?我让它更容易理解。只需返回一个空的
容器
,例如
返回容器()
问题在于,如果禁用,则value属性不会反映并通过defaultdisable提示选择它。Disable提示应与not disabledHint:!isDisable?null:Text(“您的提示文本”)一起使用,
IgnorePointer(
      ignoring:  enabled,
      child: new DropdownButton(
          value: animalName,
          items: animals.map(
            (String value) {
              return new DropdownMenuItem<String>(
                value: value,
                child: new Text('$value'),
              );
            },
          ).toList(),
          onChanged: (value) {
            setState(() {
              animalName = value;
            });
          },
        ),
);
DropdownButtonFormField(
     onChange: isDisable ? null : (str){
        
     },
     disabledHint: isDisable ?  null : Text('Your hint text'),
     ...
)