#flutter #dart
Вопрос:
Я новичок в дартсе и пытаюсь создать приложение для викторины, в котором я использую некоторые виджеты для получения вопросов и вариантов ответов на экране. Ошибка, с которой я сталкиваюсь, заключается в том, что «Тип аргумента» Список «не может быть присвоен типу параметра «Строка «» Вот некоторые фрагменты моего кода:-
- Это список карт<Строка, объект> , я сохраняю вопросы и варианты ответов на них в этой переменной.
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',
]
},
];
- Здесь я называю виджет вопросов и ответов.
body: Column(
children: [
Question(questions[_questionsIndex]["questionText"]),
...{questions[_questionsIndex]['answers'] as List<String>}
.map((answer) {
return Answer(_answerQuestion, answer); //**ERROR**
}).toList(),
],
),
В инструкции появляется ошибка : вернуть ответ(_ответ, ответ);
- Вот как выглядит мой класс виджетов ответов:
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. спасибо за ваш вклад, но я все еще получаю ту же ошибку: «тип» Список<Строка> » не является подтипом типа «Строка»»<Строка>