Ошибка: (Тип аргумента «Строка?» не может быть присвоен типу параметра «Строка», потому что «Строка?» может быть обнулена, а «Строка» — нет.) в Flutter

#flutter #android-studio #dart #visual-studio-code #flutter-layout

Вопрос:

Я новичок в flutter и получаю ошибку при передаче строки, искал везде и, наконец, добавил это в StackOverflow

ошибка в том, что

Error: The argument type 'String?' can't be assigned to the parameter type 'String' because 'String?' is nullable and 'String' isn't.

 void errorSnackBar(BuildContext context, String? text) {
  ScaffoldMessenger.of(context).showSnackBar(new SnackBar(
    duration: new Duration(seconds: 4),
    content: new Row(
      children: <Widget>[
        Icon(
          Icons.error,
          color: Colors.red,
        ),
        Padding(
          padding: const EdgeInsets.fromLTRB(10.0, 0, 0, 0),
          child: new Text(text),
        ),
      ],
    ),
  ));
}
 

Комментарии:

1. dart.dev/нулевая безопасность/…

Ответ №1:

Text() требует a String в качестве своего первого параметра (т. е. Нет null ). null не является допустимым значением для типа String , так же как 123 не является допустимым значением для типа String .

Если ваше сообщение об ошибке является a String? , вам необходимо обработать случай, в котором оно находится null , прежде чем вы сможете передать его Text() . Некоторые варианты:

  1. Проверьте, является ли он нулевым, и вернитесь раньше:
 void errorSnackBar(BuildContext context, String? text) {
  if (text == null) return;
  // dart uses "type promotion" to know that text is definitely not null here
  final textWidget = Text(text);  // this is fine
  ScaffoldMessenger.of(context) ... // show snackbar
}
 
  1. Если вы знаете, что звоните только errorSnackBar тогда, когда text значение не равно нулю, попробуйте изменить его тип:
 void errorSnackBar(BuildContext context, String text) {
  // rest of the method the same
}
 

Комментарии:

1. Спасибо, я ценю ваш ответ.если (текст == null) возвращается; окончательный TextWidget = Текст(текст); работал на меня, я не смог угадать эту строку? текст сохраняет значение null в тексте

Ответ №2:

Это может помочь кому-то новому, у меня были похожие проблемы, как я их решаю

  Padding(
      padding: const EdgeInsets.fromLTRB(10.0, 0, 0, 0),
      child: new Text(text ?? 'Default Value'),
    ),
 

для получения дополнительной информации перейдите по этой ссылке

Ответ №3:

У меня была та же проблема

В моем случае мне пришлось использовать нулевую безопасность.

 final String? name
 

Мне пришлось использовать знак!, чтобы это сработало. Такие, как: если бы я хотел назвать это

 index.name!
 

Ответ №4:

преобразуйте текст в строку с помощью .toString()

  void errorSnackBar(BuildContext context, String? text) {
      ScaffoldMessenger.of(context).showSnackBar(new SnackBar(
        duration: new Duration(seconds: 4),
        content: new Row(
          children: <Widget>[
            Icon(
              Icons.error,
              color: Colors.red,
            ),
            Padding(
              padding: const EdgeInsets.fromLTRB(10.0, 0, 0, 0),
              child: new Text(text.toString()),
            ),
          ],
        ),
      ));
    }