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:
| Range | Grade |
|---|---|
| 90-100 | A1 |
| 80-89 | A2 |
| 70-79 | B1 |
| 60-69 | B2 |
| 50-59 | C1 |
| 40-49 | C2 |
| 33-39 | D |
| 0-32 | E |
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'),
),
);
}
}