Dart 颤振中的下拉按钮不将值切换到所选值

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

我最近开始使用dart和Flatter进行编程,我的应用程序进展顺利,不过最近我想添加下拉菜单,为用户提供多种选择。一切都按计划进行,但当我从列表中选择一个值时,它不会更改框中的值,而是返回提示或空框。任何帮助都将不胜感激

以下是我的下拉按钮代码:

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