Files
Remever/lib/screens/training/training_screen.dart

207 lines
5.7 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:remever/common/resources.dart';
import 'package:remever/common/widgets/typography.dart';
import 'package:remever/common/widgets/w_if.dart';
import 'package:remever/common/widgets/wspace.dart';
import 'package:remever/components/extensions/context.dart';
import 'package:remever/components/extensions/state.dart';
import 'package:remever/models/training_dto.dart';
import 'package:remever/screens/training/cubit/training_cubit.dart';
import 'package:remever/screens/training/states/empty.dart';
import 'package:remever/screens/training/states/loading.dart';
import 'package:remever/screens/training/widgets/training_ticket.dart';
import 'package:remever/widgets/primary_button.dart';
@RoutePage()
class TrainingScreen extends StatelessWidget {
const TrainingScreen({super.key});
@override
Widget build(BuildContext context) {
return BlocProvider<TrainingCubit>(
create: (BuildContext context) => TrainingCubit(),
child: _buildMain(),
);
}
///
/// Построение основного блока
///
Widget _buildMain() {
return PopScope(
canPop: false,
child: BlocBuilder<TrainingCubit, TrainingState>(
builder: (BuildContext context, state) {
return state.when(
loading: () => TrainingLoading(),
empty: () => TrainingEmpty(),
data: (data) => TrainingData(data: data),
result: () => Placeholder(),
);
},
),
);
}
}
class TrainingData extends StatefulWidget {
const TrainingData({super.key, required this.data});
final List<TrainingDto> data;
@override
State<TrainingData> createState() => _TrainingDataState();
}
class _TrainingDataState extends State<TrainingData> {
bool _showAnswer = false;
int _currentTicketIndex = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.bg,
appBar: _buildAppBar(context),
body: _buildMain(),
);
}
/// Построение шапки
AppBar _buildAppBar(BuildContext context) {
return AppBar(
backgroundColor: AppColors.white,
shadowColor: Colors.transparent,
leading: GestureDetector(
onTap: () => context.back(),
child: const Icon(Icons.close, color: Colors.black),
),
centerTitle: true,
title: AppTypography(
'Тренировка',
type: SemiBold20px(),
color: AppColors.body_text,
),
actions: [_buildCounter(), WSpace(16)],
);
}
Widget _buildCounter() {
return Center(
child: Container(
height: 24.h,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(100)).r,
color: AppColors.bg,
),
child: Padding(
padding: const EdgeInsets.all(3).r,
child: Center(
child: AppTypography(
'${_currentTicketIndex + 1} из ${widget.data.length}',
type: Regular14px(),
),
),
),
),
);
}
Widget _buildMain() {
return Column(
children: [_buildTickets(), _buildShowAnswerButton(), _buildActions()],
);
}
Widget _buildActions() {
return Padding(
padding: const EdgeInsets.all(16).r,
child: Row(
spacing: 8.r,
children: [
Flexible(
child: PrimaryButton(
onTap: () {
if (widget.data.length == _currentTicketIndex + 1) {
context.read<TrainingCubit>().toResultState();
return;
}
safeSetState(() => _currentTicketIndex++);
},
color: AppColors.danger,
child: AppTypography(
'Не помню',
type: Medium14px(),
color: Colors.white,
),
),
),
Flexible(
child: PrimaryButton(
child: AppTypography(
'Помню',
type: Medium14px(),
color: Colors.white,
),
onTap: () {
if (widget.data.length == _currentTicketIndex + 1) {
context.read<TrainingCubit>().toResultState();
return;
}
safeSetState(() => _currentTicketIndex++);
},
),
),
],
),
);
}
Widget _buildShowAnswerButton() {
return Wif(
condition: !_showAnswer,
builder:
(context) => PrimaryButton(
onTap: () {
safeSetState(() {
_showAnswer = true;
});
},
color: AppColors.secondary,
width: 170,
child: AppTypography(
'Показать ответ',
type: Medium14px(),
color: AppColors.primary,
),
),
);
}
Widget _buildTickets() {
return Expanded(
child: SingleChildScrollView(
physics: BouncingScrollPhysics(),
child: Padding(
padding: const EdgeInsets.all(16).r,
child: Column(
spacing: 8.r,
children: [
TrainingTicket(trainingDto: widget.data[_currentTicketIndex]),
Wif(
condition: _showAnswer,
builder:
(context) => TrainingTicket(
trainingDto: widget.data[_currentTicketIndex],
isAnswer: true,
),
),
],
),
),
),
);
}
}