[英]Flutter: How to set value of second dropdown button (multilevel dependent buttons) on the basis of first dropdown button value selected?
I'm trying to implement the multilevel dependent dropdown buttons in flutter app and the values of button are fetching from database.我正在尝试在颤振应用程序中实现多级相关下拉按钮,并且按钮的值是从数据库中获取的。 While selecting the second dropdown button value I'm getting the error.选择第二个下拉按钮值时出现错误。
`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
);
}
},
);
}`
Error I am getting while selecting second dropdown value:选择第二个下拉值时出现错误:
The following assertion was thrown building FutureBuilder>(dirty, state: I/flutter (26965): _FutureBuilderState>#7dd80): I/flutter (26965): 'package:flutter/src/material/dropdown.dart': Failed assertion: line 608 pos 15: 'items == null ||构建 FutureBuilder>(dirty, state: I/flutter (26965): _FutureBuilderState>#7dd80): I/flutter (26965): 'package:flutter/src/material/dropdown.dart': 断言失败:第 608 行 pos 15: 'items == null || I/flutter (26965): items.isEmpty ||我/颤振(26965):items.isEmpty || value == null ||值 == 空 || items.where((DropdownMenuItem item) => item.value == I/flutter (26965): value).length == 1': is not true. items.where((DropdownMenuItem item) => item.value == I/flutter (26965): value).length == 1': 不正确。
Is this it?是这个吗?
if (_selectedDistrictValue != null)
should be if (_selectedDistrictValue == null)
if (_selectedDistrictValue != null)
应该是if (_selectedDistrictValue == null)
Since _selectedDistrictValue
is from your first dropdown getDistrictDropdown
, and you don't get its value until selection ( onChanged
), then it will be null
at start.由于_selectedDistrictValue
来自您的第一个下拉菜单getDistrictDropdown
,并且在选择( onChanged
)之前您不会获得它的值,因此它在开始时将为null
。
But your second dropdown getBlockDropdown
has conditioned child: Text("Please Select District first")
for != null
, so that means for == null
, it is already trying to do items: snapshot.data.map((value) =>
before you have even selected your first dropdown.但是你的第二个下拉菜单getBlockDropdown
有条件child: Text("Please Select District first")
for != null
,所以这意味着== null
,它已经在尝试做items: snapshot.data.map((value) =>
在您甚至选择第一个下拉列表之前。
you shoud deleted _selectedBlockValue<\/code> after change
_selectedDistrictValue<\/code> because this value not in another list
您应该在更改
_selectedDistrictValue<\/code>后删除
_selectedBlockValue<\/code> ,因为该值不在另一个列表中
in onChnage for the first dropdown在 onChnage 中用于第一个下拉菜单
onChanged: (selectedValue) {
setState(() {
_selectedDistrictValue = selectedValue;
_selectedBlokValue != null ? null : null;
});
},
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.