下拉值不能设置为空
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 finalString name; finalint id、countryId、stateId、districtId、mandalId;位置(this.name,this.id,this.countryId,this.stateId,this.districtId,this.mandalId);工厂位置.fromJson(Mapjson) returnLocation(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以上是关于下拉值不能设置为空的主要内容,如果未能解决你的问题,请参考以下文章