下拉值不能设置为空

Posted

技术标签:

【中文标题】下拉值不能设置为空【英文标题】:Dropdown value can not be set null 【发布时间】:2020-07-29 21:58:04 【问题描述】:

我实现了两个下拉菜单。当我选择州和地区时,它工作正常。当我更改状态时,它向我显示一个错误。在 getDistricts() 方法中设置地区下拉值 null。请提前帮助和感谢。

在控制台中收到此错误:

应该只有一项具有 [DropdownButton] 的值:1。 使用 相同的值 'package:flutter/src/material/dropdown.dart': 失败 断言:第 828 行 pos 15:'items == null || items.isEmpty ||值 == 空 || items.where((DropdownMenuItem item) return item.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,
          )
        ],
      ),
    );
  

【问题讨论】:

能否提供一个完全可重现的代码示例? 更新代码。请检查@Joni 它仍然不能完全重现。可重现意味着我只需将您的代码复制到一个空的“main.dart”文件中,它就可以编译和运行,而无需我先修复各种“未定义名称”错误等。请参阅本指南 (***.com/help/minimal-reproducible-example) 以获得更多帮助。 ​class​ ​Location​ ​final​​String​ name; ​final​​​int​ id、countryId、stateId、districtId、mandalId;​位置​(​this​.name,​this​.id,​this​.countryId,​this​.stateId,​this​.districtId,​this​.mandalId);​工厂​​位置​.​fromJson​(​Map​​json) ​return​​​Location​(name​:​json[​'name'​], id​:​ json[​'id'​], countryId​:​ json[​'countryId'​], stateId​:​ json[​'stateId'​], DistrictId​:​ json[​'districtId'​], mandalId ​:​ json[​'mandalId'​], ); 。这是我所能提供的。 因为我使用网络电话。@Joni请帮帮我。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

对于任何为此苦苦挣扎的人,您需要为您的地区设置一个默认值。这样 (1) 下拉菜单永远不会为空,(2) 如果地区来自(例如 API)作为空数组,下拉菜单值将始终匹配至少 1 个项目的值。


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();
);

【讨论】:

【参考方案3】:

感谢各位的帮助。我发现了问题。因为我在 dropdown.dart 文件中升级了 Flutter SDK(不是 Stable SDK),所以与之前的有一些变化。所以我对比了稳定版的SDK,修改了文件。感谢您的时间和帮助。

【讨论】:

你能分享更多关于你如何解决它的细节吗? @Bliv_Dev 基本上我们可以使用 Flutter SDK 的三个不同通道。看到这个link。我在颤振中使用构建网页,所以我需要使用开发版 SDK

以上是关于下拉值不能设置为空的主要内容,如果未能解决你的问题,请参考以下文章

解决daterangepicker 初始化默认值不能设置为空,双日历初始不能选择当天日期的问题;

如何通过jquery将下拉列表中的选定值设置为空

jQuery下拉框,不能使字段值为空

angular 下拉框null默认值

45、vue select下拉框绑定默认值

EditText android:text 设置的默认值运行的时候为空并且不能滚动