challenge_exercises.dart 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import 'package:flutter/material.dart';
  2. import 'package:physigo/challenge/models/challenge.dart';
  3. import 'package:physigo/exercises/exercises_validation/exercise_validation_page.dart';
  4. import 'package:physigo/exercises/exercises_validation/models/squat.dart';
  5. class ChallengeExercises extends StatelessWidget {
  6. final Future<Challenge> Function() getChallenge;
  7. const ChallengeExercises({required this.getChallenge, Key? key}) : super(key: key);
  8. @override
  9. Widget build(BuildContext context) {
  10. return FutureBuilder<Challenge>(
  11. future: getChallenge(),
  12. builder: (context, snapshot) {
  13. if (snapshot.connectionState == ConnectionState.waiting) {
  14. return const CircularProgressIndicator();
  15. }
  16. final challenge = snapshot.data!;
  17. return Column(
  18. children: challenge.exercises
  19. .asMap()
  20. .entries
  21. .map((e) => ExerciseTile(
  22. exercise: e.value,
  23. isBonusExercise: e.key == challenge.bonusExercise,
  24. ))
  25. .toList(),
  26. );
  27. },
  28. );
  29. }
  30. }
  31. class ExerciseTile extends StatelessWidget {
  32. final Exercise exercise;
  33. final bool isBonusExercise;
  34. const ExerciseTile({required this.exercise, required this.isBonusExercise, Key? key}) : super(key: key);
  35. @override
  36. Widget build(BuildContext context) {
  37. return Card(
  38. elevation: 3,
  39. color: isBonusExercise ? Colors.orange : Colors.blueGrey,
  40. child: ListTile(
  41. iconColor: Colors.white,
  42. textColor: Colors.white,
  43. title: Text(
  44. exercise.name.toUpperCase(),
  45. textAlign: TextAlign.center,
  46. style: const TextStyle(
  47. fontSize: 18,
  48. fontWeight: FontWeight.bold,
  49. letterSpacing: 1.8,
  50. ),
  51. ),
  52. minLeadingWidth: 24,
  53. leading: isBonusExercise ? const Icon(Icons.star, size: 24) : const SizedBox(width: 24),
  54. subtitle: isBonusExercise ? const Text("Bonus exercise, earn 2x points!", textAlign: TextAlign.center, style: TextStyle(fontSize: 16),) : null,
  55. trailing: const Icon(Icons.arrow_forward),
  56. onTap: () {
  57. Navigator.push(context, MaterialPageRoute(builder: (_) => ExerciseValidationPage(exercise: squat)));
  58. },
  59. ),
  60. );
  61. }
  62. }