import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:shared_preferences/shared_preferences.dart'; class OnboardingPage extends StatefulWidget { const OnboardingPage({super.key}); @override State createState() => _OnboardingPageState(); } class _OnboardingPageState extends State { final PageController _pageController = PageController(); int _currentPage = 0; final List _pages = [ OnboardingItem( title: 'Welcome to LuckyChit', description: 'Your trusted digital platform for managing lottery-based Indian chit funds with ease and transparency.', icon: Icons.account_balance_wallet_rounded, color: Colors.green.shade600, ), OnboardingItem( title: 'Create & Manage Groups', description: 'Easily create chit fund groups, add members, and manage all aspects of your chit funds in one place.', icon: Icons.group_add_rounded, color: Colors.blue.shade600, ), OnboardingItem( title: 'Fair Lottery Draws', description: 'Conduct transparent lottery draws with beautiful animations and instant results for all members.', icon: Icons.casino_rounded, color: Colors.orange.shade600, ), OnboardingItem( title: 'Track Payments', description: 'Keep track of all payments, send reminders, and manage your finances with detailed payment history.', icon: Icons.payment_rounded, color: Colors.purple.shade600, ), ]; @override void dispose() { _pageController.dispose(); super.dispose(); } Future _completeOnboarding() async { final prefs = await SharedPreferences.getInstance(); await prefs.setBool('onboarding_complete', true); // Navigate to your main app (login or home) Get.offAllNamed('/'); // Adjust based on your routing } @override Widget build(BuildContext context) { return Scaffold( body: SafeArea( child: Column( children: [ // Skip Button if (_currentPage < _pages.length - 1) Align( alignment: Alignment.topRight, child: Padding( padding: EdgeInsets.all(16.w), child: TextButton( onPressed: _completeOnboarding, child: Text( 'Skip', style: TextStyle( fontSize: 16.sp, color: Colors.grey.shade600, fontWeight: FontWeight.w600, ), ), ), ), ) else SizedBox(height: 64.h), // PageView Expanded( child: PageView.builder( controller: _pageController, onPageChanged: (index) { setState(() { _currentPage = index; }); }, itemCount: _pages.length, itemBuilder: (context, index) { return _buildPage(_pages[index]); }, ), ), // Page Indicators _buildPageIndicators(), SizedBox(height: 32.h), // Navigation Button Padding( padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 16.h), child: SizedBox( width: double.infinity, height: 56.h, child: ElevatedButton( onPressed: () { if (_currentPage == _pages.length - 1) { _completeOnboarding(); } else { _pageController.nextPage( duration: const Duration(milliseconds: 300), curve: Curves.easeInOut, ); } }, style: ElevatedButton.styleFrom( backgroundColor: _pages[_currentPage].color, foregroundColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16.r), ), elevation: 2, ), child: Text( _currentPage == _pages.length - 1 ? 'Get Started' : 'Next', style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.w600, ), ), ), ), ), SizedBox(height: 16.h), ], ), ), ); } Widget _buildPage(OnboardingItem item) { return Padding( padding: EdgeInsets.symmetric(horizontal: 32.w), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ // Icon with animation TweenAnimationBuilder( key: ValueKey(_currentPage), tween: Tween(begin: 0.0, end: 1.0), duration: const Duration(milliseconds: 600), curve: Curves.easeOutBack, builder: (context, value, child) { return Transform.scale( scale: value, child: child, ); }, child: Container( width: 160.w, height: 160.h, decoration: BoxDecoration( color: item.color.withOpacity(0.1), shape: BoxShape.circle, ), child: Icon( item.icon, size: 80.w, color: item.color, ), ), ), SizedBox(height: 48.h), // Title TweenAnimationBuilder( key: ValueKey('title_$_currentPage'), tween: Tween(begin: 0.0, end: 1.0), duration: const Duration(milliseconds: 800), curve: Curves.easeOut, builder: (context, value, child) { return Opacity( opacity: value, child: Transform.translate( offset: Offset(0, 20 * (1 - value)), child: child, ), ); }, child: Text( item.title, style: TextStyle( fontSize: 28.sp, fontWeight: FontWeight.bold, color: item.color, ), textAlign: TextAlign.center, ), ), SizedBox(height: 16.h), // Description TweenAnimationBuilder( key: ValueKey('desc_$_currentPage'), tween: Tween(begin: 0.0, end: 1.0), duration: const Duration(milliseconds: 1000), curve: Curves.easeOut, builder: (context, value, child) { return Opacity( opacity: value, child: Transform.translate( offset: Offset(0, 20 * (1 - value)), child: child, ), ); }, child: Text( item.description, style: TextStyle( fontSize: 16.sp, color: Colors.grey.shade700, height: 1.6, ), textAlign: TextAlign.center, ), ), ], ), ); } Widget _buildPageIndicators() { return Row( mainAxisAlignment: MainAxisAlignment.center, children: List.generate( _pages.length, (index) { return AnimatedContainer( duration: const Duration(milliseconds: 300), margin: EdgeInsets.symmetric(horizontal: 4.w), width: _currentPage == index ? 32.w : 8.w, height: 8.h, decoration: BoxDecoration( color: _currentPage == index ? _pages[_currentPage].color : Colors.grey.shade300, borderRadius: BorderRadius.circular(4.r), ), ); }, ), ); } } class OnboardingItem { final String title; final String description; final IconData icon; final Color color; OnboardingItem({ required this.title, required this.description, required this.icon, required this.color, }); }