finishTest function
- BuildContext context
This function is called when the official test is finished.
First it calls TimeProvider.getAveragedDuration and TimeProvider.getStdDeviation to calculate the average and standard deviation of all the partial times. Then it calls Profile.addTest to add the completed test to the active user's test list.
After that it sends the information to the backend by calling enviarDatosSDMT. Based on the API feedback, it sets the value of ParametersProvider.dataSentCorrectly to true or false.
To finish, it resets all the control variables involved in the test and some of the home screen too, like the text controllers. Waits half a second and pushes to the ResultsScreen
The only argument is the context to access the providers.
The providers are instanced with listen:false because the function is outside the widget tree
and it does not need to react to changes in the providers.
Implementation
void finishTest(BuildContext context) async{
context.read<TimeProvider>().setEndTime();
final progressProvider = Provider.of<ProgressProvider>(context, listen:false);
final parametersProvider = Provider.of<ParametersProvider>(context, listen:false);
final personalDataProvider = Provider.of<PersonalDataProvider>(context, listen:false);
final deviceProvider = Provider.of<DeviceProvider>(context, listen:false);
final buttonsProvider = Provider.of<ButtonsProvider>(context, listen: false);
final timeProvider = Provider.of<TimeProvider>(context, listen: false);
parametersProvider.setDataSent(true);
final double averagedDuration= timeProvider.getAveragedDuration();
final double sdev_duration = timeProvider.getStdDeviation();
personalDataProvider.profilesList[personalDataProvider.activeUser ?? 0].addTest(Test(date: DateTime.now(), hand: parametersProvider.hand, displayed: progressProvider.totalDisplayed, mistakes: progressProvider.totalMistakes));
final sset = (personalDataProvider.profilesList[personalDataProvider.activeUser ?? 0].isSymbols1 == true) ? "set1" : "set2";
final int answer = await enviarDatosSDMT(
codeid: parametersProvider.codeid ?? "",
fNacimiento: personalDataProvider.profilesList[personalDataProvider.activeUser ?? -1].dateOfBirth?.toIso8601String().substring(0,10) ?? "",
sexo: personalDataProvider.profilesList[personalDataProvider.activeUser ?? -1].sex ?? "",
nivelEduc: personalDataProvider.profilesList[personalDataProvider.activeUser ?? -1].sex ?? "",
mano: parametersProvider.hand ?? "",
numSim: progressProvider.totalDisplayed.toString(),
tiempo: "90",
errores: progressProvider.totalMistakes.toString(),
score: progressProvider.progressCounter.toString(),
num_Dig_1: progressProvider.symbolsDisplayed[0].toString(),
num_Dig_2: progressProvider.symbolsDisplayed[1].toString(),
num_Dig_3: progressProvider.symbolsDisplayed[2].toString(),
number_Errors: progressProvider.totalMistakes.toString(),
number_Errors_1: progressProvider.mistakesCounter[0].toString(),
number_Errors_2: progressProvider.mistakesCounter[1].toString(),
number_Errors_3: progressProvider.mistakesCounter[2].toString(),
averaged_duration: averagedDuration.toString(),
sdev_duration: sdev_duration.toString(),
symbol_set:sset,
device: deviceProvider.deviceModel ?? 'unknownDevice',
diagInch: deviceProvider.diagonalInches.toString(),
);
debugPrint('sending info');
if(answer == -1){
parametersProvider.setDataSentCorrectly(false);
} else{
parametersProvider.setDataSentCorrectly(true);
}
progressProvider.resetThirdsCounter();
progressProvider.resetMistakesCounter();
progressProvider.resetProgressCounter();
progressProvider.resetSymbolsDisplayed();
parametersProvider.setDataSent(false);
personalDataProvider.saveProfiles();
parametersProvider.resetCodeidController1();
parametersProvider.resetCodeidController2();
parametersProvider.setIsTrialTest(true);
timeProvider.resetPartialTimes();
buttonsProvider.setIsCodeValidated(false);
buttonsProvider.setIsReadOnly(false);
Future.delayed(const Duration(milliseconds: 500),(){
Navigator.pushNamed(context, '/resultsScreen');
});
}