First Commit
This commit is contained in:
@@ -0,0 +1,215 @@
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:furibase/components/bottom_navbar.dart';
|
||||
import 'package:furibase/components/main_menu.dart';
|
||||
import 'package:furibase/components/scan_button.dart';
|
||||
import 'package:image_picker/image_picker.dart';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:image_picker_web/image_picker_web.dart';
|
||||
import 'package:flutter/foundation.dart' show kIsWeb;
|
||||
|
||||
class ProfileScreen extends StatefulWidget {
|
||||
@override
|
||||
_ProfileScreenState createState() => _ProfileScreenState();
|
||||
}
|
||||
|
||||
class _ProfileScreenState extends State<ProfileScreen> {
|
||||
// File? _profileImage;
|
||||
// File? _headerImage;
|
||||
// final ImagePicker _picker = ImagePicker();
|
||||
dynamic _profileImage;
|
||||
dynamic _headerImage;
|
||||
final ImagePicker _picker = ImagePicker();
|
||||
|
||||
Future<void> _pickImage(bool isProfile) async {
|
||||
if (kIsWeb) {
|
||||
Uint8List? bytesFromPicker = await ImagePickerWeb.getImageAsBytes();
|
||||
if (bytesFromPicker != null) {
|
||||
setState(() {
|
||||
if (isProfile) {
|
||||
_profileImage = bytesFromPicker;
|
||||
} else {
|
||||
_headerImage = bytesFromPicker;
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
final pickedFile = await _picker.pickImage(source: ImageSource.gallery);
|
||||
if (pickedFile != null) {
|
||||
setState(() {
|
||||
if (isProfile) {
|
||||
_profileImage = File(pickedFile.path);
|
||||
} else {
|
||||
_headerImage = File(pickedFile.path);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: const Color.fromARGB(255, 159, 156, 156),
|
||||
body: Stack(
|
||||
children: [
|
||||
Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
bottom: 0,
|
||||
left: 0,
|
||||
right: 0,
|
||||
child: SizedBox(height: 85, child: BottomNavbar()),
|
||||
),
|
||||
],
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
// Header image (bisa diubah)
|
||||
GestureDetector(
|
||||
onTap: () => _pickImage(false),
|
||||
child: Stack(
|
||||
children: [
|
||||
Container(
|
||||
height: 200,
|
||||
width: double.infinity,
|
||||
|
||||
// decoration: BoxDecoration(
|
||||
// image:
|
||||
// _headerImage != null
|
||||
// ? DecorationImage(
|
||||
// image: FileImage(_headerImage!),
|
||||
// fit: BoxFit.cover,
|
||||
// )
|
||||
// : DecorationImage(
|
||||
// image: AssetImage('images/background.jpeg'),
|
||||
// fit: BoxFit.cover,
|
||||
// ),
|
||||
// ),
|
||||
decoration: BoxDecoration(
|
||||
image: DecorationImage(
|
||||
image:
|
||||
_headerImage != null
|
||||
? (kIsWeb
|
||||
? MemoryImage(_headerImage)
|
||||
as ImageProvider
|
||||
: FileImage(_headerImage)
|
||||
as ImageProvider)
|
||||
: AssetImage('images/background.jpeg'),
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
),
|
||||
// Positioned(
|
||||
// top: 10,
|
||||
// left: 10,
|
||||
// child: Text(
|
||||
// "Saya",
|
||||
// style: TextStyle(
|
||||
// color: Colors.white,
|
||||
// fontSize: 24,
|
||||
// fontWeight: FontWeight.bold,
|
||||
// ),
|
||||
// ),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(height: 80),
|
||||
Expanded(
|
||||
child: ListView(
|
||||
padding: EdgeInsets.symmetric(horizontal: 20),
|
||||
children: [
|
||||
_buildListItem(Icons.person, "Akun"),
|
||||
_buildListItem(Icons.person, "Data Diri"),
|
||||
_buildListItem(
|
||||
Icons.lock,
|
||||
"Kata Sandi",
|
||||
), // bisa diubah disini
|
||||
_buildListItem(Icons.language, "Bahasa"),
|
||||
_buildListItem(Icons.logout, "Keluar", isLogout: true),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
// Profile Picture (bisa diubah)
|
||||
Positioned(
|
||||
top: 140,
|
||||
left: MediaQuery.of(context).size.width / 2 - 50,
|
||||
child: GestureDetector(
|
||||
onTap: () => _pickImage(true),
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomRight,
|
||||
children: [
|
||||
// CircleAvatar(
|
||||
// radius: 50,
|
||||
// backgroundColor: Colors.grey[300],
|
||||
// backgroundImage:
|
||||
// _profileImage != null
|
||||
// ? FileImage(_profileImage!)
|
||||
// : null,
|
||||
// child:
|
||||
// _profileImage == null
|
||||
// ? Icon(Icons.person, size: 50, color: Colors.white)
|
||||
// : null,
|
||||
// ),
|
||||
// CircleAvatar(
|
||||
// radius: 15,
|
||||
// backgroundColor: Colors.blue,
|
||||
// child: Icon(Icons.edit, color: Colors.white, size: 15),
|
||||
// ),
|
||||
CircleAvatar(
|
||||
radius: 50,
|
||||
backgroundColor: Colors.grey[300],
|
||||
backgroundImage:
|
||||
_profileImage != null
|
||||
? (kIsWeb
|
||||
? MemoryImage(_profileImage) as ImageProvider
|
||||
: FileImage(_profileImage) as ImageProvider)
|
||||
: null,
|
||||
child:
|
||||
_profileImage == null
|
||||
? Icon(Icons.person, size: 50, color: Colors.white)
|
||||
: null,
|
||||
),
|
||||
CircleAvatar(
|
||||
radius: 15,
|
||||
backgroundColor: Colors.blue,
|
||||
child: Icon(Icons.edit, color: Colors.white, size: 15),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
// Bottom Navigation Bar
|
||||
Positioned(bottom: 0, left: 0, right: 0, child: MainMenu()),
|
||||
Positioned(
|
||||
bottom: 1,
|
||||
left: MediaQuery.of(context).size.width / 2 - 48,
|
||||
child: Transform.translate(
|
||||
offset: Offset(0, -20),
|
||||
child: ScanButton(),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildListItem(IconData icon, String label, {bool isLogout = false}) {
|
||||
return ListTile(
|
||||
leading: Icon(
|
||||
icon,
|
||||
color:
|
||||
isLogout
|
||||
? const Color.fromARGB(255, 181, 47, 47)
|
||||
: const Color.fromARGB(255, 255, 255, 255),
|
||||
),
|
||||
title: Text(label, style: TextStyle(fontSize: 16, color: Colors.black)),
|
||||
trailing: Icon(Icons.arrow_forward_ios, size: 16),
|
||||
onTap: () {},
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user