Dart 颤振中的下拉按钮不将值切换到所选值
我最近开始使用dart和Flatter进行编程,我的应用程序进展顺利,不过最近我想添加下拉菜单,为用户提供多种选择。一切都按计划进行,但当我从列表中选择一个值时,它不会更改框中的值,而是返回提示或空框。任何帮助都将不胜感激 以下是我的下拉按钮代码:Dart 颤振中的下拉按钮不将值切换到所选值,dart,flutter,flutter-layout,Dart,Flutter,Flutter Layout,我最近开始使用dart和Flatter进行编程,我的应用程序进展顺利,不过最近我想添加下拉菜单,为用户提供多种选择。一切都按计划进行,但当我从列表中选择一个值时,它不会更改框中的值,而是返回提示或空框。任何帮助都将不胜感激 以下是我的下拉按钮代码: Widget buildDropdownButton() { String newValue; return new Padding( padding: const EdgeInsets.all(24.0), child: new Colu
Widget buildDropdownButton() {
String newValue;
return new Padding(
padding: const EdgeInsets.all(24.0),
child: new Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
new ListTile(
title: const Text('Frosting'),
trailing: new DropdownButton<String>(
hint: Text('Choose'),
onChanged: (String changedValue) {
newValue=changedValue;
setState(() {
newValue;
print(newValue);
});
},
value: newValue,
items: <String>['None', 'Chocolate', 'Vanilla', 'ButterCream']
.map((String value) {
return new DropdownMenuItem<String>(
value: value,
child: new Text(value),
);
}).toList()),
),
],
),
);
}
Widget buildDropdownButton(){
字符串newValue;
返回新的填充(
填充:常数边集全部(24.0),
子:新列(
mainAxisAlignment:mainAxisAlignment.start,
儿童:[
新ListTile(
标题:常量文本(“磨砂”),
拖尾:新的下拉按钮(
提示:文本('Choose'),
onChanged:(字符串changedValue){
newValue=changedValue;
设置状态(){
新价值;
打印(新值);
});
},
value:newValue,
商品:[‘无’、‘巧克力’、‘香草’、‘奶油’]
.map((字符串值){
返回新的DropdownMenuItem(
价值:价值,
子项:新文本(值),
);
}).toList()),
),
],
),
);
}
错误是因为您正在声明一个方法变量newValue
您必须在StatefulWidget
中将该变量声明为全局变量
String newValue;
Widget buildDropdownButton() {
return new Padding(
padding: const EdgeInsets.all(24.0),
child: new Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
new ListTile(
title: const Text('Frosting'),
trailing: new DropdownButton<String>(
hint: Text('Choose'),
onChanged: (String changedValue) {
newValue=changedValue;
setState(() {
newValue;
print(newValue);
});
},
value: newValue,
items: <String>['None', 'Chocolate', 'Vanilla', 'ButterCream']
.map((String value) {
return new DropdownMenuItem<String>(
value: value,
child: new Text(value),
);
}).toList()),
),
],
),
);
}
字符串newValue;
Widget buildDropdownButton(){
返回新的填充(
填充:常数边集全部(24.0),
子:新列(
mainAxisAlignment:mainAxisAlignment.start,
儿童:[
新ListTile(
标题:常量文本(“磨砂”),
拖尾:新的下拉按钮(
提示:文本('Choose'),
onChanged:(字符串changedValue){
newValue=changedValue;
设置状态(){
新价值;
打印(新值);
});
},
value:newValue,
商品:[‘无’、‘巧克力’、‘香草’、‘奶油’]
.map((字符串值){
返回新的DropdownMenuItem(
价值:价值,
子项:新文本(值),
);
}).toList()),
),
],
),
);
}
我遇到了这个问题,尽管我已经在使用上面的解决方案
对于存在此问题且上述解决方案不起作用的任何人,请尝试将FutureBuilder从下拉列表中分离出来。以下是最终代码的外观:
class TheFuture extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: myFuture(),
builder: (ctx, snp) {
if (!snp.hasData) return LoadingLine();
return TheBuilder(snp.data);
},
);
}
}
class TheBuilder extends StatefulWidget {
const TheBuilder(this.mp);
final Map<String, dynamic> mp;
@override
_MessageUSScreenFilterBodyState createState() =>
_MessageUSScreenFilterBodyState();
}
class _MessageUSScreenFilterBodyState extends State<MessageUSScreenFilterBody> {
int _selectedId;
@override
Widget build(BuildContext context) {
return DropdownButton<int>(
selectedItemBuilder: (context) =>
widget.mp['myData'].map((e) => Text(e.type)).toList(),
items: widget.mp['myData']
.map(
(e) => DropdownMenuItem(
child: Text(e.type),
value: e.id,
),
)
.toList(),
value: _selectedId,
onChanged: (int _id) {
setState(() {
_selectedId = _id;
});
},
);
}
}
class未来扩展无状态小部件{
@凌驾
小部件构建(构建上下文){
回归未来建设者(
future:myFuture(),
承建商:(ctx,snp){
如果(!snp.hasData)返回LoadingLine();
返回生成器(snp.data);
},
);
}
}
类生成器扩展StatefulWidget{
const TheBuilder(this.mp);
最终地图mp;
@凌驾
_MessageUSScreenFilterBodyState createState()=>
_MessageUSScreenFilterBodyState();
}
类_MessageUSScreenFilterBodyState扩展状态{
int_selectedId;
@凌驾
小部件构建(构建上下文){
返回下拉按钮(
selectedItemBuilder:(上下文)=>
widget.mp['myData'].map((e)=>Text(e.type)).toList(),
条目:widget.mp['myData']
.地图(
(e) =>下拉菜单项(
子项:文本(e.type),
值:e.id,
),
)
.toList(),
值:_selectedId,
一旦更改:(int\u id){
设置状态(){
_选择edid=\u id;
});
},
);
}
}
你能把你的有状态小部件放进去吗?你好!我想问你,为什么我们不能在方法中声明一个变量?为什么我们要全局声明一个变量?@datafile4,因为如果您更改,全局值将被保留。如果您在本地定义它,那么如果您将小部件返回,它的值将为null