lib/
├── main.dart
├── models/
│ └── expense.dart
└── screens/
├── login_screen.dart
├── register_screen.dart
├── home_screen.dart
└── expense_list_screen.dart
import 'package:flutter/material.dart';
import 'screens/login_screen.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Aplikasi Pengeluaran',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
),
home: const LoginScreen(), // Halaman pertama
);
}
}
import 'package:flutter/material.dart';
import 'register_screen.dart';
import 'home_screen.dart';
class LoginScreen extends StatelessWidget {
const LoginScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Masuk'),
backgroundColor: Colors.blue,
),
body: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// Logo aplikasi
Container(
width: 100,
height: 100,
decoration: BoxDecoration(
color: Colors.blue,
shape: BoxShape.circle,
),
child: Icon(Icons.person, size: 50, color: Colors.white),
),
SizedBox(height: 32),
// Field username
TextField(
decoration: InputDecoration(
labelText: 'Username',
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.person),
),
),
SizedBox(height: 16),
// Field password
TextField(
obscureText: true,
decoration: InputDecoration(
labelText: 'Password',
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.lock),
),
),
SizedBox(height: 24),
// Tombol login
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: () {
// Navigasi ke HomeScreen dengan pushReplacement
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const HomeScreen()),
);
},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.blue,
padding: EdgeInsets.symmetric(vertical: 16),
),
child: Text(
'MASUK',
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
),
),
SizedBox(height: 16),
// Link ke halaman register
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("Belum punya akun? "),
TextButton(
onPressed: () {
// Navigasi ke RegisterScreen dengan push
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const RegisterScreen()),
);
},
child: Text('Daftar'),
),
],
),
],
),
),
);
}
}
1. Navigasi ke Register (menggunakan push
)
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const RegisterScreen()),
);
push
: Pengguna harus bisa kembali ke halaman login jika berubah pikiran2. Navigasi ke Home (menggunakan pushReplacement
)
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const HomeScreen()),
);
pushReplacement
: Setelah login sukses, pengguna tidak boleh kembali ke halaman login secara tidak sengajaimport 'package:flutter/material.dart';
import 'home_screen.dart';
class RegisterScreen extends StatelessWidget {
const RegisterScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Daftar'),
backgroundColor: Colors.blue,
),
body: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// Form fields...
// Tombol register
ElevatedButton(
onPressed: () {
// Navigasi ke HomeScreen dengan pushReplacement
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const HomeScreen()),
);
},
child: Text('DAFTAR'),
),
// Link kembali ke login
TextButton(
onPressed: () {
Navigator.pop(context); // Kembali ke LoginScreen
},
child: Text('Sudah punya akun? Masuk'),
),
],
),
),
);
}
}