#flutter #dart
#трепетание #dart
Вопрос:
Тип аргумента ‘void Function(String)’ не может быть присвоен типу параметра ‘void Function(String?)?’.dartargument_type_not_assignable String Новое значение. привет, у меня вышеприведенная ошибка при попытке реализовать выпадающий список меню в flutter
ниже приведен мой код. пожалуйста, я новичок в flutter
class _CreateAccountState extends State<CreateAccount> {
String dropdownvalue = 'Apple';
var items = ['Apple','Banana','Grapes','Orange','watermelon','Pineapple'];
@override
Widget build(BuildContext context) {
double h = MediaQuery.of(context).size.height;
double w = MediaQuery.of(context).size.width;
return Scaffold( ....
child: DropdownButton(
value: dropdownvalue,
icon: Icon(Icons.keyboard_arrow_down),
items:items.map((String items) {
return DropdownMenuItem(
value: items,
child: Text(items)
);
}
).toList(),
onChanged: (String newValue){
setState(() {
dropdownvalue = newValue;
});
},
),
спасибо вам всем.
Ответ №1:
Подобные ошибки связаны с безопасностью null, вы можете узнать больше о безопасности null здесь .
Если вы проверите класс DropDownButton в официальных документах, вы можете увидеть пример, в котором используется свойство OnChanged:
onChanged: (String? newValue) {
setState(() {
dropdownValue = newValue!;
});
},
Если вы проверяете реализацию свойства OnChanged:
final ValueChanged<T?>? onChanged;
Это T?
означает, что для него требуется тип с нулевым значением, например String?
, вместо ненулевого типа, например String
.
Комментарии:
1. Для подобных проблем действительно полезно проверить api flutter, просто погуглив виджет — в большинстве случаев их примеры помогут вам. И я бы настоятельно рекомендовал прочитать первую ссылку (статья о нулевой безопасности), поскольку это фундаментальное изменение базового языка dart 🙂
Ответ №2:
Тип аргумента OnChanged равен void Function(String?)
. Таким образом, вы не можете назначить функцию типа аргумента void Function(String)
Поэтому, пожалуйста, измените код следующим образом:
(измените String
тип на String?
в аргументе «OnChanged»
class _CreateAccountState extends State<CreateAccount> {
String dropdownvalue = 'Apple';
var items = ['Apple','Banana','Grapes','Orange','watermelon','Pineapple'];
@override
Widget build(BuildContext context) {
double h = MediaQuery.of(context).size.height;
double w = MediaQuery.of(context).size.width;
return Scaffold( ....
child: DropdownButton(
value: dropdownvalue,
icon: Icon(Icons.keyboard_arrow_down),
items:items.map((String items) {
return DropdownMenuItem(
value: items,
child: Text(items)
);
}
).toList(),
onChanged: (String? newValue){
setState(() {
dropdownvalue = newValue;
});
},
),
Комментарии:
1. большое спасибо, чувак. это сработало для меня. вы действительно спасли меня!