[英]Flutter: How to set value of second dropdown button (multilevel dependent buttons) on the basis of first dropdown button value selected?
我正在尝试在颤振应用程序中实现多级相关下拉按钮,并且按钮的值是从数据库中获取的。 选择第二个下拉按钮值时出现错误。
`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>(dirty, state: I/flutter (26965): _FutureBuilderState>#7dd80): I/flutter (26965): 'package:flutter/src/material/dropdown.dart': 断言失败:第 608 行 pos 15: 'items == null || 我/颤振(26965):items.isEmpty || 值 == 空 || items.where((DropdownMenuItem item) => item.value == I/flutter (26965): value).length == 1': 不正确。
是这个吗?
if (_selectedDistrictValue != null)
应该是if (_selectedDistrictValue == null)
由于_selectedDistrictValue
来自您的第一个下拉菜单getDistrictDropdown
,并且在选择( onChanged
)之前您不会获得它的值,因此它在开始时将为null
。
但是你的第二个下拉菜单getBlockDropdown
有条件child: Text("Please Select District first")
for != null
,所以这意味着== null
,它已经在尝试做items: snapshot.data.map((value) =>
在您甚至选择第一个下拉列表之前。
您应该在更改
_selectedDistrictValue<\/code>后删除
_selectedBlockValue<\/code> ,因为该值不在另一个列表中
在 onChnage 中用于第一个下拉菜单
onChanged: (selectedValue) {
setState(() {
_selectedDistrictValue = selectedValue;
_selectedBlokValue != null ? null : null;
});
},
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.