import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; import '../../utils/logic/PreferencesService.dart'; // For Haptic Feedback class StartPage extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'PIN Input', home: PinInputScreen(), ); } } class PinInputScreen extends StatefulWidget { @override _PinInputScreenState createState() => _PinInputScreenState(); } class _PinInputScreenState extends State { String _pin = ''; static const int pinLength = 4; @override void initState() { super.initState(); _checkPinStatus(); } Future _checkPinStatus() async { bool pinEnabled = await PreferencesService() .isPinEnabled(); // Adjust with actual implementation if (!pinEnabled) { // If no PIN is enabled, navigate to the "/first" route. // Navigator context will be available after the widget build. Future.microtask(() => context.go("/first")); } } // This method would be your actual method for checking the pin // Replace with your actual method from PreferencesService Future checkPin(int pin) async { bool pinRight = await PreferencesService().checkPin(pin); return pinRight; } void _onNumberTap(int number) { if (_pin.length < pinLength) { setState(() { _pin += number.toString(); }); if (_pin.length == pinLength) { _validatePin(); } } } Future _validatePin() async { bool correct = await checkPin(int.parse(_pin)); if (correct) { print("Right"); context.go("/first"); // Perform any actions you need on successful pin entry } else { // Handle wrong pin entry, e.g., reset pin, show error, etc. print("Wrong PIN"); } // Resetting the PIN for this example, you might want to do this differently setState(() { _pin = ''; }); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.grey.shade200, // Light gray background body: Container( decoration: BoxDecoration( gradient: LinearGradient( colors: [Colors.grey, Colors.red.shade100], begin: Alignment.topLeft, end: Alignment.bottomRight, ), ), child: Center( child: Container( height: 600, width: 400, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(50))), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Welcome Back!', style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold)), SizedBox(height: 20), Row( mainAxisSize: MainAxisSize.min, children: List.generate(pinLength, (index) { return Container( margin: EdgeInsets.all(4), width: 15, height: 15, decoration: BoxDecoration( color: _pin.length > index ? Colors.black : Colors.transparent, border: Border.all(color: Colors.grey), borderRadius: BorderRadius.circular(15), ), ); }), ), SizedBox(height: 20), ..._buildNumberPad(), ], ), ), ), ), ); } List _buildNumberPad() { List numbers = List.generate(9, (index) => index + 1); List rows = []; // First three rows (1-9) for (var i = 0; i < 3; i++) { rows.add( Row( mainAxisAlignment: MainAxisAlignment.center, children: numbers.skip(i * 3).take(3).map((number) { return _buildNumberButton(number); }).toList(), ), ); } // Last row with 0 rows.add( Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Container(width: 70), // Empty container to align 0 in center _buildNumberButton(0), Container(width: 70), // Empty container to align 0 in center ], ), ); return rows; } Widget _buildNumberButton(int number) { return GestureDetector( onTap: () => _onNumberTap(number), onTapDown: (_) => HapticFeedback.lightImpact(), // Cool haptic feedback on tap child: Container( width: 70, height: 70, margin: EdgeInsets.all(10), decoration: BoxDecoration( border: Border.all(color: Colors.black), borderRadius: BorderRadius.circular(35), ), child: Center( child: Text( number.toString(), style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold), ), ), ), ); } }