Ошибка: Тип аргумента «Список» не может быть присвоен типу параметра «Строка»

#flutter #dart

Вопрос:

Я новичок в дартсе и пытаюсь создать приложение для викторины, в котором я использую некоторые виджеты для получения вопросов и вариантов ответов на экране. Ошибка, с которой я сталкиваюсь, заключается в том, что «Тип аргумента» Список «не может быть присвоен типу параметра «Строка «» Вот некоторые фрагменты моего кода:-

  1. Это список карт<Строка, объект> , я сохраняю вопросы и варианты ответов на них в этой переменной.
 var questions = [
      {
        'questionText': 'What is your favourite season?',
        'answers': [
          'Summer',
          'Monsoon',
          'Winter',
        ]
      },
      {
        'questionText': 'What is your favourite color?',
        'answers': [
          'Black',
          'Green',
          'Blue',
        ]
      },
      {
        'questionText': 'What is your favourite food?',
        'answers': [
          'Chicken',
          'Kebab',
          'Biryani',
        ]
      },
    ];
 
  1. Здесь я называю виджет вопросов и ответов.
 body: Column(
          children: [
            Question(questions[_questionsIndex]["questionText"]),
            ...{questions[_questionsIndex]['answers'] as List<String>}
                .map((answer) {
              return Answer(_answerQuestion, answer); //**ERROR**
            }).toList(),
          ],
        ),
 

В инструкции появляется ошибка : вернуть ответ(_ответ, ответ);

  1. Вот как выглядит мой класс виджетов ответов:
 class Answer extends StatelessWidget {
  final Function selectAnswer;
  final String answerText;

  Answer(this.selectAnswer, this.answerText);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: double.infinity,
      child: ElevatedButton(
        style: ElevatedButton.styleFrom(
          primary: Colors.blue,
          elevation: 0.0,
        ),
        child: Text(answerText,
            style: TextStyle(
              color: Colors.black,
            )),
        onPressed: () {
          selectAnswer();
        },
      ),
    );
  }
}
 

В чем смысл этой ошибки и почему она появляется?
Как я могу исправить эту ошибку?

Спасибо!

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

1. Сама ошибка хорошо объяснима: «Тип аргумента» Список «не может быть присвоен типу параметра «Строка»». Это означает, что где-то в коде вы присваиваете переменной типа списка переменную типа строки. Хорошая часть в том, что мы знаем линию ошибок. В строке ошибки вы вызываете функцию Answer (), которая имеет 2 параметра, где 2-й параметр имеет строковый тип. Но при вызове этой функции вы задали переменную типа списка «ответ» (которая имеет тип List<строка>). Здесь ваше назначение параметров не выполняется. Извините, я не знаю Дротика, но это основное правило кодирования.

Ответ №1:

Я думаю, что проблема в вашем втором блоке кода. Для списка строк вы должны использовать просто List тип вместо List<String> типа.

Ваш код был бы таким:

 body: Column(
          children: [
            Question(questions[_questionsIndex]["questionText"]),
            ...{questions[_questionsIndex]['answers'] as List}
                .map((answer) {
              return Answer(_answerQuestion, answer); //**ERROR**
            }).toList(),
          ],
        ),
 

Я надеюсь, что это может решить вашу проблему.

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

1. Я внес изменения, указанные вами, а также должен был изменить тип переменной answerText на динамический в своем классе виджетов ответов, чтобы запустить код, но когда я отлаживаю на своем телефоне, пиксели переполняются. Заявление об ошибке: «Исключение, обнаруженное библиотекой рендеринга: Рендерфлекс переполнен 99238 пикселями внизу».

2. Используйте Расширенное вместо контейнера в функции сборки виджета.

3. Если это решение устраняет ошибку «Тип аргумента» Список «не может быть присвоен типу параметра «Строка»», попробуйте обернуть свой столбец в представление SingleChildScrollView, чтобы исправить предупреждение о переполнении RenderFlex

Ответ №2:

Вы могли бы попробовать уточнить тип вашего основного списка с помощью List<Map<String,dynamic>>

 List<Map<String,dynamic>> questions = [
  {
    'questionText': 'What is your favourite season?',
    'answers': [
      'Summer',
      'Monsoon',
      'Winter',
    ]
  },
  {
    'questionText': 'What is your favourite color?',
    'answers': [
      'Black',
      'Green',
      'Blue',
    ]
  },
  {
    'questionText': 'What is your favourite food?',
    'answers': [
      'Chicken',
      'Kebab',
      'Biryani',
    ]
  },
];
 

Я попытался сопоставить элемент с a List<String> , и каждый работает

 var a = questions[1]['answers'];
List<String> b = a;
print(b);
 

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

1. спасибо за ваш вклад, но я все еще получаю ту же ошибку: «тип» Список<Строка> » не является подтипом типа «Строка»»<Строка>