I am getting two errors one in Quiz.dart and another in Main.dart.
In main.dart I am getting an error on answerQuestion: _answerQuestion,
Error: [The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function()'.]
Main.dart
import 'package:flutter/material.dart';
import './quiz.dart';
import './result.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _MyAppState();
}
}
class _MyAppState extends State<MyApp> {
static const _questions = const [
{
'questionText': 'What\'s your favorite Color?',
'answers': [
{'text': 'Red', 'score': 10},
{'text': 'White', 'score': 5},
{'text': 'Black', 'score': 3},
{'text': 'Green', 'score': 1},
],
},
{
'questionText': 'What\'s your favorite animal?',
'answers': [
{'text': 'Dog', 'score': 10},
{'text': 'Cat', 'score': 7},
{'text': 'Monkey', 'score': 5},
{'text': 'Tiger', 'score': 2},
],
},
{
'questionText': 'What\'s your favorite Number',
'answers': [
{'text': 'Raman', 'score': 10},
{'text': 'Krishnan', 'score': 7},
{'text': 'Balan', 'score': 5},
{'text': 'Gopi', 'score': 2},
],
},
];
var _questionIndex = 0;
var _totalScore = 0;
void _answerQuestion(int score) {
_totalScore += score;
setState(() {
_questionIndex = _questionIndex + 1;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('My First App'),
),
body: _questionIndex < _questions.length
? Quiz(
answerQuestion: _answerQuestion,
questionIndex: _questionIndex,
questions: _questions,
)
: Result(_totalScore),
));
}
}
in quiz.dart I am getting an error on answerQuestion(answer['score']),
Error:Too many positional arguments: 0 expected, but 1 found. Try removing the extra arguments.
Quiz.dart
import 'package:flutter/material.dart';
import './answer.dart';
import './question.dart';
class Quiz extends StatelessWidget {
// final List<Map<String, Object>> questions;
final List<Map<String, dynamic>> questions;
final int questionIndex;
final VoidCallback answerQuestion;
Quiz({
required this.questions,
required this.answerQuestion,
required this.questionIndex,
});
@override
Widget build(BuildContext context) {
return Column(
children: [
Question(
questions[questionIndex]['questionText'],
),
// ...(questions[questionIndex]['answers'] as List<String>).map((answer) {
...(questions[questionIndex]['answers'] as List<Map<String, dynamic>>)
.map((answer) {
return Answer(() => answerQuestion(answer['score']), answer['text']);
}).toList()
],
);
}
}
I have tried my best to understand the error, your assistance is highly appreciated, thanks in Advance.
The void _answerQuestion
function expects an int
parameter value but the class Quiz
declares final VoidCallback answerQuestion
and functions of the type VoidCallback
doesn't expects any kind of parameter.
That is why you are getting The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function()' error message.
You can define your own type using typedef
keyword or use ValueSetter
from flutter foundation instead VoidCallback
.
typedef MyOwnFunction = void Function(int score);
class Quiz extends StatelessWidget {
//...
final MyOwnFunction answerQuestion;
//...
}
Or just replace VoidCallback answerQuestion
by ValueSetter<int> answerQuestion
in Quiz
class.