flutter 下拉值不能设置为空

shstlldc  于 2023-08-07  发布在  Flutter
关注(0)|答案(4)|浏览(144)

我实现了两个下拉列表。当我选择州和地区时,它工作得很好。当我更改状态时,它显示错误。在getDistricts()方法中设置区域下拉列表值为空。请帮助并提前表示感谢。

在控制台得到此错误:

应该只有一个项目具有[DropdownButton]的值:1.检测到零个或2个或更多个[DropdownMenuItem]具有相同值“package:flutter/src/material/dropple. dart”:Assert失败:第828行位置15:'项目== null|| items.isEmpty ||value == null|| items.where((DropdownMenuItem item){ return item.value == value;}).length == 1'

class AddAddress extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return AddAddressPage();
  }
}

class AddAddressPage extends StatefulWidget {
  @override
  _AddAddressPageState createState() => _AddAddressPageState();
}

class _AddAddressPageState extends State<AddAddressPage> {
  bool loader = false;
  int intState;
  int intDistrict;
  List<Location> districts=listDistricts;
  List<Location> states=listStates;
  getDistricts()async{
    setState(() {
      loader=false;
    });
  List<Location> district= await service.getDistrictsByStateId(intState);
   setState(() {
     districts=district;
      loader=false;
    });
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Address"),
        backgroundColor: Colors.white,
        centerTitle: true,
      ),
      body: Stack(
        children: <Widget>[
          SingleChildScrollView(
            child: Padding(
              padding: const EdgeInsets.only(top: 10.0, left: 30, right: 30),
              child: Form(
                child: Container(
                  child: Column(
                    children: <Widget>[
                      Padding(
                        padding: const EdgeInsets.only(top: 15.0),
                        child: DropdownButtonFormField<int>(
                            decoration: InputDecoration(
                              contentPadding:
                                  const EdgeInsets.only(left: 30, right: 10),
                              border: OutlineInputBorder(
                                  borderRadius:
                                      BorderRadius.all(Radius.circular(15))),
                            ),
                            hint: Text('state'),
                            value: intState,
                            items: states.map((location) {
                              return new DropdownMenuItem<int>(
                                child: Text(location.name),
                                value: location.id,
                              );
                            }).toList(),
                            onChanged: (int value) {
                              setState(() {
                                intState = value;
                             intDistrict=null;
                              getDistricts();
                              });

                            }),
                      ),
                     Padding(
                        padding: const EdgeInsets.only(top: 15.0),
                        child: DropdownButtonFormField<int>(
                            decoration: InputDecoration(
                              contentPadding:
                                  const EdgeInsets.only(left: 30, right: 10),
                              border: OutlineInputBorder(
                                  borderRadius:
                                      BorderRadius.all(Radius.circular(15))),
                            ),
                            hint: Text(' district'),
                            value: intDistrict,
                            items: districts.map((location) {
                              return new DropdownMenuItem<int>(
                                child: Text(location.name),
                                value: location.id,
                              );
                            }).toList(),
                            onChanged: (int value) {
                              intDistrict = value;
                            }),
                      ),

                    ],
                  ),
                ),
              ),
            ),
          ),
          ProgressLoader(
            loader: loader,
          )
        ],
      ),
    );
  }
}

字符串
x1c 0d1x的数据

b1zrtrql

b1zrtrql1#

我认为问题是,当你选择新的状态时,你只是将intDistrict值设置为null,而District下拉列表中有dropdownitems,所以我认为如果你在将intDistrict设置为null之前清除District,那么它应该可以工作。

onChanged: (int value) {
            setState(() {
          intState = value;
          districts.clear(); // added line
          intDistrict=null;
          getDistricts();
      });
    }),

字符串

1tu0hz3e

1tu0hz3e2#

对于任何人来说,您需要为您的地区设置默认值。因此(1)dropdown永远不会为空,(2)如果地区来自,则dropdown值将始终匹配至少1个项目的值,例如API作为空数组。

int intDistrict = 999; /// example

List<Location> district= await service.getDistrictsByStateId(intState);

/// set a default district on getDistricts()
district.add(Location(name = "select district", id: 999));
   setState(() {
     districts=district;
      loader=false;
    });

/// when you change to a new state, set intDistrict to default
onChanged: (int value) {
   setState(() {
      intState = value;
      intDistrict = 999;
      getDistricts();
});

字符串

7y4bm7vi

7y4bm7vi3#

但是如果我们需要使用String myItem;因此value:myItem将为null以允许使用提示:Text('select ')?我们不能使用一个没有初始化的字符串,所以不能为null,但同时提示只有在value = myItem为null时才有效。我不明白。

ppcbkaq5

ppcbkaq54#

谢谢你们的帮忙。我发现了这个问题。自从我升级了flutter SDK(不是稳定的SDK)在dallow.dart文件中战神一些变化。所以我对比了稳定版SDK并修改了文件。谢谢你的时间和帮助伙计们。

相关问题