import 'package:flutter/material.dart'; import 'package:flutter_contacts/flutter_contacts.dart'; import 'contact_service.dart'; class ContactState extends StatefulWidget { final Widget child; const ContactState({super.key, required this.child}); static _ContactStateState of(BuildContext context) { return context.dependOnInheritedWidgetOfExactType<_InheritedContactState>()!.data; } @override _ContactStateState createState() => _ContactStateState(); } class _ContactStateState extends State { final ContactService _contactService = ContactService(); List _contacts = []; bool _loading = true; double _scrollOffset = 0.0; Contact? _selfContact = Contact(); List get contacts => _contacts; bool get loading => _loading; double get scrollOffset => _scrollOffset; Contact? get selfContact => _selfContact; @override void initState() { super.initState(); _fetchContacts(); // Add listener for contact changes FlutterContacts.addListener(_onContactChange); } void _onContactChange() => _fetchContacts(); @override void dispose() { // Remove listener FlutterContacts.removeListener(_onContactChange); super.dispose(); } Future _fetchContacts() async { List contacts = await _contactService.fetchContacts(); debugPrint("Fetched ${contacts.length} contacts"); // Find selfContact before filtering _selfContact = contacts.firstWhere( (contact) => contact.displayName.toLowerCase() == "user", orElse: () => Contact(), ); if (_selfContact!.phones.isEmpty) { debugPrint("Self contact has no phone numbers"); _selfContact = null; } contacts = contacts.where((contact) => contact.phones.isNotEmpty).toList(); contacts.sort((a, b) => a.displayName.compareTo(b.displayName)); setState(() { _contacts = contacts; _loading = false; _selfContact = _selfContact; }); } Future addNewContact(Contact contact) async { await _contactService.addNewContact(contact); await _fetchContacts(); } void setScrollOffset(double offset) { setState(() { _scrollOffset = offset; }); } @override Widget build(BuildContext context) { return _InheritedContactState( data: this, child: widget.child, ); } } class _InheritedContactState extends InheritedWidget { final _ContactStateState data; const _InheritedContactState({required this.data, required super.child}); @override bool updateShouldNotify(_InheritedContactState oldWidget) => true; }