【问题标题】:How to code dropdowns that depend on other dropdowns - using Flutter如何编写依赖于其他下拉菜单的下拉菜单 - 使用 Flutter
【发布时间】:2020-06-12 07:19:31
【问题描述】:

我有两个 Flutter 下拉菜单。第一个从数据库加载大学列表并完美运行。第二个从数据库中加载所选大学的校园。

目前,我正在使用大学下拉菜单的 onChanged() 函数中的 setState(),该函数在 80% 的时间都有效。其他 20% 似乎是由于网络速度较慢导致在屏幕刷新之前下拉菜单没有时间填充,使其为空。如果点击大学下拉菜单一次、两次或三次校园下拉菜单通常会填满。这是加载代码(其中 loadDatabaseSubTable() 填充了校园下拉列表:

 Container(
      decoration: new BoxDecoration(
        border: Border.all(width: 1),
        borderRadius: new BorderRadius.all(Radius.circular(5.0)),
        shape: BoxShape.rectangle,
      ),
      padding: EdgeInsets.symmetric(
          horizontal: kContainerPaddingHorizontal,
          vertical: kContainerPaddingVertical),
      child: DropdownButton<String>(
       hint: Text('Select the Institution'),
        value: selectedInstitute,
        underline: Container(
          height: 0,
        ),
        onChanged: (String value) {
          // Use setState() to load next dropdown
          if (institutionBefore != value) {
              setState(() {
              // Get matching campuses
              dropCampus = [];
              campusBuild.institutionId = shInstitutionId;
              campusBuild.campusId = '';
              loadDatabaseSubTable(
                  tableName: 'sa_campus_by_institute',
                  listVariable: dropCampus,
                  object: campusBuild);
              //
              selectedInstitute = value;
            });
          }
        },
        items: dropInstitution.map((String description) {
          return DropdownMenuItem<String>(
            value: description,
            child: Text(
              description,
              style: TextStyle(color: Colors.black),
            ),
          );
        }).toList(),
      ),
    ),

上述方法是解决这个问题的正确方法吗?如果是这样,我如何确保在填充下拉列表之前不会发生刷新?

还是使用 FutureBuilder 来处理更好?

我曾想过首先将所有大学的所有校园加载到内存中 - 但要加载一个 Android 应用程序。这似乎对带宽使用有点过分了。

我有另一个屏幕,它有 6 个下拉菜单,每个都依赖于前一个 - 为每个下拉菜单使用 FutureBuilder 似乎是处理下拉菜单的一种非常不整洁的方式。提前致谢。

【问题讨论】:

    标签: flutter dart dropdown


    【解决方案1】:

    问题在于 loadDatabaseSubTable 是异步的,您无需等待它完成,因此在它获取数据时您的 setState 将被执行。

    您需要将onChanged 更改为异步:

    onChanged: (String value) async {
    

    然后等待loadDatabaseSubTable:

    await loadDatabaseSubTable(
      tableName: 'sa_campus_by_institute',
      listVariable: dropCampus,
      object: campusBuild);
    
    

    另见

    【讨论】:

    • 感谢@Sami,在做了一些彻底的测试之后,这段代码可以正常运行并完全符合我的要求。
    【解决方案2】:

    您可以在下面复制粘贴运行完整代码
    在示例代码中,选择第一个下拉列表state 后,模拟 检索第二个下拉列表Local government area 的项目有 5 秒延迟
    第 1 步:您可以在onChanged 中设置第二个下拉菜单并使用async await 加载数据库表

    DropdownButton<String>(
                ...
                onChanged: (value) => _onSelectedState(value),
    

    第2步:您可以将bool _isLoading设置为true,并在数据未准备好时显示CircularProgressIndicator()

    _isLoading
                  ? CircularProgressIndicator()
                  : DropdownButton<String>(
    

    第3步:数据准备好后将bool _isLoading设置为false

    setState(() {
          _isLoading = false;
        });
    

    代码sn-p

    void _onSelectedState(String value) async {
        setState(() {
          _selectedLGA = "Choose ..";
          _selectedState = value;
          _lgas = ["Choose .."];
          _isLoading = true;
        });
    
        _lgas = List.from(_lgas)..addAll(await repo.getLocalByState(value));
    
        setState(() {
          _isLoading = false;
        });
      }
    

    工作演示

    完整代码

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: Home(),
        );
      }
    }
    
    class Home extends StatefulWidget {
      @override
      _HomeState createState() => _HomeState();
    }
    
    class _HomeState extends State<Home> {
      Repository repo = Repository();
    
      List<String> _states = ["Choose a state"];
      List<String> _lgas = ["Choose .."];
      String _selectedState = "Choose a state";
      String _selectedLGA = "Choose ..";
      bool _isLoading = false;
    
      @override
      void initState() {
        _states = List.from(_states)..addAll(repo.getStates());
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("STATES MULTI DROPDOWN"),
            elevation: 0.1,
          ),
          body: SafeArea(
            child: Container(
              padding: EdgeInsets.symmetric(horizontal: 50, vertical: 30),
              child: Column(
                children: <Widget>[
                  DropdownButton<String>(
                    isExpanded: true,
                    items: _states.map((String dropDownStringItem) {
                      return DropdownMenuItem<String>(
                        value: dropDownStringItem,
                        child: Text(dropDownStringItem),
                      );
                    }).toList(),
                    onChanged: (value) => _onSelectedState(value),
                    value: _selectedState,
                  ),
                  _isLoading
                      ? CircularProgressIndicator()
                      : DropdownButton<String>(
                          isExpanded: true,
                          items: _lgas.map((String dropDownStringItem) {
                            return DropdownMenuItem<String>(
                              value: dropDownStringItem,
                              child: Text(dropDownStringItem),
                            );
                          }).toList(),
                          // onChanged: (value) => print(value),
                          onChanged: (value) => _onSelectedLGA(value),
                          value: _selectedLGA,
                        ),
                ],
              ),
            ),
          ),
        );
      }
    
      void _onSelectedState(String value) async {
        setState(() {
          _selectedLGA = "Choose ..";
          _selectedState = value;
          _lgas = ["Choose .."];
          _isLoading = true;
        });
    
        _lgas = List.from(_lgas)..addAll(await repo.getLocalByState(value));
    
        setState(() {
          _isLoading = false;
        });
      }
    
      void _onSelectedLGA(String value) {
        setState(() => _selectedLGA = value);
      }
    }
    
    class Repository {
      // http://locationsng-api.herokuapp.com/api/v1/lgas
      // test() => _nigeria.map((map) => StateModel.fromJson(map));
      List<Map> getAll() => _nigeria;
    
      /*getLocalByState(String state) => _nigeria
          .map((map) => StateModel.fromJson(map))
          .where((item) => item.state == state)
          .map((item) => item.lgas)
          .expand((i) => i)
          .toList();*/
    
      Future<List<String>> getLocalByState(String state) async {
        await Future.delayed(Duration(seconds: 5), () {
          print("Future.delayed");
        });
    
        return Future.value(_nigeria
            .map((map) => StateModel.fromJson(map))
            .where((item) => item.state == state)
            .map((item) => item.lgas)
            .expand((i) => i)
            .toList());
      }
      // _nigeria.where((list) => list['state'] == state);
      // .map((item) => item['lgas'])
      // .expand((i) => i)
      // .toList();
    
      List<String> getStates() => _nigeria
          .map((map) => StateModel.fromJson(map))
          .map((item) => item.state)
          .toList();
      // _nigeria.map((item) => item['state'].toString()).toList();
    
      List _nigeria = [
        {
          "state": "Adamawa",
          "alias": "adamawa",
          "lgas": [
            "Demsa",
            "Fufure",
            "Ganye",
            "Gayuk",
            "Gombi",
            "Grie",
            "Hong",
            "Jada",
            "Larmurde",
            "Madagali",
            "Maiha",
            "Mayo Belwa",
            "Michika",
            "Mubi North",
            "Mubi South",
            "Numan",
            "Shelleng",
            "Song",
            "Toungo",
            "Yola North",
            "Yola South"
          ]
        },
        {
          "state": "Akwa Ibom",
          "alias": "akwa_ibom",
          "lgas": [
            "Abak",
            "Eastern Obolo",
            "Eket",
            "Esit Eket",
            "Essien Udim",
            "Etim Ekpo",
            "Etinan",
            "Ibeno",
            "Ibesikpo Asutan",
            "Ibiono-Ibom",
            "Ikot Abasi",
            "Ika",
            "Ikono",
            "Ikot Ekpene",
            "Ini",
            "Mkpat-Enin",
            "Itu",
            "Mbo",
            "Nsit-Atai",
            "Nsit-Ibom",
            "Nsit-Ubium",
            "Obot Akara",
            "Okobo",
            "Onna",
            "Oron",
            "Udung-Uko",
            "Ukanafun",
            "Oruk Anam",
            "Uruan",
            "Urue-Offong/Oruko",
            "Uyo"
          ]
        },
        {
          "state": "Anambra",
          "alias": "anambra",
          "lgas": [
            "Aguata",
            "Anambra East",
            "Anaocha",
            "Awka North",
            "Anambra West",
            "Awka South",
            "Ayamelum",
            "Dunukofia",
            "Ekwusigo",
            "Idemili North",
            "Idemili South",
            "Ihiala",
            "Njikoka",
            "Nnewi North",
            "Nnewi South",
            "Ogbaru",
            "Onitsha North",
            "Onitsha South",
            "Orumba North",
            "Orumba South",
            "Oyi"
          ]
        },
        {
          "state": "Ogun",
          "alias": "ogun",
          "lgas": [
            "Abeokuta North",
            "Abeokuta South",
            "Ado-Odo/Ota",
            "Egbado North",
            "Ewekoro",
            "Egbado South",
            "Ijebu North",
            "Ijebu East",
            "Ifo",
            "Ijebu Ode",
            "Ijebu North East",
            "Imeko Afon",
            "Ikenne",
            "Ipokia",
            "Odeda",
            "Obafemi Owode",
            "Odogbolu",
            "Remo North",
            "Ogun Waterside",
            "Shagamu"
          ]
        },
        {
          "state": "Ondo",
          "alias": "ondo",
          "lgas": [
            "Akoko North-East",
            "Akoko North-West",
            "Akoko South-West",
            "Akoko South-East",
            "Akure North",
            "Akure South",
            "Ese Odo",
            "Idanre",
            "Ifedore",
            "Ilaje",
            "Irele",
            "Ile Oluji/Okeigbo",
            "Odigbo",
            "Okitipupa",
            "Ondo West",
            "Ose",
            "Ondo East",
            "Owo"
          ]
        },
        {
          "state": "Rivers",
          "alias": "rivers",
          "lgas": [
            "Abua/Odual",
            "Ahoada East",
            "Ahoada West",
            "Andoni",
            "Akuku-Toru",
            "Asari-Toru",
            "Bonny",
            "Degema",
            "Emuoha",
            "Eleme",
            "Ikwerre",
            "Etche",
            "Gokana",
            "Khana",
            "Obio/Akpor",
            "Ogba/Egbema/Ndoni",
            "Ogu/Bolo",
            "Okrika",
            "Omuma",
            "Opobo/Nkoro",
            "Oyigbo",
            "Port Harcourt",
            "Tai"
          ]
        },
        {
          "state": "Bauchi",
          "alias": "bauchi",
          "lgas": [
            "Alkaleri",
            "Bauchi",
            "Bogoro",
            "Damban",
            "Darazo",
            "Dass",
            "Gamawa",
            "Ganjuwa",
            "Giade",
            "Itas/Gadau",
            "Jama'are",
            "Katagum",
            "Kirfi",
            "Misau",
            "Ningi",
            "Shira",
            "Tafawa Balewa",
            "Toro",
            "Warji",
            "Zaki"
          ]
        },
        {
          "state": "Benue",
          "alias": "benue",
          "lgas": [
            "Agatu",
            "Apa",
            "Ado",
            "Buruku",
            "Gboko",
            "Guma",
            "Gwer East",
            "Gwer West",
            "Katsina-Ala",
            "Konshisha",
            "Kwande",
            "Logo",
            "Makurdi",
            "Obi",
            "Ogbadibo",
            "Ohimini",
            "Oju",
            "Okpokwu",
            "Oturkpo",
            "Tarka",
            "Ukum",
            "Ushongo",
            "Vandeikya"
          ]
        },
        {
          "state": "Borno",
          "alias": "borno",
          "lgas": [
            "Abadam",
            "Askira/Uba",
            "Bama",
            "Bayo",
            "Biu",
            "Chibok",
            "Damboa",
            "Dikwa",
            "Guzamala",
            "Gubio",
            "Hawul",
            "Gwoza",
            "Jere",
            "Kaga",
            "Kala/Balge",
            "Konduga",
            "Kukawa",
            "Kwaya Kusar",
            "Mafa",
            "Magumeri",
            "Maiduguri",
            "Mobbar",
            "Marte",
            "Monguno",
            "Ngala",
            "Nganzai",
            "Shani"
          ]
        },
        {
          "state": "Bayelsa",
          "alias": "bayelsa",
          "lgas": [
            "Brass",
            "Ekeremor",
            "Kolokuma/Opokuma",
            "Nembe",
            "Ogbia",
            "Sagbama",
            "Southern Ijaw",
            "Yenagoa"
          ]
        },
        {
          "state": "Cross River",
          "alias": "cross_river",
          "lgas": [
            "Abi",
            "Akamkpa",
            "Akpabuyo",
            "Bakassi",
            "Bekwarra",
            "Biase",
            "Boki",
            "Calabar Municipal",
            "Calabar South",
            "Etung",
            "Ikom",
            "Obanliku",
            "Obubra",
            "Obudu",
            "Odukpani",
            "Ogoja",
            "Yakuur",
            "Yala"
          ]
        },
        {
          "state": "Delta",
          "alias": "delta",
          "lgas": [
            "Aniocha North",
            "Aniocha South",
            "Bomadi",
            "Burutu",
            "Ethiope West",
            "Ethiope East",
            "Ika North East",
            "Ika South",
            "Isoko North",
            "Isoko South",
            "Ndokwa East",
            "Ndokwa West",
            "Okpe",
            "Oshimili North",
            "Oshimili South",
            "Patani",
            "Sapele",
            "Udu",
            "Ughelli North",
            "Ukwuani",
            "Ughelli South",
            "Uvwie",
            "Warri North",
            "Warri South",
            "Warri South West"
          ]
        },
        {
          "state": "Ebonyi",
          "alias": "ebonyi",
          "lgas": [
            "Abakaliki",
            "Afikpo North",
            "Ebonyi",
            "Afikpo South",
            "Ezza North",
            "Ikwo",
            "Ezza South",
            "Ivo",
            "Ishielu",
            "Izzi",
            "Ohaozara",
            "Ohaukwu",
            "Onicha"
          ]
        },
        {
          "state": "Edo",
          "alias": "edo",
          "lgas": [
            "Akoko-Edo",
            "Egor",
            "Esan Central",
            "Esan North-East",
            "Esan South-East",
            "Esan West",
            "Etsako Central",
            "Etsako East",
            "Etsako West",
            "Igueben",
            "Ikpoba Okha",
            "Orhionmwon",
            "Oredo",
            "Ovia North-East",
            "Ovia South-West",
            "Owan East",
            "Owan West",
            "Uhunmwonde"
          ]
        },
        {
          "state": "Ekiti",
          "alias": "ekiti",
          "lgas": [
            "Ado Ekiti",
            "Efon",
            "Ekiti East",
            "Ekiti South-West",
            "Ekiti West",
            "Emure",
            "Gbonyin",
            "Ido Osi",
            "Ijero",
            "Ikere",
            "Ilejemeje",
            "Irepodun/Ifelodun",
            "Ikole",
            "Ise/Orun",
            "Moba",
            "Oye"
          ]
        },
        {
          "state": "Enugu",
          "alias": "enugu",
          "lgas": [
            "Awgu",
            "Aninri",
            "Enugu East",
            "Enugu North",
            "Ezeagu",
            "Enugu South",
            "Igbo Etiti",
            "Igbo Eze North",
            "Igbo Eze South",
            "Isi Uzo",
            "Nkanu East",
            "Nkanu West",
            "Nsukka",
            "Udenu",
            "Oji River",
            "Uzo Uwani",
            "Udi"
          ]
        },
        {
          "state": "Federal Capital Territory",
          "alias": "abuja",
          "lgas": [
            "Abaji",
            "Bwari",
            "Gwagwalada",
            "Kuje",
            "Kwali",
            "Municipal Area Council"
          ]
        },
        {
          "state": "Gombe",
          "alias": "gombe",
          "lgas": [
            "Akko",
            "Balanga",
            "Billiri",
            "Dukku",
            "Funakaye",
            "Gombe",
            "Kaltungo",
            "Kwami",
            "Nafada",
            "Shongom",
            "Yamaltu/Deba"
          ]
        },
        {
          "state": "Jigawa",
          "alias": "jigawa",
          "lgas": [
            "Auyo",
            "Babura",
            "Buji",
            "Biriniwa",
            "Birnin Kudu",
            "Dutse",
            "Gagarawa",
            "Garki",
            "Gumel",
            "Guri",
            "Gwaram",
            "Gwiwa",
            "Hadejia",
            "Jahun",
            "Kafin Hausa",
            "Kazaure",
            "Kiri Kasama",
            "Kiyawa",
            "Kaugama",
            "Maigatari",
            "Malam Madori",
            "Miga",
            "Sule Tankarkar",
            "Roni",
            "Ringim",
            "Yankwashi",
            "Taura"
          ]
        },
        {
          "state": "Oyo",
          "alias": "oyo",
          "lgas": [
            "Afijio",
            "Akinyele",
            "Atiba",
            "Atisbo",
            "Egbeda",
            "Ibadan North",
            "Ibadan North-East",
            "Ibadan North-West",
            "Ibadan South-East",
            "Ibarapa Central",
            "Ibadan South-West",
            "Ibarapa East",
            "Ido",
            "Ibarapa North",
            "Irepo",
            "Iseyin",
            "Itesiwaju",
            "Iwajowa",
            "Kajola",
            "Lagelu",
            "Ogbomosho North",
            "Ogbomosho South",
            "Ogo Oluwa",
            "Olorunsogo",
            "Oluyole",
            "Ona Ara",
            "Orelope",
            "Ori Ire",
            "Oyo",
            "Oyo East",
            "Saki East",
            "Saki West",
            "Surulere Oyo State"
          ]
        },
        {
          "state": "Imo",
          "alias": "imo",
          "lgas": [
            "Aboh Mbaise",
            "Ahiazu Mbaise",
            "Ehime Mbano",
            "Ezinihitte",
            "Ideato North",
            "Ideato South",
            "Ihitte/Uboma",
            "Ikeduru",
            "Isiala Mbano",
            "Mbaitoli",
            "Isu",
            "Ngor Okpala",
            "Njaba",
            "Nkwerre",
            "Nwangele",
            "Obowo",
            "Oguta",
            "Ohaji/Egbema",
            "Okigwe",
            "Orlu",
            "Orsu",
            "Oru East",
            "Oru West",
            "Owerri Municipal",
            "Owerri North",
            "Unuimo",
            "Owerri West"
          ]
        },
        {
          "state": "Kaduna",
          "alias": "kaduna",
          "lgas": [
            "Birnin Gwari",
            "Chikun",
            "Giwa",
            "Ikara",
            "Igabi",
            "Jaba",
            "Jema'a",
            "Kachia",
            "Kaduna North",
            "Kaduna South",
            "Kagarko",
            "Kajuru",
            "Kaura",
            "Kauru",
            "Kubau",
            "Kudan",
            "Lere",
            "Makarfi",
            "Sabon Gari",
            "Sanga",
            "Soba",
            "Zangon Kataf",
            "Zaria"
          ]
        },
        {
          "state": "Kebbi",
          "alias": "kebbi",
          "lgas": [
            "Aleiro",
            "Argungu",
            "Arewa Dandi",
            "Augie",
            "Bagudo",
            "Birnin Kebbi",
            "Bunza",
            "Dandi",
            "Fakai",
            "Gwandu",
            "Jega",
            "Kalgo",
            "Koko/Besse",
            "Maiyama",
            "Ngaski",
            "Shanga",
            "Suru",
            "Sakaba",
            "Wasagu/Danko",
            "Yauri",
            "Zuru"
          ]
        },
        {
          "state": "Kano",
          "alias": "kano",
          "lgas": [
            "Ajingi",
            "Albasu",
            "Bagwai",
            "Bebeji",
            "Bichi",
            "Bunkure",
            "Dala",
            "Dambatta",
            "Dawakin Kudu",
            "Dawakin Tofa",
            "Doguwa",
            "Fagge",
            "Gabasawa",
            "Garko",
            "Garun Mallam",
            "Gezawa",
            "Gaya",
            "Gwale",
            "Gwarzo",
            "Kabo",
            "Kano Municipal",
            "Karaye",
            "Kibiya",
            "Kiru",
            "Kumbotso",
            "Kunchi",
            "Kura",
            "Madobi",
            "Makoda",
            "Minjibir",
            "Nasarawa",
            "Rano",
            "Rimin Gado",
            "Rogo",
            "Shanono",
            "Takai",
            "Sumaila",
            "Tarauni",
            "Tofa",
            "Tsanyawa",
            "Tudun Wada",
            "Ungogo",
            "Warawa",
            "Wudil"
          ]
        },
        {
          "state": "Kogi",
          "alias": "kogi",
          "lgas": [
            "Ajaokuta",
            "Adavi",
            "Ankpa",
            "Bassa",
            "Dekina",
            "Ibaji",
            "Idah",
            "Igalamela Odolu",
            "Ijumu",
            "Kogi",
            "Kabba/Bunu",
            "Lokoja",
            "Ofu",
            "Mopa Muro",
            "Ogori/Magongo",
            "Okehi",
            "Okene",
            "Olamaboro",
            "Omala",
            "Yagba East",
            "Yagba West"
          ]
        },
        {
          "state": "Osun",
          "alias": "osun",
          "lgas": [
            "Aiyedire",
            "Atakunmosa West",
            "Atakunmosa East",
            "Aiyedaade",
            "Boluwaduro",
            "Boripe",
            "Ife East",
            "Ede South",
            "Ife North",
            "Ede North",
            "Ife South",
            "Ejigbo",
            "Ife Central",
            "Ifedayo",
            "Egbedore",
            "Ila",
            "Ifelodun",
            "Ilesa East",
            "Ilesa West",
            "Irepodun",
            "Irewole",
            "Isokan",
            "Iwo",
            "Obokun",
            "Odo Otin",
            "Ola Oluwa",
            "Olorunda",
            "Oriade",
            "Orolu",
            "Osogbo"
          ]
        },
        {
          "state": "Sokoto",
          "alias": "sokoto",
          "lgas": [
            "Gudu",
            "Gwadabawa",
            "Illela",
            "Isa",
            "Kebbe",
            "Kware",
            "Rabah",
            "Sabon Birni",
            "Shagari",
            "Silame",
            "Sokoto North",
            "Sokoto South",
            "Tambuwal",
            "Tangaza",
            "Tureta",
            "Wamako",
            "Wurno",
            "Yabo",
            "Binji",
            "Bodinga",
            "Dange Shuni",
            "Goronyo",
            "Gada"
          ]
        },
        {
          "state": "Plateau",
          "alias": "plateau",
          "lgas": [
            "Bokkos",
            "Barkin Ladi",
            "Bassa",
            "Jos East",
            "Jos North",
            "Jos South",
            "Kanam",
            "Kanke",
            "Langtang South",
            "Langtang North",
            "Mangu",
            "Mikang",
            "Pankshin",
            "Qua'an Pan",
            "Riyom",
            "Shendam",
            "Wase"
          ]
        },
        {
          "state": "Taraba",
          "alias": "taraba",
          "lgas": [
            "Ardo Kola",
            "Bali",
            "Donga",
            "Gashaka",
            "Gassol",
            "Ibi",
            "Jalingo",
            "Karim Lamido",
            "Kumi",
            "Lau",
            "Sardauna",
            "Takum",
            "Ussa",
            "Wukari",
            "Yorro",
            "Zing"
          ]
        },
        {
          "state": "Yobe",
          "alias": "yobe",
          "lgas": [
            "Bade",
            "Bursari",
            "Damaturu",
            "Fika",
            "Fune",
            "Geidam",
            "Gujba",
            "Gulani",
            "Jakusko",
            "Karasuwa",
            "Machina",
            "Nangere",
            "Nguru",
            "Potiskum",
            "Tarmuwa",
            "Yunusari"
          ]
        },
        {
          "state": "Zamfara",
          "alias": "zamfara",
          "lgas": [
            "Anka",
            "Birnin Magaji/Kiyaw",
            "Bakura",
            "Bukkuyum",
            "Bungudu",
            "Gummi",
            "Gusau",
            "Kaura Namoda",
            "Maradun",
            "Shinkafi",
            "Maru",
            "Talata Mafara",
            "Tsafe",
            "Zurmi"
          ]
        },
        {
          "state": "Lagos",
          "alias": "lagos",
          "lgas": [
            "Agege",
            "Ajeromi-Ifelodun",
            "Alimosho",
            "Amuwo-Odofin",
            "Badagry",
            "Apapa",
            "Epe",
            "Eti Osa",
            "Ibeju-Lekki",
            "Ifako-Ijaiye",
            "Ikeja",
            "Ikorodu",
            "Kosofe",
            "Lagos Island",
            "Mushin",
            "Lagos Mainland",
            "Ojo",
            "Oshodi-Isolo",
            "Shomolu",
            "Surulere Lagos State"
          ]
        },
        {
          "state": "Katsina",
          "alias": "katsina",
          "lgas": [
            "Bakori",
            "Batagarawa",
            "Batsari",
            "Baure",
            "Bindawa",
            "Charanchi",
            "Danja",
            "Dandume",
            "Dan Musa",
            "Daura",
            "Dutsi",
            "Dutsin Ma",
            "Faskari",
            "Funtua",
            "Ingawa",
            "Jibia",
            "Kafur",
            "Kaita",
            "Kankara",
            "Kankia",
            "Katsina",
            "Kurfi",
            "Kusada",
            "Mai'Adua",
            "Malumfashi",
            "Mani",
            "Mashi",
            "Matazu",
            "Musawa",
            "Rimi",
            "Sabuwa",
            "Safana",
            "Sandamu",
            "Zango"
          ]
        },
        {
          "state": "Kwara",
          "alias": "kwara",
          "lgas": [
            "Asa",
            "Baruten",
            "Edu",
            "Ilorin East",
            "Ifelodun",
            "Ilorin South",
            "Ekiti Kwara State",
            "Ilorin West",
            "Irepodun",
            "Isin",
            "Kaiama",
            "Moro",
            "Offa",
            "Oke Ero",
            "Oyun",
            "Pategi"
          ]
        },
        {
          "state": "Nasarawa",
          "alias": "nasarawa",
          "lgas": [
            "Akwanga",
            "Awe",
            "Doma",
            "Karu",
            "Keana",
            "Keffi",
            "Lafia",
            "Kokona",
            "Nasarawa Egon",
            "Nasarawa",
            "Obi",
            "Toto",
            "Wamba"
          ]
        },
        {
          "state": "Niger",
          "alias": "niger",
          "lgas": [
            "Agaie",
            "Agwara",
            "Bida",
            "Borgu",
            "Bosso",
            "Chanchaga",
            "Edati",
            "Gbako",
            "Gurara",
            "Katcha",
            "Kontagora",
            "Lapai",
            "Lavun",
            "Mariga",
            "Magama",
            "Mokwa",
            "Mashegu",
            "Moya",
            "Paikoro",
            "Rafi",
            "Rijau",
            "Shiroro",
            "Suleja",
            "Tafa",
            "Wushishi"
          ]
        },
        {
          "state": "Abia",
          "alias": "abia",
          "lgas": [
            "Aba North",
            "Arochukwu",
            "Aba South",
            "Bende",
            "Isiala Ngwa North",
            "Ikwuano",
            "Isiala Ngwa South",
            "Isuikwuato",
            "Obi Ngwa",
            "Ohafia",
            "Osisioma",
            "Ugwunagbo",
            "Ukwa East",
            "Ukwa West",
            "Umuahia North",
            "Umuahia South",
            "Umu Nneochi"
          ]
        }
      ];
    }
    
    class StateModel {
      String state;
      String alias;
      List<String> lgas;
    
      StateModel({this.state, this.alias, this.lgas});
    
      StateModel.fromJson(Map<String, dynamic> json) {
        state = json['state'];
        alias = json['alias'];
        lgas = json['lgas'].cast<String>();
      }
    
      Map<String, dynamic> toJson() {
        final Map<String, dynamic> data = new Map<String, dynamic>();
        data['state'] = this.state;
        data['alias'] = this.alias;
        data['lgas'] = this.lgas;
        return data;
      }
    }
    

    【讨论】:

    • 感谢@chunhunghan 的详尽回答。代码完全符合我的要求。但是,设置 5 秒(或其他)的任意延迟并不是我想要的。这会使用户“徘徊”一段时间,这可能会超过从数据库加载记录所花费的时间。出于这个原因,我在上面选择了萨米的答案。
    • 你误会了,5秒是模拟你的网络延迟。并且不使用 CircularProgressIndicator() ,用户将不知道数据是否准备好。他仍然可以随时点击第二个下拉菜单。
    • 对不起,我没有提到模拟关键字
    【解决方案3】:

    它对我有用@chunhunghan。但是,如果我想做汽车制造商列表(第一个下拉列表)和汽车型号(第二个下拉列表)的两个相关下拉按钮,我该如何使用相同的方法?但是当我点击模型(第二个)时,我希望能够获得模型的类别,这样我就可以打印并显示它是汽车、卡车、公共汽车等。在实施时遇到问题。

    List _cars = [
        {
          "make": "Acura",
          "brand": [
            {"name": "CL", "category": "Coupe"},
            {"name": "ILX", "category": "Sedan"},
            {"name": "Integra", "category": "Sedan"},
            {"name": "Legend", "category": "Sedan"},
            {"name": "MDX", "category": "SUV"},
            {"name": "NSX", "category": "Coupe"},
            {"name": "RDX", "category": "SUV"},
            {"name": "RL", "category": "Sedan"},
            {"name": "RLX", "category": "Sedan"},
            {"name": "RSX", "category": "Coupe"},
            {"name": "SLX", "category": "SUV"},
            {"name": "TL", "category": "Sedan"},
            {"name": "TLX", "category": "Sedan"},
            {"name": "TSX", "category": "Sedan"},
            {"name": "Vigor", "category": "Sedan"},
            {"name": "ZDX", "category": "SUV"},
          ]
        },
        {
          "make": "Alfa Romeo",
          "brand": [
            {"name": "147", "category": "Sedan"},
            {"name": "164", "category": "Sedan"},
            {"name": "4C", "category": "Coupe"},
            {"name": "4C Spider", "category": "Convertible"},
            {"name": "Brera", "category": "Sedan"},
            {"name": "Giulia", "category": "Sedan"},
            {"name": "Giulietta", "category": "Sedan"},
            {"name": "GT", "category": "Sedan"},
            {"name": "Mito", "category": "Sedan"},
            {"name": "Stelvio", "category": "SUV"},
          ]
        }
      ];
    

    上面的json文件示例。

    class CarsModel {
      late String make;
      late List<Brand> brand;
    
      CarsModel({required this.make, required this.brand});
    
      CarsModel.fromJSON(Map<String, dynamic> json) {
        make = json['make'];
        brand = json['brand'].map<Brand>((json) => Brand.fromJSON(json)).toList();
      }
    
      Map<String, dynamic> toJson() {
        final Map<String, dynamic> data = Map<String, dynamic>();
        data['make'] = this.make;
        data['brand'] = this.brand;
        return data;
      }
    }
    
    class Brand {
      late String name;
      late String category;
    
      Brand({required this.name, required this.category});
    
      Brand.fromJSON(Map<String, dynamic> json) {
        name = json['name'];
        category = json['category'];
      }
    
      Map<String, dynamic> toJson() {
        final Map<String, dynamic> data = Map<String, dynamic>();
        data['name'] = this.name;
        data['category'] = this.category;
    
        return data;
      }
    }
    

    JSON 文件的模型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      相关资源
      最近更新 更多