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 createState() => _OnBordingState(); } class _OnBordingState extends State { 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 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, ), ), ], ), ), ], ); } }