如何在flutter中制作依赖的多级DropDown?

2023-11-23

我试图使依赖的多级下拉列表首先包含州列表,第二个包含城市列表,所有数据都是从 API 获取的。最初,我加载州下拉列表,当我选择州时,如果我选择城市,则加载该州的城市,成功选择城市,但当我更改州值时,会发生错误。如果第一个下拉列表中发生更改,重新加载第二个下拉列表的正确方法是什么?

错误:应该只有一项具有 [DropdownButton] 的值:“城市”实例。 检测到零个或 2 个或多个 [DropdownMenuItem] 具有相同的值

Future _state;
Future _city;

@override
  void initState() {
    super.initState();
    _state = _fetchStates();
  }
Future<List<StateModel>> _fetchStates() async {
    final String stateApi = "https://dummyurl/state.php";
    var response = await http.get(stateApi);

    if (response.statusCode == 200) {
      final items = json.decode(response.body).cast<Map<String, dynamic>>();

      List<StateModel> listOfUsers = items.map<StateModel>((json) {
        return StateModel.fromJson(json);
      }).toList();

      return listOfUsers;
    } else {
      throw Exception('Failed to load internet');
    }
  }
  Future<List<City>> _fetchCities(String id) async {
    final String cityApi = "https://dummyurl/city.php?stateid=$id";
    var response = await http.get(cityApi);

    if (response.statusCode == 200) {
      final items = json.decode(response.body).cast<Map<String, dynamic>>();
      print(items);
      List<City> listOfUsers = items.map<City>((json) {
        return City.fromJson(json);
      }).toList();

      return listOfUsers;
    } else {
      throw Exception('Failed to load internet');
    }
  }

状态下拉菜单

FutureBuilder<List<StateModel>>(
                                        future: _state,
                                        builder: (BuildContext context,
                                            AsyncSnapshot<List<StateModel>> snapshot) {
                                          if (!snapshot.hasData)
                                            return CupertinoActivityIndicator(animating: true,);
                                          return DropdownButtonFormField<StateModel>(
                                            isDense: true,
                                            decoration: spinnerDecoration('Select your State'),
                                            items: snapshot.data
                                                .map((countyState) => DropdownMenuItem<StateModel>(
                                              child: Text(countyState.billstate),
                                              value: countyState,
                                            ))
                                                .toList(),
                                            onChanged:(StateModel selectedState) {
                                              setState(() {
                                                stateModel = selectedState;
                                                _city = _fetchCities(stateModel.billstateid);
                                              });
                                            },
                                            value: stateModel,
                                          );
                                        }),

城市下拉列表

FutureBuilder<List<City>>(
                                        future: _city,
                                        builder: (BuildContext context,
                                            AsyncSnapshot<List<City>> snapshot) {
                                          if (!snapshot.hasData)
                                            return CupertinoActivityIndicator(animating: true,);
                                          return DropdownButtonFormField<City>(
                                            isDense: true,
                                            decoration: spinnerDecoration('Select your City'),
                                            items: snapshot.data
                                                .map((countyState) => DropdownMenuItem<City>(
                                              child: Text(countyState.billcity)
                                                .toList(),
                                            onChanged: (City selectedValue) {
                                              setState(() {
                                                cityModel = selectedValue;
                                              });
                                            },
                                            value: cityModel,
                                          );
                                        }),
class StateModel {
  String billstateid;
  String billstate;
  String billcountryid;

  StateModel({this.billstateid, this.billstate, this.billcountryid});

  StateModel.fromJson(Map<String, dynamic> json) {
    billstateid = json['billstateid'];
    billstate = json['billstate'];
    billcountryid = json['billcountryid'];
  }
}
class City {
  String billcityid;
  String billcity;
  String billstateid;

  City({this.billcityid, this.billcity, this.billstateid});

  City.fromJson(Map<String, dynamic> json) {
    billcityid = json['billcityid'];
    billcity = json['billcity'];
    billstateid = json['billstateid'];
  }

你必须做cityModel = null in onChanged状态下拉菜单的回调。

setState(() {
  cityModel = null;
  stateModel = selectedState;
  _city = _fetchCities(stateModel.billstateid);
});

应该只有一项具有 [DropdownButton] 的值: “城市”的实例。零个或 2 个或更多 [DropdownMenuItem] 检测到相同的值

此处出现此错误是因为value你正在通过而不是在items of DropdownButtonFormField(城市下拉菜单)。

当您选择一个州时,您正在获取新的城市列表并将其传递给 CityDropDown 但忘记清除先前选择的城市(cityModel).

您还可以参考这个例子:DartPad

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在flutter中制作依赖的多级DropDown? 的相关文章

随机推荐

  • 替换除字符串开头以外的所有字符(正则表达式)

    我正在尝试删除字符串数字中的所有减号 破折号 除了第一次出现之外 摆弄正则表达式 JavaScript 半小时后 仍然没有结果 有谁知道修复方法吗 Given 123 45 6 预期的 123456 Given 789 1 0 预期的 78
  • 为什么我的 TinyMCE 隐藏文本区域出现问题?

    我有大约7个textarea网页上的所有内容都是使用TinyMCE的富文本编辑器 然而 在页面加载时 只有其中 1 个可见 其余的则隐藏 用户可以单击 显示 链接 该链接将一一显示剩余的文本区域 但是 我有一个奇怪的问题 一切textare
  • 如何将 CSV 文件拆分为多个块并在 Java 代码中并行读取这些块

    我有一个非常大的 CSV 文件 1GB 它有 100 000 行 我需要编写一个 Java 程序来解析 CSV 文件中的每一行 以创建要发送的 HTTP 请求的正文 换句话说 我需要发送 100 000 个 HTTP 请求 这些请求与 CS
  • jQuery .text() 多个元素同一个类

    我试图在页面上的多个 未知数量 元素上使用 text 考虑 ul li class myClass element1 li li class myClass element2 li li class myClass element3 li
  • 旋转图像时如何避免OutOfMemory ex?

    public static boolean rotateBitmapByExifAndSave File targetFile if targetFile null targetFile exists targetFile canRead
  • MASM:从程序集中访问全局 C 变量

    我正在编写一个程序来转换图像并比较 C 语言和汇编语言处理数据的速度 我有3个项目 C语言的主要项目 C 中的 DLL 来转换图像 ASM中的DLL用于转换图像 在C DLL头文件中 我简单地写了 ifdef PROJEKTC EXPORT
  • 计算一列中行之间的Datediff(超过2条记录)

    我有一个表 其中有一列日期 我想找出它们之间的差异 我已经能够在您的网站上找到一个答案 让我了解两个日期之间的差异 但找不到任何可以让我了解每个客户的几条记录之间差异的答案 我的数据如下 Customer Pstng Date Henry
  • 如何限制 Chrome 中的并发(并行)浏览器请求?

    背景 我注意到几乎所有代理提供商都有 最大线程数 允许 根据我的理解 这意味着一次并发 并行浏览器请求的最大数量 由于现代网站可以有许多并行请求 因此如何在 Chrome 中限制并行请求 全局范围内整个浏览器 不仅针对每个主机 服务器 而且
  • C++ 排序跟踪索引[重复]

    这个问题在这里已经有答案了 您是否有一些有效的例程来返回带有数组中排序元素索引的数组 我认为使用 stl 存在一些方便的方法vector 您是否已经在不使用 stl 的情况下实现了高效的算法 或者您是否有伪代码或 C 代码的参考 使用 C
  • 工具栏和选项卡之间有一条线

    如何删除工具栏和tablayout之间的深线 我在google上搜索有人说 向工具栏和tablayout添加一些标高 我做了但它不起作用 从工具栏和tablyout中删除标高后 它也不起作用 请帮帮我 tablayout xml
  • Clojure 中向量和列表上 conj 的行为差异

    我是 clojure 的新手 最初我正在经历Clojure org and 作弊簿 我想知道不同行为的确切原因是什么conj在列表和矢量上 conj 1 2 3 4 1 2 3 4 conj list 3 2 1 4 4 3 2 1 当我将
  • 为什么在 PHP 中将整数视为数组 ($int[$index]) 不会引发任何错误? [复制]

    这个问题在这里已经有答案了 这只是出于好奇而提出的一个简单问题 我花了一整天的时间调试我的 PHP 代码 发现问题是由于将整数视为数组造成的 x int index this returns null but no error at all
  • 使用 PHP 连接到远程 MySQL 服务器

    我正在尝试使用以下代码从本地计算机虚拟主机连接到远程 MySQL 服务器 conn mysql connect dbhost dbuser dbpass or die mysql error mysql select db dbname c
  • 在Android中对base64字符串中的位图对象进行编码和解码

    我想要编码和解码Bitmap字符串中的对象base64 我使用Android API10 我尝试过使用这种形式的方法来编码 但没有成功Bitmap public static String encodeTobase64 Bitmap ima
  • 覆盖嵌套路由中的参数

    我希望路线的命名约定保持一致 默认参数是 id对于任何资源 但是 如果其中嵌套了另一个资源 则父资源的参数将更改为 parent id 我的路由看起来像 resources users do resources projects do re
  • Python类继承多处理,访问类成员时遇到问题

    简而言之 假设我有以下内容 import multiprocessing class Worker multiprocessing Process def init self multiprocessing Process init sel
  • 将 SELECT-OPTIONS 文本右对齐

    这些是我正在开发的表单的屏幕截图 我想设计表单中的选择框 使选项中的文本右对齐 并且在选择选项后 所显示的所选文本也应显示如下图所示 HTML 代码
  • 在哪里可以找到 WPF DataGrid 或一般 WPF 控件的 XAML 模板? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想修改控制模板DataGrid 4 0版本 但我不确定现有的模板是什么样的 有谁知道它是什么或者我在哪里可以找到它 一般来说 对于某些WPF控件
  • 设置 MS-Access DB 以进行多用户访问

    我们正在考虑 增长 一个小型 MS Access DB 其中包含一些表 表单和多个用户的查询 使用不同的后端是另一种更长期的选择 不幸的是目前不可接受 大多数用户将是只读的 但会有一些 当前是一两个 用户必须能够进行更改 而只读用户也正在使
  • 如何在flutter中制作依赖的多级DropDown?

    我试图使依赖的多级下拉列表首先包含州列表 第二个包含城市列表 所有数据都是从 API 获取的 最初 我加载州下拉列表 当我选择州时 如果我选择城市 则加载该州的城市 成功选择城市 但当我更改州值时 会发生错误 如果第一个下拉列表中发生更改