Skip to main content

Results

View and manage student exam results.

Get Test Results

GET /teacher/exams/results/test/{testId}
{
"data": {
"testId": "uuid",
"testName": "Chapter 3 Test",
"subject": "Mathematics",
"results": [
{ "studentId": "uuid", "name": "John Doe", "rollNo": "1", "marksObtained": 18, "maxMarks": 20, "grade": "A1" },
{ "studentId": "uuid", "name": "Jane Smith", "rollNo": "2", "marksObtained": 15, "maxMarks": 20, "grade": "A2" }
]
}
}

Upload Test Results

POST /teacher/exams/results/test/{testId}
{
"data": {
"results": [
{ "studentId": "uuid", "marksObtained": 18 },
{ "studentId": "uuid", "marksObtained": 15 }
]
}
}

Get Exam Results

GET /teacher/exams/results/exam/{examId}

Returns consolidated results across all tests in an exam.

Upload Exam Results

POST /teacher/exams/results/exam/{examId}
{
"data": {
"results": [
{ "studentId": "uuid", "subjectId": "uuid", "marksObtained": 78, "maxMarks": 100 }
]
}
}

Grade Auto-Calculation

Grades are auto-calculated based on school-configured grade map:

RangeGrade
90-100A1
80-89A2
70-79B1
60-69B2
50-59C1
40-49C2
33-39D
0-32E

UI — Result Entry

class ResultEntryScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final vm = context.watch<ResultViewModel>();

return Scaffold(
appBar: AppBar(title: Text('${vm.testName} — ${vm.subject}')),
body: ListView.builder(
itemCount: vm.students.length,
itemBuilder: (_, i) {
final student = vm.students[i];
return ListTile(
title: Text(student.name),
subtitle: Text('Roll No: ${student.rollNo}'),
trailing: SizedBox(
width: 80,
child: TextFormField(
keyboardType: TextInputType.number,
decoration: InputDecoration(
hintText: '/${vm.maxMarks}',
),
onChanged: (v) => vm.setMarks(student.id, int.tryParse(v)),
),
),
leading: CircleAvatar(
child: Text('${i + 1}'),
),
);
},
),
floatingActionButton: ElevatedButton(
onPressed: vm.canSubmit ? () => vm.submitResults() : null,
child: const Text('Submit Results'),
),
);
}
}