Pour connaître la solution, allez à la fin de la réponse.
Tout d'abord, examinons ce que dit l'erreur (j'ai cité l'erreur qui se produit avec Flutter 1.2, mais l'idée est la même) :
Échec de l'assertion : ligne 560 pos 15 : 'items == null || items.isEmpty || value == null || items.where((DropdownMenuItem item) => item.value == value).length == 1' : n'est pas vrai.
Il y a quatre or
conditions. Au moins une d'entre elles doit être remplie :
- Éléments (une liste de
DropdownMenuItem
widgets) ont été fournis. Cela permet d'éliminer items == null
.
- Une liste non vide a été fournie. Ceci élimine
items.isEmpty
.
- Une valeur (
_selectedLocation
) a également été donné. Cela permet d'éliminer value == null
. Notez que c'est DropdownButton
et non pas la valeur de DropdownMenuItem
La valeur de l'entreprise.
Il ne reste donc que le dernier chèque. Ça se résume à quelque chose comme :
Itérer à travers DropdownMenuItem
's. Trouvez tous ceux qui ont un value
qui est égal à _selectedLocation
. Ensuite, vérifiez combien d'éléments correspondant à cette valeur ont été trouvés. Il doit y avoir exactement un widget qui a cette valeur. Sinon, une erreur est générée.
La façon dont le code est présenté, il n'y a pas de DropdownMenuItem
qui a une valeur de _selectedLocation
. Au lieu de cela, tous les widgets ont leur valeur fixée à null
. Puisque null != _selectedLocation
la dernière condition échoue. Vérifiez cela en réglant _selectedLocation
à null
- l'application doit fonctionner.
Pour résoudre ce problème, nous devons d'abord définir une valeur pour chaque élément de la liste. DropdownMenuItem
(afin que quelque chose puisse être passé à onChanged
callback) :
return DropdownMenuItem(
child: new Text(location),
value: location,
);
L'application échouera quand même. Cela est dû au fait que votre liste ne contient toujours pas _selectedLocation
La valeur de l'entreprise. Vous pouvez faire fonctionner l'application de deux manières :
-
Option 1 . Ajouter un autre widget qui a la valeur (pour satisfaire à
items.where((DropdownMenuItem<T> item) => item.value == value).length == 1
). Cela peut être utile si vous voulez permettre à l'utilisateur de re-sélectionner Please choose a location
option.
-
Option 2 . Passez quelque chose à
hint:
parmentier et ensemble selectedLocation
à null
(pour satisfaire value == null
condition). Utile si vous ne voulez pas Please choose a location
pour rester une option.
Voir le code ci-dessous qui montre comment le faire :
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(),
),
),
),
);
}
}
1 votes
Le problème est que la chaîne _selectedLocation = 'Please choose a location' ; ne figure pas dans les valeurs du DropdownMenuItem. Ce que vous essayez de faire est probablement un indice.
0 votes
Ce site m'a aidé codesinsider.com/flutter-dropdown-button-example