import 'package:flutter/material.dart'; import 'package:stacked/stacked.dart'; import 'package:yimaru_app/ui/common/app_colors.dart'; import 'package:yimaru_app/ui/common/ui_helpers.dart'; import 'package:yimaru_app/ui/widgets/custom_elevated_button.dart'; import 'package:yimaru_app/ui/widgets/custom_small_radio_button.dart'; import 'package:yimaru_app/ui/widgets/large_app_bar.dart'; import '../assessment_viewmodel.dart'; class AssessmentQuestionsScreen extends ViewModelWidget { const AssessmentQuestionsScreen({super.key}); @override Widget build(BuildContext context, AssessmentViewModel viewModel) => _buildAssessmentScreensWrapper(viewModel); Widget _buildAssessmentScreensWrapper(AssessmentViewModel viewModel) => PopScope( canPop: false, onPopInvokedWithResult: (value, data) => viewModel.previousQuestion(), child: _buildScaffoldWrapper(viewModel)); Widget _buildScaffoldWrapper(AssessmentViewModel viewModel) => Scaffold( backgroundColor: kcBackgroundColor, body: _buildScaffold(viewModel), ); Widget _buildScaffold(AssessmentViewModel viewModel) => Column( crossAxisAlignment: CrossAxisAlignment.start, children: _buildScaffoldChildren(viewModel), ); List _buildScaffoldChildren(AssessmentViewModel viewModel) => [_buildAppBar(viewModel), _buildExpandedBody(viewModel)]; Widget _buildAppBar(AssessmentViewModel viewModel) => LargeAppBar( onClose: viewModel.abort, showLanguageSelection: false, onPop: viewModel.previousQuestion, showBackButton: viewModel.currentQuestionIndex == 0 ? false : true, ); Widget _buildExpandedBody(AssessmentViewModel viewModel) => Expanded(child: _buildBodyWrapper(viewModel)); Widget _buildBodyWrapper(AssessmentViewModel viewModel) => Padding( padding: const EdgeInsets.symmetric(horizontal: 15), child: _buildAssessment(viewModel), ); Widget _buildAssessment(AssessmentViewModel viewModel) => PageView.builder( controller: viewModel.pageController, itemCount: viewModel.assessmentQuestions.length, physics: const NeverScrollableScrollPhysics(), itemBuilder: (cotext, index) => _buildBodyScroller( viewModel), ); Widget _buildBodyScroller( AssessmentViewModel viewModel) => SingleChildScrollView( child: _buildBody( viewModel), ); Widget _buildBody( AssessmentViewModel viewModel) => Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: _buildBodyChildren( viewModel), ); List _buildBodyChildren( AssessmentViewModel viewModel) =>[ verticalSpaceMedium, _buildTitleState( viewModel), verticalSpaceMedium, _buildAnswersState( viewModel), _buildContinueButtonWrapper( viewModel) ]; Widget _buildTitleState( AssessmentViewModel viewModel)=> viewModel.currentQuestionIndex == viewModel.assessmentQuestions.length ?Container(): _buildTitle(viewModel); Widget _buildTitle( AssessmentViewModel viewModel) => Text( 'Q${viewModel.currentQuestionIndex + 1}. ${viewModel.assessmentQuestions[viewModel.currentQuestionIndex].questionText} ', style: style16DG600, ); Widget _buildAnswersState( AssessmentViewModel viewModel)=> viewModel.currentQuestionIndex == viewModel.assessmentQuestions.length ?Container(): _buildAnswers(viewModel); Widget _buildAnswers( AssessmentViewModel viewModel) => ListView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: viewModel.assessmentQuestions[viewModel.currentQuestionIndex].options?.length, itemBuilder: (context, inner) => _buildAnswer( onTap: () => viewModel.setSelectedAnswer( question: viewModel.currentQuestionIndex + 1, option: viewModel.assessmentQuestions[viewModel.currentQuestionIndex].options?[inner]), title: viewModel.assessmentQuestions[viewModel.currentQuestionIndex].options?[inner].optionText ?? '', selected: viewModel.isSelectedAnswer( question: viewModel.currentQuestionIndex + 1, answer: viewModel .assessmentQuestions[viewModel.currentQuestionIndex ].options?[inner].optionText ?? ''), ), ); Widget _buildAnswer( {required String title, required bool selected, required GestureTapCallback onTap}) => CustomSmallRadioButton( title: title, onTap: onTap, selected: selected, ); Widget _buildContinueButtonWrapper( AssessmentViewModel viewModel) => Padding( padding: const EdgeInsets.only(bottom: 50), child: _buildContinueButton( viewModel), ); Widget _buildContinueButton( AssessmentViewModel viewModel) => CustomElevatedButton( height: 55, borderRadius: 12, foregroundColor: kcWhite, text: viewModel.currentQuestionIndex == viewModel.assessmentQuestions.length - 1 ? 'Finish Level' : 'Continue', backgroundColor: viewModel.selectedAnswers.containsKey('${viewModel.currentQuestionIndex + 1}') ? kcPrimaryColor : kcPrimaryColor.withOpacity(0.1), onTap: viewModel.selectedAnswers.containsKey('${viewModel.currentQuestionIndex + 1}') ? () => viewModel.nextQuestion() : null, ); }