Solución:
Bueno, ya que ningún problema tiene exactamente la misma solución. Estaba enfrentando el mismo problema con mi código. Así es como solucioné esto.
CÓDIGO de mi DropdownButton:
DropdownButton(
items: _salutations
.map((String item) =>
DropdownMenuItem<String>(child: Text(item), value: item))
.toList(),
onChanged: (String value) {
setState(() {
print("previous ${this._salutation}");
print("selected $value");
this._salutation = value;
});
},
value: _salutation,
),
El error
En el fragmento de código a continuación, establezco el estado de un valor de selección, que es de tipo String. Ahora el problema con mi código fue la inicialización predeterminada de este valor de selección. Inicialmente, estaba inicializando la variable _salutation
como:
String _salutation = ""; //Notice the empty String.
¡Fue un error!
La selección inicial no debe ser nula o vacía como el mensaje de error se menciona correctamente.
‘elementos == nulo || items.isEmpty || valor == nulo ||
Y de ahí el choque:
Solución
Inicialice el objeto de valor con algún valor predeterminado. tenga en cuenta que el value debe ser uno de los valores contenidos en su colección. Si no es así, espere un accidente.
String _salutation = "Mr."; //This is the selection value. It is also present in my array.
final _salutations = ["Mr.", "Mrs.", "Master", "Mistress"];//This is the array for dropdown
También podría obtener este error si intenta establecer el valor del menú desplegable con una instancia de clase;
var tag1 = Tag();
var tag2 = Tag();
print(tag1 == tag2); // prints false, dropwdown computes that value is not present among dropdown options
Para resolver este operador de anulación ==:
class Tag{
String name = "tag";
@override
bool operator ==(Object other) => other is Tag && other.name == name;
@override
int get hashCode => name.hashCode;
}
o use https://pub.dev/packages/equatable lib
class Tag extends Equatable{
String name = "tag";
@override
List<Object> get props => [name];
}
Yo tuve el mismo problema. La solución es simple: debe asegurarse de que la Cadena que es su valor desplegable predeterminado esté contenida en la lista que desea usar en su menú desplegable. Si quisiera, digamos, usar una lista de una API, debe asegurarse de conocer al menos un valor de esa lista, para poder asignarlo a la variable que es su valor desplegable predeterminado.
Aquí quiero mostrar una lista que obtengo de una api. Para no obtener el error, configuro mi valor de dropdown predeterminado con el nombre ‘Encajes’ que es una de las categorías existentes que contiene mi lista.
String dropdownValue = "Encajes";
items: categoriesString
.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),