Come implementare nell’elenco a discesa in flutter?

Ho un elenco di luoghi che si desidera implementare come un elenco a discesa in Flutter. Im abbastanza nuovo per la lingua. Ecco cosa ho fatto.

new DropdownButton(
  value: _selectedLocation,
  onChanged: (String newValue) {
    setState(() {
      _selectedLocation = newValue;
     });
},
items: _locations.map((String location) {
  return new DropdownMenuItem<String>(
     child: new Text(location),
  );
}).toList(),

Questa è la mia lista di elementi:

List<String> _locations = ['A', 'B', 'C', 'D'];

E ricevo il seguente errore.

Another exception was thrown: 'package:flutter/src/material/dropdown.dart': Failed assertion: line 468 pos 15: 'value == null || items.where((DropdownMenuItem<T> item) => item.value == value).length == 1': is not true.

Ho assumono il valore di _selectedLocation è sempre null. Ma io sono l’inizializzazione piace così.

String _selectedLocation = 'Please choose a location';

 

12 Replies
  1. 27

    Provare questo

    new DropdownButton<String>(
      items: <String>['A', 'B', 'C', 'D'].map((String value) {
        return new DropdownMenuItem<String>(
          value: value,
          child: new Text(value),
        );
      }).toList(),
      onChanged: (_) {},
    )
    • Provato ad aggiungere value : value in DropdownMenuItem. Ancora ricevendo lo stesso errore. Indovinare qualche errore con value : _selectedLocation in DropDownButton.
  2. 8

    Prima di tutto, analizziamo cosa dice errore (ho citato il messaggio di errore che gettato con Flutter 1.2, ma l’idea è la stessa):

    Asserzione non riuscita: linea 560 pos 15: oggetti == null || gli elementi.isEmpty || valore == null || gli elementi.where((DropdownMenuItem elemento) => voce.valore == valore).length == 1′: non è vero.

    Ci sono quattro or condizioni. Almeno uno di loro deve essere soddisfatta:

    • Elementi (un elenco di DropdownMenuItem widget) sono stati forniti. Questo elimina items == null.
    • Lista Non vuota è stato fornito. Questo elimina items.isEmpty.
    • Un valore (_selectedLocation) è stato anche dato. Questo elimina value == null. Si noti che questo è DropdownButton‘s valore, non DropdownMenuItem‘s valore.

    Quindi solo l’ultimo controllo è di sinistra. Tutto si riduce a qualcosa di simile:

    Scorrere DropdownMenuItem‘s. Trova tutti che hanno un value uguale _selectedLocation. Quindi, controllare il numero di elementi corrispondenti sono stati trovati. Ci deve essere esattamente un widget che ha questo valore. In caso contrario, genera un errore.

    Il modo in cui il codice viene presentato, non c’è un DropdownMenuItem widget che ha un valore di _selectedLocation. Invece, tutti gli oggetti hanno il loro valore impostato null. Dal null != _selectedLocation, ultima condizione non riesce. Verificare questa impostazione _selectedLocation per null – l’applicazione deve eseguire.

    Per risolvere il problema, abbiamo bisogno di impostare un valore per ogni DropdownMenuItem (in modo che qualcosa potrebbe essere passato a onChanged richiamata):

    return DropdownMenuItem(
        child: new Text(location),
        value: location,
    );

    L’app ancora non sarà possibile. Questo è perché il vostro elenco non contiene _selectedLocation‘s valore. È possibile effettuare l’app funziona in due modi:

    • Opzione 1. Aggiungere un altro widget che ha il valore (per soddisfare items.where((DropdownMenuItem<T> item) => item.value == value).length == 1). Potrebbe essere utile se si desidera consentire all’utente di selezionare nuovamente Please choose a location opzione.
    • Opzione 2. Passare a qualcosa di hint: paremter e impostare selectedLocation per null (per soddisfare value == null condizione). Utile se non si desidera Please choose a location a rimanere un’opzione.

    Vedere il codice sottostante che mostra come fare:

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(Example());
    }
    
    class Example extends StatefulWidget {
      @override
      State<StatefulWidget> createState() => _ExampleState();
    }
    
    class _ExampleState extends State<Example> {
    // List<String> _locations = ['Please choose a location', 'A', 'B', 'C', 'D']; //Option 1
    // String _selectedLocation = 'Please choose a location'; //Option 1
      List<String> _locations = ['A', 'B', 'C', 'D']; //Option 2
      String _selectedLocation; //Option 2
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            body: Center(
              child: DropdownButton(
                hint: Text('Please choose a location'), //Not necessary for Option 1
                value: _selectedLocation,
                onChanged: (newValue) {
                  setState(() {
                    _selectedLocation = newValue;
                  });
                },
                items: _locations.map((location) {
                  return DropdownMenuItem(
                    child: new Text(location),
                    value: location,
                  );
                }).toList(),
              ),
            ),
          ),
        );
      }
    }
    • grazie. Ho sprecato 15 minuti su questo stupido errore. Vorrei poter dare un voto positivo più su la tua risposta 🙂
  3. 7

    si deve tener conto di questo (da DropdownButton docs):

    “Gli oggetti devono avere valori distinti e se il valore non null deve
    essere in mezzo a loro.”

    Fondamentalmente, avete questo elenco di stringhe

    List<String> _locations = ['A', 'B', 'C', 'D'];

    E il tuo valore in a Discesa proprietà di valore viene inizializzato come questo:

    String _selectedLocation = 'Please choose a location';

    Provare con questo elenco:

    List<String> _locations = ['Please choose a location', 'A', 'B', 'C', 'D'];

    Che dovrebbe funzionare 🙂

    Anche controllare il “suggerimento” di proprietà se non si desidera aggiungere una Stringa del tipo che (al di fuori del contesto della lista), si potrebbe andare con qualcosa di simile a questo:

    DropdownButton<int>(
              items: locations.map((String val) {
                       return new DropdownMenuItem<String>(
                            value: val,
                            child: new Text(val),
                             );
                        }).toList(),
              hint: Text("Please choose a location"),
              onChanged: (newVal) {
                      _selectedLocation = newVal;
                      this.setState(() {});
                      });
  4. 5

    È necessario aggiungere value: location nel tuo codice funziona. Controllare questo fuori.

    items: _locations.map((String location) {
      return new DropdownMenuItem<String>(
         child: new Text(location),
         value: location,
      );
    }).toList(),
  5. 4

    posto all’interno di elementi.allora funzionerà,

    new DropdownButton<String>(
                  items:_dropitems.map((String val){
                    return DropdownMenuItem<String>(
                      value: val,
                      child: new Text(val),
                    );
                  }).toList(),
                  hint:Text(_SelectdType),
                  onChanged:(String val){
                    _SelectdType= val;
                    setState(() {});
                    })
  6. 2

    È possibile utilizzare DropDownButton classe, al fine di creare un elenco a discesa :

    ...
    ...
    String dropdownValue = 'One';
    ...
    ...
    Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: DropdownButton<String>(
          value: dropdownValue,
          onChanged: (String newValue) {
            setState(() {
              dropdownValue = newValue;
            });
          },
          items: <String>['One', 'Two', 'Free', 'Four']
              .map<DropdownMenuItem<String>>((String value) {
            return DropdownMenuItem<String>(
              value: value,
              child: Text(value),
            );
          }).toList(),
        ),
      ),
    );
    ...
    ...

    si prega di fare riferimento a questo flutter pagina web

  7. 0

    Ero di fronte a un problema simile con il DropDownButton quando stavo cercando di visualizzare un elenco dinamico di stringhe nel menu a discesa. Ho finito per la creazione di un plugin : flutter_search_panel. Non a discesa, plugin, ma è possibile visualizzare gli elementi con la funzionalità di ricerca.

    Utilizzare il seguente codice per utilizzare il widget :

        FlutterSearchPanel(
            padding: EdgeInsets.all(10.0),
            selected: 'a',
            title: 'Demo Search Page',
            data: ['This', 'is', 'a', 'test', 'array'],
            icon: new Icon(Icons.label, color: Colors.black),
            color: Colors.white,
            textStyle: new TextStyle(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 20.0, decorationStyle: TextDecorationStyle.dotted),
            onChanged: (value) {
              print(value);
            },
       ),
  8. 0

    Diciamo ci la creazione di un elenco a discesa della valuta:

    List _currency = ["INR", "USD", "SGD", "EUR", "PND"];
    List<DropdownMenuItem<String>> _dropDownMenuCurrencyItems;
    String _currentCurrency;
    
    List<DropdownMenuItem<String>> getDropDownMenuCurrencyItems() {
      List<DropdownMenuItem<String>> items = new List();
      for (String currency in _currency) {
        items.add(
          new DropdownMenuItem(value: currency, child: new Text(currency)));
      }
      return items;
    }
    
    void changedDropDownItem(String selectedCurrency) {
      setState(() {
        _currentCurrency = selectedCurrency;
      });
    }

    Aggiungere il codice qui sotto nella parte del corpo:

    new Row(children: <Widget>[
      new Text("Currency: "),
      new Container(
        padding: new EdgeInsets.all(16.0),
      ),
      new DropdownButton(
        value: _currentCurrency,
        items: _dropDownMenuCurrencyItems,
        onChanged: changedDropDownItem,
      )
    ])
  9. 0

    L’errore che si sta ottenendo è dovuto porsi per una proprietà di un oggetto null. Il tuo articolo deve essere null, quindi quando si chiede per il suo valore va confrontato hai trovato l’errore. Verificare che si sono sempre dati o il tuo elenco è riportato un elenco di oggetti e non di semplici stringhe.

  10. 0

    Quando mi sono imbattuto in questo problema di volere un meno generico DropdownStringButton, ho appena creato:

    dropdown_string_button.dart

    import 'package:flutter/material.dart';
    //Subclass of DropdownButton based on String only values.
    //Yes, I know Flutter discourages subclassing, but this seems to be
    //a reasonable exception where a commonly used specialization can be
    //made more easily usable.
    //
    //Usage: 
    //DropdownStringButton(items: ['A', 'B', 'C'], value: 'A', onChanged: (string) {})
    //
    class DropdownStringButton extends DropdownButton<String> {
      DropdownStringButton({
        Key key, @required List<String> items, value, hint, disabledHint,
        @required onChanged, elevation = 8, style, iconSize = 24.0, isDense = false,
        isExpanded = false, }) : 
        assert(items == null || value == null || items.where((String item) => item == value).length == 1),
            super(
              key: key,
              items: items.map((String item) {
                return DropdownMenuItem<String>(child: Text(item), value: item);
              }).toList(),
            value: value, hint: hint, disabledHint: disabledHint, onChanged: onChanged,
            elevation: elevation, style: style, iconSize: iconSize, isDense: isDense,
            isExpanded: isExpanded,
            );
        }
  11. 0

    Fosse successo a me quando ho a sostituire il valore di default con un nuovo valore dinamico. Ma, in qualche modo, il codice potrebbe essere dipendenti dal valore di default. Quindi, cercare di mantenere una costante con il valore memorizzato da qualche parte per il fallback.

    const defVal = 'abcd';
    String dynVal = defVal;
    
    //dropdown list whose value is dynVal that keeps changing with onchanged
    //when rebuilding or setState((){})
    
    dynVal = defVal;
    //rebuilding here...
  12. 0

    Cambiare

    List<String> _locations = ['A', 'B', 'C', 'D'];

    Per

    List<String> _locations = [_selectedLocation, 'A', 'B', 'C', 'D'];

    _selectedLocation deve essere parte del vostro Elenco di elementi;

Lascia un commento