我正在尝试在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':不正确。
答案 0 :(得分:1)
是这个吗?
if (_selectedDistrictValue != null)
应该是if (_selectedDistrictValue == null)
由于_selectedDistrictValue
来自第一个下拉列表getDistrictDropdown
,并且直到选择(onChanged
)时您都无法获得其值,因此开始时它将为null
。
但是您的第二个下拉列表getBlockDropdown
为child: Text("Please Select District first")
设置了!= null
,因此对于== null
,它已经在尝试items: snapshot.data.map((value) =>
了甚至选择了您的第一个下拉菜单。