Yimaru-Mobile/lib/ui/views/learn_practice/learn_practice_view.dart

125 lines
4.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/views/learn_practice/screens/finish_learn_practice_screen.dart';
import 'package:yimaru_app/ui/views/learn_practice/screens/learn_practice_completion_screen.dart';
import 'package:yimaru_app/ui/views/learn_practice/screens/learn_practice_result_screen.dart';
import 'package:yimaru_app/ui/views/learn_practice/screens/learn_practices_screen.dart';
import 'package:yimaru_app/ui/views/learn_practice/screens/interact_learn_practice_screen.dart';
import 'package:yimaru_app/ui/views/learn_practice/screens/learn_practice_intro_screen.dart';
import 'package:yimaru_app/ui/views/learn_practice/screens/start_learn_practice_screen.dart';
import '../../common/app_colors.dart';
import '../../widgets/cancel_learn_practice_sheet.dart';
import 'learn_practice_viewmodel.dart';
class LearnPracticeView extends StackedView<LearnPracticeViewModel> {
final String title;
final String subtitle;
final String buttonLabel;
final List<Map<String, dynamic>> practices;
const LearnPracticeView(
{Key? key,
required this.title,
required this.subtitle,
required this.practices,
required this.buttonLabel})
: super(key: key);
Future<void> _cancel(LearnPracticeViewModel viewModel) async {
viewModel.pop();
viewModel.goTo(0);
viewModel.stopRecording();
}
Future<void> _pop(
{required BuildContext context,
required LearnPracticeViewModel viewModel}) async {
{
if (viewModel.currentPage == 3) {
await _showSheet(context: context, viewModel: viewModel);
} else {
viewModel.goBack();
}
}
}
Future<void> _showSheet(
{required BuildContext context,
required LearnPracticeViewModel viewModel}) async =>
await showModalBottomSheet(
context: context,
isScrollControlled: true,
backgroundColor: kcTransparent,
builder: (_) => _buildSheet(viewModel),
);
@override
LearnPracticeViewModel viewModelBuilder(BuildContext context) =>
LearnPracticeViewModel();
@override
Widget builder(
BuildContext context,
LearnPracticeViewModel viewModel,
Widget? child,
) =>
_buildPracticeScreensWrapper(context: context, viewModel: viewModel);
Widget _buildPracticeScreensWrapper(
{required BuildContext context,
required LearnPracticeViewModel viewModel}) =>
PopScope(
canPop: viewModel.currentPage == 0 ? true : false,
onPopInvokedWithResult: (value, data) async =>
await _pop(context: context, viewModel: viewModel),
child: _buildScaffoldWrapper(viewModel));
Widget _buildSheet(LearnPracticeViewModel viewModel) =>
CancelLearnPracticeSheet(
onClose: viewModel.pop,
onContinue: viewModel.pop,
onCancel: () async => await _cancel(viewModel),
);
Widget _buildScaffoldWrapper(LearnPracticeViewModel viewModel) => Scaffold(
backgroundColor: kcBackgroundColor,
body: _buildBody(viewModel),
);
Widget _buildBody(LearnPracticeViewModel viewModel) =>
IndexedStack(index: viewModel.currentPage, children: _buildScreens());
List<Widget> _buildScreens() => [
_buildLearnPracticesScreen(),
_buildLearnPracticeIntroScreen(),
_buildStartLearnPracticeScreen(),
_buildInteractLearnPracticeScreen(),
_buildFinishLearnPracticeScreen(),
_buildLearnPracticeResultScreen(),
_buildLearnPracticeCompletionScreen()
];
Widget _buildLearnPracticesScreen() => LearnPracticesScreen(
practices: practices,
);
Widget _buildLearnPracticeIntroScreen() => LearnPracticeIntroScreen(
title: title,
subtitle: subtitle,
buttonLabel: buttonLabel,
);
Widget _buildStartLearnPracticeScreen() => const StartLearnPracticeScreen();
Widget _buildInteractLearnPracticeScreen() =>
const InteractLearnPracticeScreen();
Widget _buildFinishLearnPracticeScreen() => const FinishLearnPracticeScreen();
Widget _buildLearnPracticeResultScreen() => const LearnPracticeResultScreen();
Widget _buildLearnPracticeCompletionScreen() =>
const LearnPracticeCompletionScreen();
}