选择某些内容时,下拉菜单不会更新(Flutter)

DropDown Menu isn't updating when something is selected(Flutter)

我正在尝试在我的 Flutter 项目中创建一个 DropDown 菜单,但是当我按下一个值时,它的值并没有改变。我尝试了几种不同的代码和教程,但它似乎永远不会改变。这是我的代码:

    body: Container(
      padding: EdgeInsets.fromLTRB(10.0, 20.0, 10.0, 30.0),
      child: Column(
        children: <Widget>[
          TextField(
            controller: myController,
            decoration: InputDecoration(
                border: OutlineInputBorder(),
                labelText: 'Title',
                hintText: 'What will you call your grocery list?'),
          ),
          Row(
            children: <Widget>[
              Text(
                'Remind me every ',
                style: GoogleFonts.biryani(fontSize: 15.0),
              ),
              new DropdownButton<String>(
                value: 'Wednesday',
                items: <String>[
                  'Sunday',
                  'Monday',
                  'Tuesday',
                  'Wednesday',
                  'Thursday',
                  'Friday',
                  'Saturday'
                ].map((String value) {
                  return new DropdownMenuItem<String>(
                    value: value,
                    child: new Text(value),
                  );
                }).toList(),
                onChanged: (_) {},
              ),
            ],
          )
        ],
      ),
    )

此外,此代码位于与文件主页分开的 class 内,这也是一个有状态小部件。基本上,我最终会得到两个有状态的小部件,主页和此页面,它不会让我创建两个状态。这是它给我的错误:

The name 'createState' is already defined.
Try renaming one of the declarations.dartduplicate_definition

您正在对下拉按钮中的值参数进行硬编码,因此它永远不会改变。您需要在有状态小部件的开头创建一个变量 class 并像这样初始化

String value = "Wednesday";

您需要更改 DropdownButton 的值 onChanged 函数并调用 setState 以使用新值更新 Ui。 这就是您的有状态小部件 class 的样子

class _MyHomePageState extends State<MyHomePage> {
  String value = "Wednesday";
 
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
      padding: EdgeInsets.fromLTRB(10.0, 20.0, 10.0, 30.0),
      child: Column(
        children: <Widget>[
          Row(
            children: <Widget>[
              new DropdownButton<String>(
                value: value,
                items: <String>[
                  'Sunday',
                  'Monday',
                  'Tuesday',
                  'Wednesday',
                  'Thursday',
                  'Friday',
                  'Saturday'
                ].map((String value) {
                  return new DropdownMenuItem<String>(
                    value: value,
                    child: new Text(value),
                  );
                }).toList(),
                onChanged: (val) {
                  setState((){
                    this.value = val;
                  });
                },
              ),
            ],
          )
        ],
      )));
  }
}

您必须在 DropdownButton 之外声明一个变量并将所选值设置为该变量。

这是一个示例

String _currentValue='Saturday';

 body: Container(
  padding: EdgeInsets.fromLTRB(10.0, 20.0, 10.0, 30.0),
  child: Column(
    children: <Widget>[
      TextField(
        controller: myController,
        decoration: InputDecoration(
            border: OutlineInputBorder(),
            labelText: 'Title',
            hintText: 'What will you call your grocery list?'),
      ),
      Row(
        children: <Widget>[
          Text(
            'Remind me every ',
            style: GoogleFonts.biryani(fontSize: 15.0),
          ),
          new DropdownButton<String>(
            value: _currentValue,
            items: <String>[
              'Sunday',
              'Monday',
              'Tuesday',
              'Wednesday',
              'Thursday',
              'Friday',
              'Saturday'
            ].map((String value) {
              return new DropdownMenuItem<String>(
                value: value,
                child: new Text(value),
              );
            }).toList(),
            onChanged: (_) {
              setState(() {
                  _selectedValue = _;
                });
            },
          ),
        ],
      )
    ],
  ),
)

更新

------------------------

只需使用两个独立且不同的 Stateful 小部件,一个用于页面,一个用于选择器,查看此 dartpad 以更好地了解如何将 StatefulWidget 拆分为两个单独的 StatefulWidgets

https://dartpad.dev/b07af2a7d088caeb312e5fc0cf6c5f10

------------------------

你硬编码了你的“星期三”值,你应该把它放在一个变量中并将它设置在 on changed 方法上,当然所有这些都应该在 StatefulWidget 中完成,因为你正在管理状态

您的有状态小部件

class TestWidget extends StatefulWidget {
  @override
  _TestWidgetState createState() => _TestWidgetState();
}

您所在的州

class _TestWidgetState extends State<TestWidget> {

  //Your String used for defining the selection**
  String _currentSelection = "Wednesday";

  //Your build method    
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("DropDownSample"),
        ),
        body: Container(
          padding: EdgeInsets.fromLTRB(10.0, 20.0, 10.0, 30.0),
          child: Column(
            children: <Widget>[
              Row(
                children: <Widget>[
                  Text('Remind me every '),
                  DropdownButton<String>(
                    //Don't forget to pass your variable to the current value
                    value: _currentSelection,
                    items: <String>[
                      'Sunday',
                      'Monday',
                      'Tuesday',
                      'Wednesday',
                      'Thursday',
                      'Friday',
                      'Saturday'
                    ].map((String value) {
                      return new DropdownMenuItem<String>(
                        value: value,
                        child: new Text(value),
                      );
                    }).toList(),
                    //On changed update the variable name and don't forgot the set state!
                    onChanged: (newValue) {
                      setState(() {
                        _currentSelection = newValue;
                      });
                    },
                  ),
                ],
              )
            ],
          ),
        ));
  }
}

另请检查为什么在更新变量时应使用 setState ;) https://flutter.dev/docs/development/ui/interactive