Получение полной информации из выпадающего списка (Flutter / Dart) - PullRequest
0 голосов
/ 20 июня 2020

Я создаю приложение Corona, и я хочу, чтобы если вы выберете страну из раскрывающегося списка, она покажет количество зараженных, умерших и выздоровевших. когда я меняю значение item ['Country'] только на item, я получаю всю информацию о стране, которую я выбрал, но затем, когда я меняю _mySelection = newVal на _mySelection = newval ['Country'], я получаю сообщение об ошибке.

There should be exactly one item with [DropdownButton]'s value: Australia. 
Either zero or 2 or more [DropdownMenuItem]s were detected with the same value
'package:flutter/src/material/dropdown.dart':
Failed assertion: line 827 pos 15: 'items == null || items.isEmpty || value == null ||
              items.where((DropdownMenuItem<T> item) {
                return item.value == value;
              }).length == 1'

Если вы знаете решение, как я могу получить информацию, дайте мне знать.

Раскрывающийся список

child: new DropdownButton(
                          hint: Text(Country, style: TextStyle(fontSize: 18, color: Colors.black),
                          ),
                          isExpanded: true,
                          items: data.map((item) {
                            return new DropdownMenuItem(
                              child: new AutoSizeText(item['Country']),
                              value: item['Country'],
                            );
                          }).toList(),
                          onChanged: (newVal) {
                            setState(() {
                              _mySelection = newVal;
                            });
                          },
                          value: _mySelection,
                        ),

Statresbody пример Страны содержат все страны с той же информацией, что и Афганистан в этом примере

{
    "Global": {
        "NewConfirmed": 174744,
        "TotalConfirmed": 8764876,
        "NewDeaths": 6071,
        "TotalDeaths": 468396,
        "NewRecovered": 90678,
        "TotalRecovered": 4245126
    },
    "Countries": [
        {
            "Country": "Afghanistan",
            "CountryCode": "AF",
            "Slug": "afghanistan",
            "NewConfirmed": 346,
            "TotalConfirmed": 27878,
            "NewDeaths": 2,
            "TotalDeaths": 548,
            "NewRecovered": 302,
            "TotalRecovered": 7962,
            "Date": "2020-06-20T19:19:28Z"
        },
        

     
      

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Пара комментариев

  1. Я бы сказал, что было бы более естественно использовать код страны в качестве значения для раскрывающегося списка.
  2. Вы можете получить полную информацию о стране из data при выполнении onChanged.

Ваш код будет заменен на этот

    child: new DropdownButton(
      hint: Text(Country, style: TextStyle(fontSize: 18, color: Colors.black),
      ),
      isExpanded: true,
      items: data.map((item) {
        return new DropdownMenuItem(
          child: new Text(item['Country']),
          value: item['CountryCode'], // <===== use country code as value
        );
      }).toList(),
      onChanged: (newVal) {
        setState(() {
          _mySelection = newVal;
          // I get full country info
          var country = data.firstWhere((i) => i['CountryCode'] == newVal);
          // do what you want with the selection....
        });
      },
      value: _mySelection,
    ),
0 голосов
/ 20 июня 2020

Вы можете создать класс Country (это ваш класс CountryCollection) следующим образом:

class Country {
  String country;
  String countryCode;
  String slug;
  int newConfirmed;
  int totalConfirmed;
  int newDeaths;
  int totalDeaths;
  int newRecovered;
  int totalRecovered;
  String date;

  Country(
      {this.country,
      this.countryCode,
      this.slug,
      this.newConfirmed,
      this.totalConfirmed,
      this.newDeaths,
      this.totalDeaths,
      this.newRecovered,
      this.totalRecovered,
      this.date});

  Country.fromJson(Map<String, dynamic> json) {
    country = json['Country'];
    countryCode = json['CountryCode'];
    slug = json['Slug'];
    newConfirmed = json['NewConfirmed'];
    totalConfirmed = json['TotalConfirmed'];
    newDeaths = json['NewDeaths'];
    totalDeaths = json['TotalDeaths'];
    newRecovered = json['NewRecovered'];
    totalRecovered = json['TotalRecovered'];
    date = json['Date'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['Country'] = this.country;
    data['CountryCode'] = this.countryCode;
    data['Slug'] = this.slug;
    data['NewConfirmed'] = this.newConfirmed;
    data['TotalConfirmed'] = this.totalConfirmed;
    data['NewDeaths'] = this.newDeaths;
    data['TotalDeaths'] = this.totalDeaths;
    data['NewRecovered'] = this.newRecovered;
    data['TotalRecovered'] = this.totalRecovered;
    data['Date'] = this.date;
    return data;
  }
}

И попробуйте создать свою DropdownButton вот так:

child: new DropdownButton<Country>(
    value: selectedCountry,
    onChanged: (Country newValue) {
      setState(() {
        selectedCountry = newValue;
      });
    },
    items: countries.map((Country country) {
      return new DropdownMenuItem<Country>(
        value: country,
        child: new Text(
          country.country,
        ),
      );
    }).toList(),
  

Чтобы заполнить список стран , вы можете выполнить итерацию по каждому элементу стран и использовать метод from Json вашего Country class, затем используйте setState , чтобы добавить элемент в свой список.

...