Rain/lib/app/ui/onboarding.dart
2025-05-28 17:42:15 +03:00

198 lines
4.6 KiB
Dart
Executable file

import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:rain/app/data/db.dart';
import 'package:rain/app/ui/geolocation.dart';
import 'package:rain/app/ui/widgets/button.dart';
import 'package:rain/main.dart';
import 'package:get/get.dart';
class OnBording extends StatefulWidget {
const OnBording({super.key});
@override
State<OnBording> createState() => _OnBordingState();
}
class _OnBordingState extends State<OnBording> {
late PageController pageController;
int pageIndex = 0;
@override
void initState() {
super.initState();
pageController = PageController(initialPage: 0);
}
@override
void dispose() {
pageController.dispose();
super.dispose();
}
void onBoardHome() {
settings.onboard = true;
isar.writeTxnSync(() => isar.settings.putSync(settings));
Get.off(
() => const SelectGeolocation(isStart: true),
transition: Transition.downToUp,
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: SafeArea(
child: Column(
children: [
_buildPageView(),
_buildDotIndicators(),
_buildActionButton(),
],
),
),
);
}
Widget _buildPageView() {
return Expanded(
child: PageView.builder(
controller: pageController,
itemCount: data.length,
onPageChanged: (index) {
setState(() {
pageIndex = index;
});
},
itemBuilder: (context, index) => OnboardContent(
image: data[index].image,
title: data[index].title,
description: data[index].description,
),
),
);
}
Widget _buildDotIndicators() {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: List.generate(
data.length,
(index) => Padding(
padding: const EdgeInsets.symmetric(horizontal: 5),
child: DotIndicator(isActive: index == pageIndex),
),
),
);
}
Widget _buildActionButton() {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8),
child: MyTextButton(
buttonName: pageIndex == data.length - 1 ? 'start'.tr : 'next'.tr,
onPressed: () {
if (pageIndex == data.length - 1) {
onBoardHome();
} else {
pageController.nextPage(
duration: const Duration(milliseconds: 300),
curve: Curves.ease,
);
}
},
),
);
}
}
class DotIndicator extends StatelessWidget {
const DotIndicator({super.key, this.isActive = false});
final bool isActive;
@override
Widget build(BuildContext context) {
return AnimatedContainer(
duration: const Duration(milliseconds: 300),
height: 8,
width: 8,
decoration: BoxDecoration(
color: isActive
? context.theme.colorScheme.secondary
: context.theme.colorScheme.secondaryContainer,
shape: BoxShape.circle,
),
);
}
}
class Onboard {
final String image, title, description;
Onboard({
required this.image,
required this.title,
required this.description,
});
}
final List<Onboard> data = [
Onboard(
image: 'assets/icons/Rain.png',
title: 'name'.tr,
description: 'description'.tr,
),
Onboard(
image: 'assets/icons/Design.png',
title: 'name2'.tr,
description: 'description2'.tr,
),
Onboard(
image: 'assets/icons/Team.png',
title: 'name3'.tr,
description: 'description3'.tr,
),
];
class OnboardContent extends StatelessWidget {
const OnboardContent({
super.key,
required this.image,
required this.title,
required this.description,
});
final String image, title, description;
@override
Widget build(BuildContext context) {
return Column(
children: [
Flexible(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(image, scale: 5),
Text(
title,
style: context.textTheme.titleLarge?.copyWith(
fontWeight: FontWeight.w600,
),
),
const Gap(10),
SizedBox(
width: 300,
child: Text(
description,
style: context.textTheme.labelLarge?.copyWith(fontSize: 14),
textAlign: TextAlign.center,
),
),
],
),
),
],
);
}
}