我正在开发一个带有Ffltter的移动应用程序.我正在为申请准备一个注册页面.在注册页面上,我想要获得用户居住的城市和县.我放了两个DropdownButtonForm的这个.

在用户 Select 第一个DropdownButtonForm中的城市后,第二个DropdownButtonForm将具有县选项.我可以用下面的代码做到这一点:

   List<DropdownMenuItem<String>> kahramanmarasDistricts = [
      const DropdownMenuItem(
        value: "Onikişubat",
        child: Text("Onikişubat"),
      ),
      const DropdownMenuItem(
        value: "Dulkadiroğlu",
        child: Text("Dulkadiroğlu"),
      ),
      const DropdownMenuItem(
        value: "Elbistan",
        child: Text("Elbistan"),
      ),
      const DropdownMenuItem(
        value: "Afşin",
        child: Text("Afşin"),
      ),
      const DropdownMenuItem(
        value: "Türkoğlu",
        child: Text("Türkoğlu"),
      ),
      const DropdownMenuItem(
        value: "Pazarcık",
        child: Text("Pazarcık"),
      ),
      const DropdownMenuItem(
        value: "Göksun",
        child: Text("Göksun"),
      ),
      const DropdownMenuItem(
        value: "Andırın",
        child: Text("Andırın"),
      ),
      const DropdownMenuItem(
        value: "Çağlayancerit",
        child: Text("Çağlayancerit"),
      ),
      const DropdownMenuItem(
        value: "Nurhak",
        child: Text("Nurhak"),
      ),
      const DropdownMenuItem(
        value: "Ekinözü",
        child: Text("Ekinözü"),
      ),
    ];
    
    List<DropdownMenuItem<String>> diyarbakirDistricts = [
      const DropdownMenuItem(
        value: "Bağlar",
        child: Text("Bağlar"),
      ),
      const DropdownMenuItem(
        value: "Bismil",
        child: Text("Bismil"),
      ),
      const DropdownMenuItem(
        value: "Çermik",
        child: Text("Çermik"),
      ),
      const DropdownMenuItem(
        value: "Çınar",
        child: Text("Çınar"),
      ),
      const DropdownMenuItem(
        value: "Çüngüş",
        child: Text("Çüngüş"),
      ),
      const DropdownMenuItem(
        value: "Dicle",
        child: Text("Dicle"),
      ),
      const DropdownMenuItem(
        value: "Egir",
        child: Text("Eğir"),
      ),
      const DropdownMenuItem(
        value: "Ergani",
        child: Text("Ergani"),
      ),
      const DropdownMenuItem(
        value: "Hani",
        child: Text("Hani"),
      ),
      const DropdownMenuItem(
        value: "Hazro",
        child: Text("Hazro"),
      ),
      const DropdownMenuItem(
        value: "Kayapınar",
        child: Text("Kayapınar"),
      ),
      const DropdownMenuItem(
        value: "Hocaköy",
        child: Text("Hocaköy"),
      ),
      const DropdownMenuItem(
        value: "Kulp",
        child: Text("Kulp"),
      ),
      const DropdownMenuItem(
        value: "Lice",
        child: Text("Lice"),
      ),
      const DropdownMenuItem(
        value: "Silvan",
        child: Text("Silvan"),
      ),
      const DropdownMenuItem(
        value: "Sur",
        child: Text("Sur"),
      ),
      const DropdownMenuItem(
        value: "Yenişehir",
        child: Text("Yenişehir"),
      ),
    ];
List<DropdownMenuItem<String>> citys = [
  const DropdownMenuItem(
    value: "Kahramanmaraş",
    child: Text("Kahramanmaraş"),
  ),
  const DropdownMenuItem(
    value: "Diyarbakır",
    child: Text("Diyarbakır"),
  ),
];
// ...
SelectCityDropDownField(),
SelectDistrictDropDownField(),

  Widget SelectCityDropDownField() {
    return Theme(
      data: Theme.of(context).copyWith(
        colorScheme: ThemeData().colorScheme.copyWith(
              primary: Colors.red,
            ),
      ),
      child: DropdownButtonFormField(
        decoration: InputDecoration(
          prefixIcon: const Icon(
            Icons.location_city,
            color: Color(0xFFCB3126),
          ),
          border: OutlineInputBorder(
            borderRadius: BorderRadius.circular(50),
          ),
          enabledBorder: OutlineInputBorder(
            borderRadius: BorderRadius.circular(50),
            borderSide: const BorderSide(
              color: Color(0xFFCB3126),
            ),
          ),
        ),
        items: citys
            .map(
              (e) => DropdownMenuItem<String>(
                value: e.value,
                child: e.child,
              ),
            )
            .toList(),
        onChanged: (value) {
          setState(() {
            selectedCity = value.toString();
          });
        },
      ),
    );
  }

  Widget SelectDistrictDropDownField() {
    return Theme(
      data: Theme.of(context).copyWith(
        colorScheme: ThemeData().colorScheme.copyWith(
              primary: Colors.red,
            ),
      ),
      child: DropdownButtonFormField(
        decoration: InputDecoration(
          prefixIcon: const Icon(
            Icons.location_city,
            color: Color(0xFFCB3126),
          ),
          border: OutlineInputBorder(
            borderRadius: BorderRadius.circular(50),
          ),
          enabledBorder: OutlineInputBorder(
            borderRadius: BorderRadius.circular(50),
            borderSide: const BorderSide(
              color: Color(0xFFCB3126),
            ),
          ),
        ),
        items: districtsItem(),
        onChanged: (value) {
          setState(() {
            selectedDistrict = value.toString();
          });
        },
      ),
    );
  }

  districtsItem() {
    switch (selectedCity) {
      case "Kahramanmaraş":
        return kahramanmarasDistricts;

      case "Diyarbakır":
        return diyarbakirDistricts;
    }
  }

我对一些事情有意见.问题是这样的:例如,让我们 Select Kahramanmaraş人的省份,并 Select Elbistan作为区.然后,当我将城市更改为Diyarbakır时,它会给出一个错误.换句话说,当我在 Select 了地区之后 Select 了一个不同的省份时,我会得到一个错误.这是错误的;

The following assertion was thrown building Builder(dirty, dependencies: [_FocusMarker]):
There should be exactly one item with [DropdownButtonFormField]'s value: Çermik. 
Either zero or 2 or more [DropdownMenuItem]s were detected with the same value
'package:flutter/src/material/dropdown.dart':
Failed assertion: line 939 pos 15: 'items == null || items.isEmpty || value == null ||
              items.where((DropdownMenuItem<T> item) {
                return item.value == value;
              }).length == 1'

我怎么才能解决这个问题呢?首先要感谢你的帮助.

推荐答案

这是因为渲染时您的地区列表冲突.

您必须设置key属性才能区分它们.

child: DropdownButtonFormField(
  key: selectedCity == 'Kahramanmaraş'
    ? const Key('Kahramanmaraş')
    : const Key('Diyarbakır'),
  ...

你可以通过YouTube链接了解更多关于key的信息.

https://www.youtube.com/watch?v=kn0EOS-ZiIc&t=1s

Flutter相关问答推荐

如何在表格日历标题下方添加文本?

Android Studio将不会构建iOS模拟器应用程序,因为plist.info有问题

为什么我的页面控制器在使用Riverpod时没有更改我的页面视图?

框中的Flutter 适配图像

参数类型';List<;Dynamic&>不能分配给参数类型';List<;SingleChildWidget&>';

如何在Flutter中制作弯曲文本

Flutter-Riverpod:如何只从提供者读取一次值

无法在 Flutter 项目中安装最新版本的 image_picker

在 Dart 中按土耳其语字母顺序对字符串进行排序

Flutter 中的区域不匹配

显示图像的放大部分

使用Flutter项目设置Firebase遇到困难?这些解决方案或许能帮到你!

reactive_flutter_BLE - 应用找到设备但无法连接(并读取 BLE 数据)

减少 Flutter 中 API 的连接等待时间

Cloud firestore:如何使用 map 对象创建和更新嵌套数组

如何在 GridView.builder 中设置 textform 字段并在 flutter 中将 12 个 textformfield 作为单个字符串获取?

如何获得Flutter 的时差?

扫描flutter生成的二维码后如何弹出文本字段值

主题:ThemeData() Flutter

Flutter :RangeError(索引):无效值:不在包含范围内0..3:4使用IndexedListView.builder