Voici une version de cette application d'urgence développée avec Flutter :
```dart
import 'package:flutter/material.dart';
void main() => runApp(EmergencyApp());
class EmergencyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Emergency Connect',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: HomeScreen(),
);
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> with SingleTickerProviderStateMixin {
late TabController _tabController;
final List<EmergencyGroup> _groups = [];
final List<EmergencyMessage> _messages = [];
@override
void initState() {
super.initState();
_tabController = TabController(length: 3, vsync: this);
void _sendEmergencyAlert() {
final newMessage = EmergencyMessage(
content: '🚨 ALERTE URGENTE! J\'ai besoin d\'aide immédiate!',
group: 'urgence-générale',
timestamp: DateTime.now(),
);
setState(() {
_messages.add(newMessage);
});
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Alerte envoyée à tous les contacts!'),
duration: Duration(seconds: 2),
),
);
void _createNewGroup() async {
final TextEditingController nameController = TextEditingController();
bool isPrivate = true;
await showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Créer un groupe'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextField(
controller: nameController,
decoration: InputDecoration(labelText: 'Nom du groupe'),
),
SwitchListTile(
title: Text('Groupe privé'),
value: isPrivate,
onChanged: (value) => isPrivate = value,
),
],
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: Text('Annuler'),
),
ElevatedButton(
onPressed: () {
if (nameController.text.isNotEmpty) {
setState(() {
_groups.add(EmergencyGroup(
name: nameController.text,
isPrivate: isPrivate,
members: ['Moi', 'Contact 1', 'Contact 2'],
));
});
Navigator.pop(context);
},
child: Text('Créer'),
),
],
),
);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Emergency Connect'),
bottom: TabBar(
controller: _tabController,
tabs: [
Tab(icon: Icon(Icons.warning), text: 'Urgence'),
Tab(icon: Icon(Icons.group), text: 'Groupes'),
Tab(icon: Icon(Icons.message), text: 'Messages'),
],
),
),
body: TabBarView(
controller: _tabController,
children: [
_buildEmergencyTab(),
_buildGroupsTab(),
_buildMessagesTab(),
],
),
);
Widget _buildEmergencyTab() {
return Column(
children: [
SizedBox(height: 20),
ElevatedButton.icon(
icon: Icon(Icons.warning, size: 30),
label: Text('ALERTE GÉNÉRALE', style: TextStyle(fontSize: 20)),
style: ElevatedButton.styleFrom(
primary: Colors.red,
padding: EdgeInsets.symmetric(vertical: 20, horizontal: 30),
),
onPressed: _sendEmergencyAlert,
),
SizedBox(height: 20),
Expanded(
child: ListView(
children: [
ListTile(
leading: Icon(Icons.person),
title: Text('Contact d\'urgence 1'),
subtitle: Text('Dernière connexion: il y a 2 min'),
),
ListTile(
leading: Icon(Icons.person),
title: Text('Contact d\'urgence 2'),
subtitle: Text('En ligne'),
),
],
),
),
],
);
Widget _buildGroupsTab() {
return Column(
children: [
Padding(
padding: EdgeInsets.all(16.0),
child: ElevatedButton(
onPressed: _createNewGroup,
child: Text('Créer un nouveau groupe'),
),
),
Expanded(
child: ListView.builder(
itemCount: _groups.length,
itemBuilder: (context, index) => Card(
child: ListTile(
leading: Icon(_groups[index].isPrivate ? Icons.lock : Icons.public),
title: Text(_groups[index].name),
subtitle: Text('Membres: ${_groups[index].members.join(', ')}'),
),
),
),
),
],
);
Widget _buildMessagesTab() {
return ListView.builder(
reverse: true,
itemCount: _messages.length,
itemBuilder: (context, index) {
final message = _messages.reversed.toList()[index];
return Card(
child: ListTile(
leading: Icon(Icons.warning, color: Colors.red),
title: Text(message.content),
subtitle: Text('${_formatTime(message.timestamp)} - ${message.group}'),
),
);
},
);
String _formatTime(DateTime date) {
return '${date.hour}:${date.minute.toString().padLeft(2, '0')}';
class EmergencyGroup {
final String name;
final bool isPrivate;
final List<String> members;
EmergencyGroup({
required this.name,
required this.isPrivate,
required this.members,
});
class EmergencyMessage {
final String content;
final String group;
final DateTime timestamp;
EmergencyMessage({
required this.content,
required this.group,
required this.timestamp,
});
```
Cette version Flutter inclut :
1. **Structure principale** :
- Système d'onglets avec TabBar
- Design Material moderne
- Gestion d'état avec setState
2. **Fonctionnalités** :
- Bouton d'alerte d'urgence avec confirmation
- Création de groupes (publics/privés)
- Liste des messages d'urgence avec horodatage
- Liste des contacts d'urgence
- Interface responsive
3. **Composants clés** :
- Dialogues de création de groupe
- Cartes interactives pour les groupes
- Liste des messages inversée (plus récents en premier)
- Design cohérent avec les bonnes pratiques Material Design
Pour améliorer cette application, vous pourriez :
1. Ajouter une base de données locale avec Hive ou SQLite
2. Implémenter l'authentification avec Firebase
3. Ajouter des notifications push
4. Intégrer la géolocalisation
5. Ajouter des appels vocaux/VoIP
6. Implémenter le chiffrement des messages
Exécutez l'application avec :
```bash
flutter run
```
Assurez-vous d'ajouter les dépendances nécessaires dans `pubspec.yaml` selon les fonctionnalités que
vous ajouterez.