flutter 下拉值不能设置为空

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

我实现了两个下拉列表。当我选择州和地区时,它工作得很好。当我更改状态时,它显示错误。在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'

  1. class AddAddress extends StatelessWidget {
  2. @override
  3. Widget build(BuildContext context) {
  4. return AddAddressPage();
  5. }
  6. }
  7. class AddAddressPage extends StatefulWidget {
  8. @override
  9. _AddAddressPageState createState() => _AddAddressPageState();
  10. }
  11. class _AddAddressPageState extends State<AddAddressPage> {
  12. bool loader = false;
  13. int intState;
  14. int intDistrict;
  15. List<Location> districts=listDistricts;
  16. List<Location> states=listStates;
  17. getDistricts()async{
  18. setState(() {
  19. loader=false;
  20. });
  21. List<Location> district= await service.getDistrictsByStateId(intState);
  22. setState(() {
  23. districts=district;
  24. loader=false;
  25. });
  26. }
  27. @override
  28. Widget build(BuildContext context) {
  29. return Scaffold(
  30. appBar: AppBar(
  31. title: Text("Address"),
  32. backgroundColor: Colors.white,
  33. centerTitle: true,
  34. ),
  35. body: Stack(
  36. children: <Widget>[
  37. SingleChildScrollView(
  38. child: Padding(
  39. padding: const EdgeInsets.only(top: 10.0, left: 30, right: 30),
  40. child: Form(
  41. child: Container(
  42. child: Column(
  43. children: <Widget>[
  44. Padding(
  45. padding: const EdgeInsets.only(top: 15.0),
  46. child: DropdownButtonFormField<int>(
  47. decoration: InputDecoration(
  48. contentPadding:
  49. const EdgeInsets.only(left: 30, right: 10),
  50. border: OutlineInputBorder(
  51. borderRadius:
  52. BorderRadius.all(Radius.circular(15))),
  53. ),
  54. hint: Text('state'),
  55. value: intState,
  56. items: states.map((location) {
  57. return new DropdownMenuItem<int>(
  58. child: Text(location.name),
  59. value: location.id,
  60. );
  61. }).toList(),
  62. onChanged: (int value) {
  63. setState(() {
  64. intState = value;
  65. intDistrict=null;
  66. getDistricts();
  67. });
  68. }),
  69. ),
  70. Padding(
  71. padding: const EdgeInsets.only(top: 15.0),
  72. child: DropdownButtonFormField<int>(
  73. decoration: InputDecoration(
  74. contentPadding:
  75. const EdgeInsets.only(left: 30, right: 10),
  76. border: OutlineInputBorder(
  77. borderRadius:
  78. BorderRadius.all(Radius.circular(15))),
  79. ),
  80. hint: Text(' district'),
  81. value: intDistrict,
  82. items: districts.map((location) {
  83. return new DropdownMenuItem<int>(
  84. child: Text(location.name),
  85. value: location.id,
  86. );
  87. }).toList(),
  88. onChanged: (int value) {
  89. intDistrict = value;
  90. }),
  91. ),
  92. ],
  93. ),
  94. ),
  95. ),
  96. ),
  97. ),
  98. ProgressLoader(
  99. loader: loader,
  100. )
  101. ],
  102. ),
  103. );
  104. }
  105. }

字符串
x1c 0d1x的数据

b1zrtrql

b1zrtrql1#

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

  1. onChanged: (int value) {
  2. setState(() {
  3. intState = value;
  4. districts.clear(); // added line
  5. intDistrict=null;
  6. getDistricts();
  7. });
  8. }),

字符串

1tu0hz3e

1tu0hz3e2#

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

  1. int intDistrict = 999; /// example
  2. List<Location> district= await service.getDistrictsByStateId(intState);
  3. /// set a default district on getDistricts()
  4. district.add(Location(name = "select district", id: 999));
  5. setState(() {
  6. districts=district;
  7. loader=false;
  8. });
  9. /// when you change to a new state, set intDistrict to default
  10. onChanged: (int value) {
  11. setState(() {
  12. intState = value;
  13. intDistrict = 999;
  14. getDistricts();
  15. });

字符串

展开查看全部
7y4bm7vi

7y4bm7vi3#

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

ppcbkaq5

ppcbkaq54#

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

相关问题