import 'dart:collection'; import 'package:aitrainer_app/bloc/exercise_control/exercise_control_bloc.dart'; import 'package:aitrainer_app/localization/app_language.dart'; import 'package:aitrainer_app/repository/exercise_repository.dart'; import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/widgets/app_bar.dart'; import 'package:aitrainer_app/widgets/bottom_nav.dart'; import 'package:aitrainer_app/widgets/splash.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_form_bloc/flutter_form_bloc.dart'; import 'package:aitrainer_app/library/numberpicker.dart'; import 'package:google_fonts/google_fonts.dart'; class ExerciseControlPage extends StatefulWidget { _ExerciseControlPage createState() => _ExerciseControlPage(); } class _ExerciseControlPage extends State with Trans { @override Widget build(BuildContext context) { LinkedHashMap arguments = ModalRoute.of(context).settings.arguments; final ExerciseRepository exerciseRepository = arguments['exerciseRepository']; final double percent = arguments['percent']; final bool readonly = arguments['readonly']; setContext(context); return BlocProvider( create: (context) => ExerciseControlBloc(exerciseRepository: exerciseRepository, percentToCalculate: percent, readonly: readonly) ..add(ExerciseControlLoad()), child: BlocConsumer(listener: (context, state) { if (state is ExerciseControlError) { //LoadingDialog.hide(context); Scaffold.of(context).showSnackBar( SnackBar(backgroundColor: Colors.orange, content: Text(state.message, style: TextStyle(color: Colors.white)))); } else if (state is ExerciseControlLoading) { //LoadingDialog.show(context); } }, builder: (context, state) { final exerciseBloc = BlocProvider.of(context); if (state is ExerciseControlReady) { //LoadingDialog.hide(context); return getControlForm(exerciseBloc); } else { return getControlForm(exerciseBloc); } })); } Form getControlForm(ExerciseControlBloc exerciseBloc) { String exerciseName = AppLanguage().appLocal == Locale("en") ? exerciseBloc.exerciseRepository.exerciseType.name : exerciseBloc.exerciseRepository.exerciseType.nameTranslation; return Form( child: Scaffold( resizeToAvoidBottomInset: true, appBar: AppBarNav(depth: 1), body: Container( width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, decoration: BoxDecoration( image: DecorationImage( image: AssetImage('asset/image/WT_black_background.png'), fit: BoxFit.fill, alignment: Alignment.center, ), ), child: Container( padding: const EdgeInsets.only(top: 25, left: 25, right: 25), child: SingleChildScrollView( scrollDirection: Axis.vertical, child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( exerciseName, style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18, color: Colors.orange), overflow: TextOverflow.fade, maxLines: 1, softWrap: true, ), FlatButton( child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Icon( Icons.info, color: Colors.yellow[300], ), Flexible( child: Text(t("Why do you need Exercise Control?"), style: TextStyle(color: Colors.yellow[300], fontWeight: FontWeight.normal, fontSize: 14)), ), Icon( Icons.arrow_forward_ios, color: Colors.yellow[300], ), ]), textColor: Colors.blueAccent, color: Colors.transparent, onPressed: () => { //Navigator.of(context).pushNamed('exerciseTypeDescription', arguments: exerciseBloc.exerciseRepository), }, ), Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Text(t("Your 1RM:"), style: GoogleFonts.inter( color: Colors.yellow[300], )), Text( " " + exerciseBloc.initialRM.toStringAsFixed(0) + " " + exerciseBloc.exerciseRepository.exerciseType.unitQuantityUnit, style: GoogleFonts.inter(color: Colors.yellow[300], fontWeight: FontWeight.bold), ), ], ), Divider(), numberPickForm(exerciseBloc, 1), Divider(), numberPickForm(exerciseBloc, 2), Divider(), numberPickForm(exerciseBloc, 3), ]), ))), bottomNavigationBar: BottomNavigator(bottomNavIndex: 1), ), ); } Widget numberPickForm(ExerciseControlBloc exerciseBloc, int step) { String strTimes = step == 2 ? exerciseBloc.origQuantity.toString() : "max."; String textInstruction = ""; textInstruction = t("Please repeat with ") + exerciseBloc.unitQuantity.toStringAsFixed(0) + " " + exerciseBloc.exerciseRepository.exerciseType.unitQuantityUnit + t("hu_with") + " " + strTimes + " " + t( "times!", ); String title = step.toString() + ". " + t("Control Exercise:"); List listWidgets = [ Text( title, style: GoogleFonts.inter(color: Colors.yellow[300], fontWeight: FontWeight.bold), ), Text( textInstruction, style: GoogleFonts.inter(color: Colors.yellow[300], fontSize: 12), ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ NumberPicker.horizontal( highlightSelectedValue: step == exerciseBloc.step, initialValue: exerciseBloc.quantity.toInt(), minValue: 0, maxValue: 200, step: 1, onChanged: (value) => {exerciseBloc.add(ExerciseControlQuantityChange(quantity: value.toDouble(), step: step))}, listViewHeight: 80, textStyleHighlighted: GoogleFonts.archivoBlack(color: Colors.orange[300], fontSize: 24), //decoration: _decoration, ), FlatButton( padding: EdgeInsets.all(0), textColor: Colors.white, //color: step == exerciseBloc.step ? Colors.orange : Colors.black26, focusColor: Colors.blueAccent, onPressed: () => { exerciseBloc.add(ExerciseControlSubmit(step: step)), if (step == 3) {confirmationDialog(exerciseBloc)} }, child: step == exerciseBloc.step ? Stack( alignment: Alignment.center, children: [ Image.asset('asset/icon/gomb_orange_a.png', width: 140, height: 60), Text( t("Save"), style: TextStyle(fontSize: 16, color: Colors.white), ), ], ) : Container()), ], ), ]; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: listWidgets, ); } void confirmationDialog(ExerciseControlBloc bloc) { String unit = t(bloc.exerciseRepository.exerciseType.unit); showCupertinoDialog( useRootNavigator: true, context: context, //barrierDismissible: false, builder: (_) => CupertinoAlertDialog( title: Text(t("Summary of your test")), content: Column(children: [ Text( t("Test") + ": " + bloc.repeats[1].toStringAsFixed(0) + "x" + bloc.repeats[0].toStringAsFixed(0) + " " + unit, style: (TextStyle(color: Colors.blue)), ), Divider(), Text( t("1st Control") + ": " + bloc.repeats[2].toStringAsFixed(0) + "x" + bloc.unitQuantity.toStringAsFixed(0) + " " + unit, style: (TextStyle(color: Colors.blue)), ), Text( t("2nd Control") + ": " + bloc.repeats[3].toStringAsFixed(0) + "x" + bloc.unitQuantity.toStringAsFixed(0) + " " + unit, style: (TextStyle(color: Colors.blue)), ), Text( t("3rd Control") + ": " + bloc.repeats[4].toStringAsFixed(0) + "x" + bloc.unitQuantity.toStringAsFixed(0) + " " + unit, style: (TextStyle(color: Colors.blue)), ), ]), actions: [ FlatButton( child: Text(t("OK")), onPressed: () => {Navigator.of(context).pop(), Navigator.of(context).pop()}, ) ], )); } }