Flutter:如何根据所选的第一个下拉按钮值设置第二个下拉按钮(依赖于多级按钮)的值?

时间:2019-07-23 11:38:56

标签: flutter future dropdownbutton

我正在尝试在flutter应用程序中实现多级依赖下拉按钮,并且按钮的值正在从数据库中获取。选择第二个下拉按钮值时出现错误。

`DistrictData _selectedDistrictValue;
BlockData _selectedBlockValue;
@override
void initState() {
// TODO: implement initState
_districtValues = databaseObject.getDistrictList();  //able to get 
values from database
super.initState(); 
}
@override
Widget build(BuildContext context) {
return Scaffold(
  appBar: AppBar(
    title: Text('Search'),
  ),
  body: Container(
    padding: const EdgeInsets.symmetric(vertical: 20.0),
    child: Builder(
      builder: (context) => Form(
        key: _formKey,
        autovalidate: true,
        child: ListView(
          // crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            SizedBox(height: 10.0),             
            Container(
              padding: EdgeInsets.all(10.0),
              child: getDistrictDropdown(),
            ),
        Container(
              padding: EdgeInsets.all(10.0),
              child: getBlockDropdown(),
            ),
            RaisedButton(
              child: Text("Search"),
              onPressed: () {
                Navigator.of(context).push(MaterialPageRoute(
                    builder: (BuildContext context) => 
              SearchResults()));
              },
            ),
          ],
        ),
      ),
    ),
  ),
);
}
Widget getDistrictDropdown() {
return Center(
  child: FutureBuilder(
    future: _districtValues,
    builder:
        (BuildContext context, AsyncSnapshot<List<DistrictData>> snapshot) {
      if (!snapshot.hasData) return CircularProgressIndicator();
      return DropdownButton<DistrictData>(
        isExpanded: true,
        hint: Text("District"),
        items: snapshot.data
            .map((value) => DropdownMenuItem<DistrictData>(
                  child: Text(value.districtName),
                  value: value,
                ))
            .toList(),              
        onChanged: (selectedValue) {
          setState(() {
            _selectedDistrictValue = selectedValue;
          });
        },
        value: _selectedDistrictValue,
      );
    },
  ),
);
}
Widget getBlockDropdown() {
if (_selectedDistrictValue != null) {
  return FutureBuilder(
      future: databaseObject.getBlockList(_selectedDistrictValue.districtCode), //able to get blocks from database
      builder:
          (BuildContext context, AsyncSnapshot<List<BlockData>> snapshot) {
        if (!snapshot.hasData){return Container(
    child: Text("Please Select District first"),
  );} 
        else{
          return DropdownButton<BlockData>(
            isExpanded: true,
            hint: Text("Block"),
            items: snapshot.data
                .map((value) => DropdownMenuItem<BlockData>(
                      child: Text(value.blockName),
                      value: value,
                    ))
                .toList(),
            onChanged: (selectedValue) {
              setState(() {
                _selectedBlockValue = selectedValue;
              });  
            },
            value: _selectedBlockValue,  //getting error while setting value here. If i commented this it works fine but then i not able to show selected value on dropdown
          );
       }
      },
    );
  }`

选择第二个下拉值时出现错误:

  

以下断言被抛出   FutureBuilder>(脏,状态:I / flutter(26965):   _FutureBuilderState>#7dd80):I / flutter(26965):'package:flutter / src / material / dropdown.dart':断言失败:行   608 pos 15:“项目== null || I / flutter(26965):item.isEmpty ||   值== null || items.where(((DropdownMenuItem item)=> item.value   == I / flutter(26965):值)。长度== 1':不正确。

1 个答案:

答案 0 :(得分:1)

是这个吗?

if (_selectedDistrictValue != null)应该是if (_selectedDistrictValue == null)

由于_selectedDistrictValue来自第一个下拉列表getDistrictDropdown,并且直到选择(onChanged)时您都无法获得其值,因此开始时它将为null

但是您的第二个下拉列表getBlockDropdownchild: Text("Please Select District first")设置了!= null,因此对于== null,它已经在尝试items: snapshot.data.map((value) =>了甚至选择了您的第一个下拉菜单。