flutter Тип аргумента ‘void Function(String)’ не может быть присвоен типу параметра ‘void Function(String?)?’ в flutter

#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. большое спасибо, чувак. это сработало для меня. вы действительно спасли меня!