调用setState时如何强制flutter重建特定的小部件

时间:2020-06-03 21:55:25

标签: flutter dart widget setstate

我有一个stateful widget班。它的build方法中有一个listView。在列表视图中,我有两个dropDownButtonFormField。最初,仅显示第一个下拉列表。在to中选择一个值后,通过调用set state绘制第二个下拉列表。第二个下拉按钮取决于第一个按钮的选择。

现在代码可以正常工作了。在第一个下拉按钮中选择值之后,第二个下拉按钮将出现,其中包含与第一个选定值相对应的选项。但是,如果选择了第二个按钮的一个选项并且更改了第一个按钮的选项,则会发生错误。

每次更改第一个下拉菜单的选定选项时,如何强制Flutter重新绘制第二个下拉菜单?

这是应用程序正在运行并崩溃:

app giving error

代码:

//called inside the list view childrens list
Widget showLocationDropDown() {
    return Padding(
      padding: const EdgeInsets.fromLTRB(0.0, 20.0, 0.0, 0.0),
      child: Container(
        child: Column(
          children: <Widget>[
            _getProvinceDropDown(),
            _selectedProvince == null ? Container(): _getCityDropDown(),
          ],
        ),
      ),
    );
  }

 Widget _getCityDropDown() {
    return Column(
      children: <Widget>[
        Container(
          height: 20,
        ),
        Row(
          children: <Widget>[
            Icon(Icons.location_city, color: Colors.grey),
            Container(
              width: 17.0,
            ),
            Expanded(
              child: ButtonTheme(
                alignedDropdown: true,
                child: DropdownButtonFormField(
                  decoration: InputDecoration(
                      enabledBorder: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(25.0),
                          borderSide: BorderSide(color: Colors.grey))),
                  hint: Text('Please choose your city'),
                  value: _selectedCity,
                  onChanged: (newValue) {
                    setState(() {
                      _selectedCity = newValue;
                    });
                  },
                  items: _getCities().map((location) {
                    return DropdownMenuItem(
                      child: Text(location),
                      value: location,
                    );
                  }).toList(),
                ),
              ),
            ),
          ],
        ),
      ],
    );
  }

  List<String> _getCities() {
    switch (_selectedProvince) {
      case ("Sindh"):
        return _sindhCities;

      case ("Punjab"):
        return _punjabCities;

      case ("Balouchistan"):
        return _balouchCities;

      case ("KPK"):
        return _kpkCities;
    }
    List<String> deflt = ['Please Select Province'];
    return deflt;
  }

  Widget _getProvinceDropDown() {
    return Row(
      children: <Widget>[
        Icon(Icons.map, color: Colors.grey),
        Container(
          width: 17.0,
        ),
        Expanded(
          child: ButtonTheme(
            alignedDropdown: true,
            child: DropdownButtonFormField(
              decoration: InputDecoration(
                enabledBorder: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(25.0),
                  borderSide: BorderSide(color: Colors.grey),
                ),
              ),
              hint: Text('Please choose your province'),
              value: _selectedProvince,
              onChanged: (newValue) {
                setState(() {
                  _selectedProvince = newValue;
                  _selectedCity = null;
                  stateChange = !stateChange;
                });
              },
              items: _province.map((province) {
                return DropdownMenuItem(
                  child: Text(province),
                  value: province,
                );
              }).toList(),
            ),
          ),
        ),
      ],
    );
  }

2 个答案:

答案 0 :(得分:1)

运行TF3.rx .controlEvent(.editingDidBegin) .skip(1) .subscribe(onNext: { () in // show new view }).disposed(by: disposeBag) 正常。

答案 1 :(得分:0)

尝试_selectedCity = _getCities()。而不是_selectedCity = null。