Files
Remever/lib/screens/training/widgets/training_ticket.dart

146 lines
3.9 KiB
Dart

import 'dart:io';
import 'package:flutter/material.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/database/database.dart';
import 'package:remever/models/training_dto.dart';
class TrainingTicket extends StatelessWidget {
const TrainingTicket({
super.key,
this.isAnswer = false,
required this.trainingDto,
});
final TrainingDto trainingDto;
final bool isAnswer;
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12).r,
color: Colors.white,
),
constraints: BoxConstraints(minHeight: 50.h),
child: Stack(
children: [
SizedBox(
height: 90.h,
width: double.infinity,
child: DecoratedBox(decoration: getDecoration()),
),
Padding(
padding: const EdgeInsets.all(12).r,
child: Column(
children: [
_buildCollectionInfo(),
_buildImage(),
HSpace(4),
_buildText(context),
],
),
),
],
),
);
}
Widget _buildCollectionInfo() {
final collection = trainingDto.collection;
return Wif(
condition: !isAnswer && collection != null,
builder: (context) {
return Padding(
padding: const EdgeInsets.only(bottom: 8).r,
child: Row(
children: [
SizedBox(
height: 24.h,
width: 24.w,
child: Wif(
condition: collection!.image != null,
builder:
(context) => ClipOval(
child: Image.file(
File(collection.image!),
fit: BoxFit.cover,
),
),
fallback:
(context) => Center(
child: AppTypography(
collection.title.substring(0, 1),
type: Bold34px(),
),
),
),
),
WSpace(4),
AppTypography(
collection.title,
type: Regular14px(),
color: AppColors.disabled,
),
],
),
);
},
fallback: (context) => Row(children: []),
);
}
/// Декорирование контейнера
BoxDecoration getDecoration() {
return BoxDecoration(
borderRadius: BorderRadius.circular(12).r,
gradient: LinearGradient(
colors: [
isAnswer ? AppColors.answer : AppColors.question,
Colors.white,
],
begin: Alignment.topLeft,
end: const Alignment(-0.5, 1),
stops: const [0.25, 0.25],
),
);
}
Widget _buildText(BuildContext context) {
final ticket = trainingDto.ticket;
return AppTypography(
isAnswer ? ticket.answer : ticket.question,
maxLines: 99,
type: Regular14px(),
);
}
Widget _buildImage() {
final ticket = trainingDto.ticket;
final String? imagePath =
isAnswer ? ticket.answerImage : ticket.questionImage;
return Wif(
condition: imagePath != null,
builder:
(context) => Padding(
padding: const EdgeInsets.only(right: 8).r,
child: SizedBox.square(
dimension: 100.r,
child: ClipRRect(
borderRadius: BorderRadius.circular(8).r,
child: Image.file(File(imagePath!), fit: BoxFit.cover),
),
),
),
);
}
}