Added: add_edit_contact_screen.dart

This commit is contained in:
Hadi Mottale 2025-06-11 16:19:34 +03:30
parent 9fd956814d
commit 7a361b256a
1 changed files with 133 additions and 0 deletions

View File

@ -0,0 +1,133 @@
import 'package:flutter/material.dart';
import 'package:contacts_dataist_ir/models/contact.dart';
import 'package:contacts_dataist_ir/database/database_helper.dart';
class AddEditContactScreen extends StatefulWidget {
final Contact? contact; // Optional: if editing an existing contact
const AddEditContactScreen({super.key, this.contact});
@override
State<AddEditContactScreen> createState() => _AddEditContactScreenState();
}
class _AddEditContactScreenState extends State<AddEditContactScreen> {
final _formKey = GlobalKey<FormState>(); // Key for form validation
final DatabaseHelper _dbHelper = DatabaseHelper();
late TextEditingController _nameController;
late TextEditingController _phoneController;
late TextEditingController _emailController;
late TextEditingController _addressController;
late TextEditingController _companyController;
late TextEditingController _notesController;
@override
void initState() {
super.initState();
_nameController = TextEditingController(text: widget.contact?.name ?? '');
_phoneController = TextEditingController(text: widget.contact?.phone ?? '');
_emailController = TextEditingController(text: widget.contact?.email ?? '');
_addressController = TextEditingController(text: widget.contact?.address ?? '');
_companyController = TextEditingController(text: widget.contact?.company ?? '');
_notesController = TextEditingController(text: widget.contact?.notes ?? '');
}
@override
void dispose() {
_nameController.dispose();
_phoneController.dispose();
_emailController.dispose();
_addressController.dispose();
_companyController.dispose();
_notesController.dispose();
super.dispose();
}
Future<void> _saveContact() async {
if (_formKey.currentState!.validate()) {
final isEditing = widget.contact != null;
final Contact contact = Contact(
id: isEditing ? widget.contact!.id : null,
name: _nameController.text,
phone: _phoneController.text.isEmpty ? null : _phoneController.text,
email: _emailController.text.isEmpty ? null : _emailController.text,
address: _addressController.text.isEmpty ? null : _addressController.text,
company: _companyController.text.isEmpty ? null : _companyController.text,
notes: _notesController.text.isEmpty ? null : _notesController.text,
);
try {
if (isEditing) {
await _dbHelper.updateContact(contact);
} else {
await _dbHelper.insertContact(contact);
}
if (mounted) { // Check if the widget is still mounted before navigating
Navigator.pop(context, true); // Pop with 'true' indicating success
}
} catch (e) {
print('Error saving contact: $e');
// TODO: Show an error message to the user
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.contact == null ? 'Add New Contact' : 'Edit Contact'),
backgroundColor: Theme.of(context).colorScheme.primary,
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Form(
key: _formKey,
child: ListView(
children: <Widget>[
TextFormField(
controller: _nameController,
decoration: const InputDecoration(labelText: 'Name *'),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter a name';
}
return null;
},
),
TextFormField(
controller: _phoneController,
decoration: const InputDecoration(labelText: 'Phone'),
keyboardType: TextInputType.phone,
),
TextFormField(
controller: _emailController,
decoration: const InputDecoration(labelText: 'Email'),
keyboardType: TextInputType.emailAddress,
),
TextFormField(
controller: _addressController,
decoration: const InputDecoration(labelText: 'Address'),
),
TextFormField(
controller: _companyController,
decoration: const InputDecoration(labelText: 'Company'),
),
TextFormField(
controller: _notesController,
decoration: const InputDecoration(labelText: 'Notes'),
maxLines: 3,
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _saveContact,
child: Text(widget.contact == null ? 'Save Contact' : 'Update Contact'),
),
],
),
),
),
);
}
}