impl: trying to excecute UI idea
This commit is contained in:
parent
f4259a785e
commit
42cd53752b
|
@ -3,6 +3,8 @@ import 'package:rijig_mobile/core/utils/exportimportview.dart';
|
||||||
final router = GoRouter(
|
final router = GoRouter(
|
||||||
routes: [
|
routes: [
|
||||||
GoRoute(path: '/', builder: (context, state) => SplashScreen()),
|
GoRoute(path: '/', builder: (context, state) => SplashScreen()),
|
||||||
|
GoRoute(path: '/trashview', builder: (context, state) => TestRequestPickScreen()),
|
||||||
|
GoRoute(path: '/ordersumary', builder: (context, state) => OrderSummaryScreen()),
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: '/cmapview',
|
path: '/cmapview',
|
||||||
builder: (context, state) => CollectorRouteMapScreen(),
|
builder: (context, state) => CollectorRouteMapScreen(),
|
||||||
|
|
|
@ -24,3 +24,9 @@ export 'package:rijig_mobile/features/auth/presentation/screen/collector/cotp_sc
|
||||||
export 'package:rijig_mobile/features/auth/presentation/screen/collector/clogin_screen.dart';
|
export 'package:rijig_mobile/features/auth/presentation/screen/collector/clogin_screen.dart';
|
||||||
export 'package:rijig_mobile/features/home/presentation/screen/collector/pickup_history_screen.dart';
|
export 'package:rijig_mobile/features/home/presentation/screen/collector/pickup_history_screen.dart';
|
||||||
export 'package:rijig_mobile/features/pickup/presentation/screen/pickup_map_screen.dart';
|
export 'package:rijig_mobile/features/pickup/presentation/screen/pickup_map_screen.dart';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// remmovable
|
||||||
|
export 'package:rijig_mobile/features/home/presentation/components/cart_test_screen.dart';
|
||||||
|
export 'package:rijig_mobile/features/home/presentation/components/trash_testview.dart';
|
|
@ -0,0 +1,609 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_slidable/flutter_slidable.dart';
|
||||||
|
|
||||||
|
class OrderSummaryScreen extends StatefulWidget {
|
||||||
|
const OrderSummaryScreen({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<OrderSummaryScreen> createState() => _OrderSummaryScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _OrderSummaryScreenState extends State<OrderSummaryScreen> {
|
||||||
|
// List untuk menyimpan item yang dipilih
|
||||||
|
List<Map<String, dynamic>> selectedItems = [
|
||||||
|
{
|
||||||
|
'name': 'Plastik',
|
||||||
|
'price': 1000,
|
||||||
|
'quantity': 1.0,
|
||||||
|
'icon': Icons.local_drink,
|
||||||
|
'backgroundColor': Colors.blue.shade100,
|
||||||
|
'iconColor': Colors.blue,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'Kertas Campur',
|
||||||
|
'price': 700,
|
||||||
|
'quantity': 2.5,
|
||||||
|
'icon': Icons.description,
|
||||||
|
'backgroundColor': Colors.orange.shade100,
|
||||||
|
'iconColor': Colors.orange,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
void _removeItem(int index) {
|
||||||
|
setState(() {
|
||||||
|
selectedItems.removeAt(index);
|
||||||
|
});
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
SnackBar(
|
||||||
|
content: Text('Item berhasil dihapus'),
|
||||||
|
duration: Duration(seconds: 2),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _incrementQuantity(int index) {
|
||||||
|
setState(() {
|
||||||
|
selectedItems[index]['quantity'] += 2.5;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void _decrementQuantity(int index) {
|
||||||
|
setState(() {
|
||||||
|
if (selectedItems[index]['quantity'] > 0) {
|
||||||
|
selectedItems[index]['quantity'] =
|
||||||
|
(selectedItems[index]['quantity'] - 2.5).clamp(0.0, double.infinity);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void _showQuantityDialog(int index) {
|
||||||
|
TextEditingController controller = TextEditingController(
|
||||||
|
text: selectedItems[index]['quantity'].toString()
|
||||||
|
);
|
||||||
|
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return AlertDialog(
|
||||||
|
title: Text('Input Jumlah ${selectedItems[index]['name']}'),
|
||||||
|
content: TextField(
|
||||||
|
controller: controller,
|
||||||
|
keyboardType: TextInputType.numberWithOptions(decimal: true),
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: 'Jumlah (kg)',
|
||||||
|
border: OutlineInputBorder(),
|
||||||
|
suffixText: 'kg',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
onPressed: () => Navigator.pop(context),
|
||||||
|
child: Text('Batal'),
|
||||||
|
),
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
double? newQuantity = double.tryParse(controller.text);
|
||||||
|
if (newQuantity != null && newQuantity >= 0) {
|
||||||
|
setState(() {
|
||||||
|
selectedItems[index]['quantity'] = newQuantity;
|
||||||
|
});
|
||||||
|
Navigator.pop(context);
|
||||||
|
} else {
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
SnackBar(content: Text('Masukkan angka yang valid')),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Text('Simpan'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
double get totalWeight {
|
||||||
|
return selectedItems.fold(0.0, (sum, item) => sum + item['quantity']);
|
||||||
|
}
|
||||||
|
|
||||||
|
int get estimatedEarnings {
|
||||||
|
return selectedItems.fold<int>(0, (sum, item) =>
|
||||||
|
sum + ((item['price'] as int) * (item['quantity'] as double)).round().toInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
int get applicationFee {
|
||||||
|
return 550;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get estimatedIncome {
|
||||||
|
return estimatedEarnings - applicationFee;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: Colors.grey.shade50,
|
||||||
|
appBar: AppBar(
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
elevation: 0,
|
||||||
|
leading: IconButton(
|
||||||
|
icon: Icon(Icons.arrow_back, color: Colors.black),
|
||||||
|
onPressed: () => Navigator.pop(context),
|
||||||
|
),
|
||||||
|
title: Text(
|
||||||
|
'Detail Pesanan',
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontSize: 18,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
centerTitle: true,
|
||||||
|
),
|
||||||
|
body: Column(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
padding: EdgeInsets.all(16),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
// Header Jenis Sampah
|
||||||
|
Container(
|
||||||
|
width: double.infinity,
|
||||||
|
padding: EdgeInsets.all(16),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: Colors.grey.withValues(alpha:0.1),
|
||||||
|
spreadRadius: 1,
|
||||||
|
blurRadius: 4,
|
||||||
|
offset: Offset(0, 2),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.all(8),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.orange.shade100,
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
child: Icon(
|
||||||
|
Icons.delete_outline,
|
||||||
|
color: Colors.orange,
|
||||||
|
size: 20,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 12),
|
||||||
|
Text(
|
||||||
|
'Jenis Sampah',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Spacer(),
|
||||||
|
TextButton(
|
||||||
|
onPressed: () {
|
||||||
|
// Navigate back to selection screen
|
||||||
|
Navigator.pop(context);
|
||||||
|
},
|
||||||
|
child: Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Icon(Icons.add, color: Colors.blue, size: 16),
|
||||||
|
SizedBox(width: 4),
|
||||||
|
Text(
|
||||||
|
'Tambah',
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.blue,
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(height: 16),
|
||||||
|
|
||||||
|
// List Items dengan Slidable
|
||||||
|
...selectedItems.asMap().entries.map((entry) {
|
||||||
|
int index = entry.key;
|
||||||
|
Map<String, dynamic> item = entry.value;
|
||||||
|
|
||||||
|
return Padding(
|
||||||
|
padding: EdgeInsets.only(bottom: 12),
|
||||||
|
child: Slidable(
|
||||||
|
key: ValueKey(item['name']),
|
||||||
|
endActionPane: ActionPane(
|
||||||
|
motion: ScrollMotion(),
|
||||||
|
children: [
|
||||||
|
SlidableAction(
|
||||||
|
onPressed: (context) => _removeItem(index),
|
||||||
|
backgroundColor: Colors.red,
|
||||||
|
foregroundColor: Colors.white,
|
||||||
|
icon: Icons.delete,
|
||||||
|
label: 'Hapus',
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.all(12),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.grey.shade50,
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
border: Border.all(color: Colors.grey.shade200),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
// Icon
|
||||||
|
Container(
|
||||||
|
width: 40,
|
||||||
|
height: 40,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: item['backgroundColor'],
|
||||||
|
borderRadius: BorderRadius.circular(20),
|
||||||
|
),
|
||||||
|
child: Icon(
|
||||||
|
item['icon'],
|
||||||
|
color: item['iconColor'],
|
||||||
|
size: 20,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 12),
|
||||||
|
|
||||||
|
// Item info
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
item['name'],
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 4),
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.symmetric(
|
||||||
|
horizontal: 6,
|
||||||
|
vertical: 2,
|
||||||
|
),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.orange,
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
child: Text(
|
||||||
|
'Rp ${item['price']}/kg',
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white,
|
||||||
|
fontSize: 10,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 4),
|
||||||
|
// Delete icon placeholder (always there for consistent height)
|
||||||
|
SizedBox(
|
||||||
|
height: 16,
|
||||||
|
child: Icon(
|
||||||
|
Icons.delete_outline,
|
||||||
|
color: Colors.red,
|
||||||
|
size: 12,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
// Quantity controls
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
// Decrease button
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () => _decrementQuantity(index),
|
||||||
|
child: Container(
|
||||||
|
width: 28,
|
||||||
|
height: 28,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(6),
|
||||||
|
border: Border.all(color: Colors.grey.shade300),
|
||||||
|
),
|
||||||
|
child: Icon(
|
||||||
|
Icons.remove,
|
||||||
|
color: Colors.grey.shade600,
|
||||||
|
size: 16,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 8),
|
||||||
|
|
||||||
|
// Quantity display (clickable)
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () => _showQuantityDialog(index),
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.symmetric(
|
||||||
|
horizontal: 8,
|
||||||
|
vertical: 6,
|
||||||
|
),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(6),
|
||||||
|
border: Border.all(color: Colors.grey.shade300),
|
||||||
|
),
|
||||||
|
child: Text(
|
||||||
|
'${item['quantity'].toString().replaceAll('.0', '')} kg',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 12,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 8),
|
||||||
|
|
||||||
|
// Increase button
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () => _incrementQuantity(index),
|
||||||
|
child: Container(
|
||||||
|
width: 28,
|
||||||
|
height: 28,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.blue,
|
||||||
|
borderRadius: BorderRadius.circular(6),
|
||||||
|
),
|
||||||
|
child: Icon(
|
||||||
|
Icons.add,
|
||||||
|
color: Colors.white,
|
||||||
|
size: 16,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
|
||||||
|
SizedBox(height: 16),
|
||||||
|
|
||||||
|
// Total Weight
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.all(12),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.grey.shade100,
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.all(6),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.grey.shade300,
|
||||||
|
borderRadius: BorderRadius.circular(6),
|
||||||
|
),
|
||||||
|
child: Icon(
|
||||||
|
Icons.scale,
|
||||||
|
color: Colors.grey.shade700,
|
||||||
|
size: 16,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 12),
|
||||||
|
Text(
|
||||||
|
'Berat total',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
color: Colors.grey.shade700,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Spacer(),
|
||||||
|
Text(
|
||||||
|
'${totalWeight.toString().replaceAll('.0', '')} kg',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 20),
|
||||||
|
|
||||||
|
// Perkiraan Pendapatan
|
||||||
|
Container(
|
||||||
|
width: double.infinity,
|
||||||
|
padding: EdgeInsets.all(16),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: Colors.grey.withValues(alpha:0.1),
|
||||||
|
spreadRadius: 1,
|
||||||
|
blurRadius: 4,
|
||||||
|
offset: Offset(0, 2),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.all(8),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.orange.shade100,
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
child: Icon(
|
||||||
|
Icons.folder,
|
||||||
|
color: Colors.orange,
|
||||||
|
size: 20,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 12),
|
||||||
|
Text(
|
||||||
|
'Perkiraan Pendapatan',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(height: 16),
|
||||||
|
|
||||||
|
// Estimasi pembayaran
|
||||||
|
_buildIncomeRow(
|
||||||
|
'Estimasi pembayaran',
|
||||||
|
estimatedEarnings,
|
||||||
|
Colors.orange,
|
||||||
|
),
|
||||||
|
SizedBox(height: 8),
|
||||||
|
|
||||||
|
// Biaya jasa aplikasi
|
||||||
|
_buildIncomeRow(
|
||||||
|
'Biaya jasa aplikasi',
|
||||||
|
applicationFee,
|
||||||
|
Colors.orange,
|
||||||
|
showInfo: true,
|
||||||
|
),
|
||||||
|
SizedBox(height: 8),
|
||||||
|
|
||||||
|
// Estimasi pendapatan
|
||||||
|
_buildIncomeRow(
|
||||||
|
'Estimasi pendapatan',
|
||||||
|
estimatedIncome,
|
||||||
|
Colors.orange,
|
||||||
|
isBold: true,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
// Bottom Continue Button
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.all(16),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: Colors.grey.withValues(alpha:0.2),
|
||||||
|
spreadRadius: 1,
|
||||||
|
blurRadius: 10,
|
||||||
|
offset: Offset(0, -2),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: SizedBox(
|
||||||
|
width: double.infinity,
|
||||||
|
child: ElevatedButton(
|
||||||
|
onPressed: selectedItems.isNotEmpty ? () {
|
||||||
|
// Handle continue action
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
SnackBar(
|
||||||
|
content: Text('Lanjut ke proses selanjutnya'),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} : null,
|
||||||
|
style: ElevatedButton.styleFrom(
|
||||||
|
backgroundColor: selectedItems.isNotEmpty ? Colors.blue : Colors.grey,
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 16),
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Text(
|
||||||
|
'Lanjut',
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white,
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildIncomeRow(String title, int amount, Color color, {bool showInfo = false, bool isBold = false}) {
|
||||||
|
return Row(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.all(4),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: color,
|
||||||
|
borderRadius: BorderRadius.circular(10),
|
||||||
|
),
|
||||||
|
child: Icon(
|
||||||
|
Icons.currency_exchange,
|
||||||
|
color: Colors.white,
|
||||||
|
size: 12,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 8),
|
||||||
|
Expanded(
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
title,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: isBold ? FontWeight.w600 : FontWeight.w400,
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (showInfo) ...[
|
||||||
|
SizedBox(width: 4),
|
||||||
|
Icon(
|
||||||
|
Icons.info_outline,
|
||||||
|
color: Colors.blue,
|
||||||
|
size: 16,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
amount.toString(),
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: isBold ? FontWeight.w600 : FontWeight.w500,
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,501 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:rijig_mobile/core/router.dart';
|
||||||
|
import 'package:rijig_mobile/core/utils/guide.dart';
|
||||||
|
|
||||||
|
class TestRequestPickScreen extends StatefulWidget {
|
||||||
|
const TestRequestPickScreen({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<TestRequestPickScreen> createState() => _TestRequestPickScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _TestRequestPickScreenState extends State<TestRequestPickScreen> {
|
||||||
|
// Map untuk menyimpan quantity setiap item
|
||||||
|
Map<String, double> quantities = {
|
||||||
|
'Plastik': 1.0,
|
||||||
|
'Kertas Campur': 1.0,
|
||||||
|
'Kaca': 0.0,
|
||||||
|
'Minyak Jelantah': 0.0,
|
||||||
|
'Kaleng Alumunium': 0.0,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Map untuk menyimpan harga per kg
|
||||||
|
Map<String, int> prices = {
|
||||||
|
'Plastik': 1000,
|
||||||
|
'Kertas Campur': 700,
|
||||||
|
'Kaca': 300,
|
||||||
|
'Minyak Jelantah': 2500,
|
||||||
|
'Kaleng Alumunium': 3500,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Map untuk menyimpan icon data
|
||||||
|
Map<String, IconData> icons = {
|
||||||
|
'Plastik': Icons.local_drink,
|
||||||
|
'Kertas Campur': Icons.description,
|
||||||
|
'Kaca': Icons.wine_bar,
|
||||||
|
'Minyak Jelantah': Icons.opacity,
|
||||||
|
'Kaleng Alumunium': Icons.recycling,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Map untuk menyimpan warna background
|
||||||
|
Map<String, Color> backgroundColors = {
|
||||||
|
'Plastik': Colors.blue.shade100,
|
||||||
|
'Kertas Campur': Colors.orange.shade100,
|
||||||
|
'Kaca': Colors.red.shade100,
|
||||||
|
'Minyak Jelantah': Colors.orange.shade200,
|
||||||
|
'Kaleng Alumunium': Colors.green.shade100,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Map untuk menyimpan warna icon
|
||||||
|
Map<String, Color> iconColors = {
|
||||||
|
'Plastik': Colors.blue,
|
||||||
|
'Kertas Campur': Colors.orange,
|
||||||
|
'Kaca': Colors.red,
|
||||||
|
'Minyak Jelantah': Colors.orange.shade700,
|
||||||
|
'Kaleng Alumunium': Colors.green,
|
||||||
|
};
|
||||||
|
|
||||||
|
void _resetQuantity(String itemName) {
|
||||||
|
setState(() {
|
||||||
|
quantities[itemName] = 0.0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void _incrementQuantity(String itemName) {
|
||||||
|
setState(() {
|
||||||
|
quantities[itemName] = (quantities[itemName]! + 2.5);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void _decrementQuantity(String itemName) {
|
||||||
|
setState(() {
|
||||||
|
if (quantities[itemName]! > 0) {
|
||||||
|
quantities[itemName] = (quantities[itemName]! - 2.5).clamp(
|
||||||
|
0.0,
|
||||||
|
double.infinity,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void _showQuantityDialog(String itemName) {
|
||||||
|
TextEditingController controller = TextEditingController(
|
||||||
|
text: quantities[itemName]!.toString(),
|
||||||
|
);
|
||||||
|
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return AlertDialog(
|
||||||
|
title: Text('Input Jumlah $itemName'),
|
||||||
|
content: TextField(
|
||||||
|
controller: controller,
|
||||||
|
keyboardType: TextInputType.numberWithOptions(decimal: true),
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: 'Jumlah (kg)',
|
||||||
|
border: OutlineInputBorder(),
|
||||||
|
suffixText: 'kg',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
onPressed: () => Navigator.pop(context),
|
||||||
|
child: Text('Batal'),
|
||||||
|
),
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
double? newQuantity = double.tryParse(controller.text);
|
||||||
|
if (newQuantity != null && newQuantity >= 0) {
|
||||||
|
setState(() {
|
||||||
|
quantities[itemName] = newQuantity;
|
||||||
|
});
|
||||||
|
Navigator.pop(context);
|
||||||
|
} else {
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
SnackBar(content: Text('Masukkan angka yang valid')),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Text('Simpan'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
double get totalWeight {
|
||||||
|
return quantities.values.fold(0.0, (sum, quantity) => sum + quantity);
|
||||||
|
}
|
||||||
|
|
||||||
|
int get totalPrice {
|
||||||
|
int total = 0;
|
||||||
|
quantities.forEach((item, quantity) {
|
||||||
|
total += (prices[item]! * quantity).round();
|
||||||
|
});
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get totalItems {
|
||||||
|
return quantities.values.where((quantity) => quantity > 0).length;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: Colors.grey.shade50,
|
||||||
|
appBar: AppBar(
|
||||||
|
backgroundColor: whiteColor,
|
||||||
|
elevation: 0,
|
||||||
|
leading: IconButton(
|
||||||
|
icon: Icon(Icons.arrow_back, color: Colors.black),
|
||||||
|
onPressed: () => Navigator.pop(context),
|
||||||
|
),
|
||||||
|
title: Row(
|
||||||
|
children: [
|
||||||
|
Icon(Icons.location_on, color: Colors.grey),
|
||||||
|
SizedBox(width: 8),
|
||||||
|
Text(
|
||||||
|
'Purbalingga',
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Spacer(),
|
||||||
|
TextButton(
|
||||||
|
onPressed: () {},
|
||||||
|
child: Text('Ganti', style: TextStyle(color: Colors.blue)),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
body: Column(
|
||||||
|
children: [
|
||||||
|
// Header
|
||||||
|
Container(
|
||||||
|
width: double.infinity,
|
||||||
|
padding: EdgeInsets.all(16),
|
||||||
|
color: whiteColor,
|
||||||
|
child: Text(
|
||||||
|
'Pilih Sampah',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 18,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
// List Items
|
||||||
|
Expanded(
|
||||||
|
child: ListView.builder(
|
||||||
|
padding: EdgeInsets.all(16),
|
||||||
|
itemCount: quantities.keys.length,
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
String itemName = quantities.keys.elementAt(index);
|
||||||
|
double quantity = quantities[itemName]!;
|
||||||
|
int price = prices[itemName]!;
|
||||||
|
|
||||||
|
return Container(
|
||||||
|
margin: EdgeInsets.only(bottom: 12),
|
||||||
|
padding: EdgeInsets.all(16),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: whiteColor,
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: Colors.grey.withValues(alpha: 0.1),
|
||||||
|
spreadRadius: 1,
|
||||||
|
blurRadius: 4,
|
||||||
|
offset: Offset(0, 2),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
// Icon
|
||||||
|
Container(
|
||||||
|
width: 50,
|
||||||
|
height: 50,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: backgroundColors[itemName],
|
||||||
|
borderRadius: BorderRadius.circular(25),
|
||||||
|
),
|
||||||
|
child: Icon(
|
||||||
|
icons[itemName],
|
||||||
|
color: iconColors[itemName],
|
||||||
|
size: 24,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 16),
|
||||||
|
|
||||||
|
// Item info
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
itemName,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 4),
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.symmetric(
|
||||||
|
horizontal: 8,
|
||||||
|
vertical: 2,
|
||||||
|
),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.orange,
|
||||||
|
borderRadius: BorderRadius.circular(10),
|
||||||
|
),
|
||||||
|
child: Text(
|
||||||
|
'Rp $price/kg',
|
||||||
|
style: TextStyle(
|
||||||
|
color: whiteColor,
|
||||||
|
fontSize: 12,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
// Show delete icon when quantity > 0 (below price)
|
||||||
|
SizedBox(height: 4),
|
||||||
|
SizedBox(
|
||||||
|
height: 24, // Fixed height untuk consistency
|
||||||
|
child:
|
||||||
|
quantity > 0
|
||||||
|
? GestureDetector(
|
||||||
|
onTap: () => _resetQuantity(itemName),
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.all(4),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.red.shade50,
|
||||||
|
borderRadius: BorderRadius.circular(
|
||||||
|
4,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Icon(
|
||||||
|
Icons.delete_outline,
|
||||||
|
color: Colors.red,
|
||||||
|
size: 16,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: SizedBox(), // Empty space when no quantity
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
// Quantity controls or Add button
|
||||||
|
quantity > 0
|
||||||
|
? Row(
|
||||||
|
children: [
|
||||||
|
// Decrease button
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () => _decrementQuantity(itemName),
|
||||||
|
child: Container(
|
||||||
|
width: 32,
|
||||||
|
height: 32,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.red.shade50,
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
child: Icon(
|
||||||
|
Icons.remove,
|
||||||
|
color: Colors.red,
|
||||||
|
size: 20,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 12),
|
||||||
|
|
||||||
|
// Quantity display (clickable)
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () => _showQuantityDialog(itemName),
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.symmetric(
|
||||||
|
horizontal: 12,
|
||||||
|
vertical: 8,
|
||||||
|
),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: Border.all(
|
||||||
|
color: Colors.grey.shade300,
|
||||||
|
),
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
child: Text(
|
||||||
|
'${quantity.toString().replaceAll('.0', '')} kg',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 12),
|
||||||
|
|
||||||
|
// Increase button
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () => _incrementQuantity(itemName),
|
||||||
|
child: Container(
|
||||||
|
width: 32,
|
||||||
|
height: 32,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.blue.shade50,
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
child: Icon(
|
||||||
|
Icons.add,
|
||||||
|
color: Colors.blue,
|
||||||
|
size: 20,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
: Row(
|
||||||
|
children: [
|
||||||
|
// Add button when quantity is 0
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () => _incrementQuantity(itemName),
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.symmetric(
|
||||||
|
horizontal: 16,
|
||||||
|
vertical: 8,
|
||||||
|
),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.blue,
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
child: Text(
|
||||||
|
'Tambah',
|
||||||
|
style: TextStyle(
|
||||||
|
color: whiteColor,
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
// Bottom summary
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.all(16),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: whiteColor,
|
||||||
|
borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: Colors.grey.withValues(alpha: 0.2),
|
||||||
|
spreadRadius: 1,
|
||||||
|
blurRadius: 10,
|
||||||
|
offset: Offset(0, -2),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'$totalItems jenis ${totalWeight.toString().replaceAll('.0', '')} kg',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
color: Colors.grey.shade700,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 4),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'Est. ',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
color: Colors.grey.shade700,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.symmetric(
|
||||||
|
horizontal: 6,
|
||||||
|
vertical: 2,
|
||||||
|
),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.orange,
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
child: Text(
|
||||||
|
'Rp ${totalPrice.toString()}',
|
||||||
|
style: TextStyle(
|
||||||
|
color: whiteColor,
|
||||||
|
fontSize: 12,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(height: 4),
|
||||||
|
Text(
|
||||||
|
'Minimum total berat 3kg',
|
||||||
|
style: TextStyle(fontSize: 12, color: Colors.red),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 16),
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed:
|
||||||
|
totalWeight >= 3
|
||||||
|
? () {
|
||||||
|
// Handle continue action
|
||||||
|
router.push('/ordersumary');
|
||||||
|
// ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
// SnackBar(
|
||||||
|
// content: Text('Lanjut ke proses selanjutnya'),
|
||||||
|
// ),
|
||||||
|
// );
|
||||||
|
}
|
||||||
|
: null,
|
||||||
|
style: ElevatedButton.styleFrom(
|
||||||
|
backgroundColor:
|
||||||
|
totalWeight >= 3 ? Colors.blue : Colors.grey,
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 24, vertical: 12),
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Text(
|
||||||
|
'Lanjut',
|
||||||
|
style: TextStyle(
|
||||||
|
color: whiteColor,
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -71,10 +71,14 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.end,
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
IconButton(onPressed: ()=>router.push('/trashview'), icon: Icon(
|
||||||
Iconsax.notification_copy,
|
Iconsax.notification_copy,
|
||||||
color: primaryColor,
|
color: primaryColor,
|
||||||
),
|
),),
|
||||||
|
// Icon(
|
||||||
|
// Iconsax.notification_copy,
|
||||||
|
// color: primaryColor,
|
||||||
|
// ),
|
||||||
Gap(10),
|
Gap(10),
|
||||||
Icon(Iconsax.message_copy, color: primaryColor),
|
Icon(Iconsax.message_copy, color: primaryColor),
|
||||||
],
|
],
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gap/gap.dart';
|
||||||
|
import 'package:rijig_mobile/core/router.dart';
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
import 'package:rijig_mobile/core/utils/guide.dart';
|
import 'package:rijig_mobile/core/utils/guide.dart';
|
||||||
import 'package:rijig_mobile/widget/appbar.dart';
|
import 'package:rijig_mobile/widget/appbar.dart';
|
||||||
|
@ -66,17 +68,17 @@ class _SelectCollectorScreenState extends State<SelectCollectorScreen> {
|
||||||
backgroundColor: greyAbsolutColor,
|
backgroundColor: greyAbsolutColor,
|
||||||
child: Icon(Icons.person, color: whiteColor, size: 30),
|
child: Icon(Icons.person, color: whiteColor, size: 30),
|
||||||
),
|
),
|
||||||
const SizedBox(width: 12),
|
Gap(12),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text(collector.name, style: Tulisan.subheading()),
|
Text(collector.name, style: Tulisan.subheading()),
|
||||||
const SizedBox(height: 4),
|
Gap(4),
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.star, color: Colors.amber, size: 18),
|
Icon(Icons.star, color: Colors.amber, size: 18),
|
||||||
const SizedBox(width: 4),
|
Gap(4),
|
||||||
Text(
|
Text(
|
||||||
collector.rating.toStringAsFixed(1),
|
collector.rating.toStringAsFixed(1),
|
||||||
style: Tulisan.body(fontsize: 12),
|
style: Tulisan.body(fontsize: 12),
|
||||||
|
@ -88,11 +90,11 @@ class _SelectCollectorScreenState extends State<SelectCollectorScreen> {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
const SizedBox(height: 16),
|
Gap(16),
|
||||||
Text("Alamat:", style: Tulisan.body(fontsize: 13)),
|
Text("Alamat:", style: Tulisan.body(fontsize: 13)),
|
||||||
const SizedBox(height: 6),
|
Gap(6),
|
||||||
Text(collector.address, style: Tulisan.body(fontsize: 13)),
|
Text(collector.address, style: Tulisan.body(fontsize: 13)),
|
||||||
const SizedBox(height: 24),
|
Gap(24),
|
||||||
CardButtonOne(
|
CardButtonOne(
|
||||||
textButton: "Pilih",
|
textButton: "Pilih",
|
||||||
fontSized: 14,
|
fontSized: 14,
|
||||||
|
@ -102,7 +104,7 @@ class _SelectCollectorScreenState extends State<SelectCollectorScreen> {
|
||||||
horizontal: double.infinity,
|
horizontal: double.infinity,
|
||||||
vertical: 45,
|
vertical: 45,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Navigator.pop(context);
|
router.pop(context);
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
SnackBar(
|
SnackBar(
|
||||||
behavior: SnackBarBehavior.floating,
|
behavior: SnackBarBehavior.floating,
|
||||||
|
|
|
@ -374,6 +374,14 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.2"
|
version: "3.1.2"
|
||||||
|
flutter_slidable:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: flutter_slidable
|
||||||
|
sha256: ab7dbb16f783307c9d7762ede2593ce32c220ba2ba0fd540a3db8e9a3acba71a
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "4.0.0"
|
||||||
flutter_svg:
|
flutter_svg:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -26,6 +26,7 @@ dependencies:
|
||||||
flutter_map: ^8.1.1
|
flutter_map: ^8.1.1
|
||||||
flutter_screenutil: ^5.9.3
|
flutter_screenutil: ^5.9.3
|
||||||
flutter_secure_storage: ^9.2.4
|
flutter_secure_storage: ^9.2.4
|
||||||
|
flutter_slidable: ^4.0.0
|
||||||
flutter_svg: ^2.1.0
|
flutter_svg: ^2.1.0
|
||||||
gap: ^3.0.1
|
gap: ^3.0.1
|
||||||
geolocator: ^14.0.0
|
geolocator: ^14.0.0
|
||||||
|
|
Loading…
Reference in New Issue