简体   繁体   English

"Flutter:如何根据选择的第一个下拉按钮值设置第二个下拉按钮(多级相关按钮)的值?"

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM