diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index ecc7e6a..7c59885 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -30,6 +30,10 @@
+
+
+
+
diff --git a/lib/assets/images/placeholder.png b/lib/assets/images/placeholder.png
new file mode 100644
index 0000000..bdd8aea
Binary files /dev/null and b/lib/assets/images/placeholder.png differ
diff --git a/lib/assets/images/profile_picture.png b/lib/assets/images/profile_picture.png
new file mode 100644
index 0000000..fb03def
Binary files /dev/null and b/lib/assets/images/profile_picture.png differ
diff --git a/lib/presentation/screens/dialogs/add_event_dialog.dart b/lib/presentation/screens/dialogs/add_event_dialog.dart
new file mode 100644
index 0000000..e895438
--- /dev/null
+++ b/lib/presentation/screens/dialogs/add_event_dialog.dart
@@ -0,0 +1,304 @@
+import 'package:flutter/material.dart';
+import 'package:google_maps_flutter/google_maps_flutter.dart';
+
+class AddEventDialog extends StatefulWidget {
+ const AddEventDialog({super.key});
+
+ @override
+ _AddEventDialogState createState() => _AddEventDialogState();
+}
+
+class _AddEventDialogState extends State {
+ final _formKey = GlobalKey();
+ String _title = '';
+ String _description = '';
+ DateTime? _selectedDate;
+ String? _imagePath;
+ String _location = '';
+ String _category = '';
+ String _link = '';
+ LatLng? _selectedLatLng;
+
+ @override
+ Widget build(BuildContext context) {
+ return Dialog(
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(15.0),
+ ),
+ backgroundColor: const Color(0xFF2C2C3E),
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Form(
+ key: _formKey,
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ _buildTitleField(),
+ const SizedBox(height: 10),
+ _buildDescriptionField(),
+ const SizedBox(height: 10),
+ _buildDatePicker(),
+ const SizedBox(height: 10),
+ _buildLocationField(context),
+ const SizedBox(height: 10),
+ _buildCategoryField(),
+ const SizedBox(height: 10),
+ _buildImagePicker(),
+ const SizedBox(height: 10),
+ _buildLinkField(),
+ const SizedBox(height: 20),
+ _buildSubmitButton(),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+
+ Widget _buildTitleField() {
+ return TextFormField(
+ decoration: InputDecoration(
+ labelText: 'Titre',
+ labelStyle: const TextStyle(color: Colors.white70),
+ filled: true,
+ fillColor: Colors.white.withOpacity(0.1),
+ border: const OutlineInputBorder(
+ borderRadius: BorderRadius.all(Radius.circular(10.0)),
+ borderSide: BorderSide.none,
+ ),
+ prefixIcon: const Icon(Icons.title, color: Colors.white70),
+ ),
+ style: const TextStyle(color: Colors.white),
+ validator: (value) {
+ if (value == null || value.isEmpty) {
+ return 'Veuillez entrer un titre';
+ }
+ return null;
+ },
+ onSaved: (value) {
+ _title = value ?? '';
+ },
+ );
+ }
+
+ Widget _buildDescriptionField() {
+ return TextFormField(
+ decoration: InputDecoration(
+ labelText: 'Description',
+ labelStyle: const TextStyle(color: Colors.white70),
+ filled: true,
+ fillColor: Colors.white.withOpacity(0.1),
+ border: const OutlineInputBorder(
+ borderRadius: BorderRadius.all(Radius.circular(10.0)),
+ borderSide: BorderSide.none,
+ ),
+ prefixIcon: const Icon(Icons.description, color: Colors.white70),
+ ),
+ style: const TextStyle(color: Colors.white),
+ maxLines: 3,
+ validator: (value) {
+ if (value == null || value.isEmpty) {
+ return 'Veuillez entrer une description';
+ }
+ return null;
+ },
+ onSaved: (value) {
+ _description = value ?? '';
+ },
+ );
+ }
+
+ Widget _buildDatePicker() {
+ return GestureDetector(
+ onTap: () async {
+ final DateTime? picked = await showDatePicker(
+ context: context,
+ initialDate: DateTime.now(),
+ firstDate: DateTime.now(),
+ lastDate: DateTime(2101),
+ );
+ if (picked != null && picked != _selectedDate) {
+ setState(() {
+ _selectedDate = picked;
+ });
+ }
+ },
+ child: Container(
+ padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 16.0),
+ decoration: BoxDecoration(
+ color: Colors.white.withOpacity(0.1),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(
+ _selectedDate == null
+ ? 'Sélectionnez une date'
+ : '${_selectedDate!.day}/${_selectedDate!.month}/${_selectedDate!.year}',
+ style: const TextStyle(color: Colors.white70),
+ ),
+ const Icon(Icons.calendar_today, color: Colors.white70),
+ ],
+ ),
+ ),
+ );
+ }
+
+ Widget _buildLocationField(BuildContext context) {
+ return GestureDetector(
+ onTap: () async {
+ final LatLng? pickedLocation = await Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const LocationPickerScreen(),
+ ),
+ );
+ if (pickedLocation != null) {
+ setState(() {
+ _selectedLatLng = pickedLocation;
+ _location = '${pickedLocation.latitude}, ${pickedLocation.longitude}';
+ });
+ }
+ },
+ child: Container(
+ padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 16.0),
+ decoration: BoxDecoration(
+ color: Colors.white.withOpacity(0.1),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(
+ _selectedLatLng == null
+ ? 'Sélectionnez une localisation'
+ : 'Localisation: $_location',
+ style: const TextStyle(color: Colors.white70),
+ ),
+ const Icon(Icons.location_on, color: Colors.white70),
+ ],
+ ),
+ ),
+ );
+ }
+
+ Widget _buildCategoryField() {
+ return TextFormField(
+ decoration: InputDecoration(
+ labelText: 'Catégorie',
+ labelStyle: const TextStyle(color: Colors.white70),
+ filled: true,
+ fillColor: Colors.white.withOpacity(0.1),
+ border: const OutlineInputBorder(
+ borderRadius: BorderRadius.all(Radius.circular(10.0)),
+ borderSide: BorderSide.none,
+ ),
+ prefixIcon: const Icon(Icons.category, color: Colors.white70),
+ ),
+ style: const TextStyle(color: Colors.white),
+ onSaved: (value) {
+ _category = value ?? '';
+ },
+ );
+ }
+
+ Widget _buildImagePicker() {
+ return GestureDetector(
+ onTap: () {
+ // Logique pour sélectionner une image
+ },
+ child: Container(
+ padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 16.0),
+ decoration: BoxDecoration(
+ color: Colors.white.withOpacity(0.1),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(
+ _imagePath == null ? 'Sélectionnez une image' : 'Image sélectionnée',
+ style: const TextStyle(color: Colors.white70),
+ ),
+ const Icon(Icons.image, color: Colors.white70),
+ ],
+ ),
+ ),
+ );
+ }
+
+ Widget _buildLinkField() {
+ return TextFormField(
+ decoration: InputDecoration(
+ labelText: 'Lien (optionnel)',
+ labelStyle: const TextStyle(color: Colors.white70),
+ filled: true,
+ fillColor: Colors.white.withOpacity(0.1),
+ border: const OutlineInputBorder(
+ borderRadius: BorderRadius.all(Radius.circular(10.0)),
+ borderSide: BorderSide.none,
+ ),
+ prefixIcon: const Icon(Icons.link, color: Colors.white70),
+ ),
+ style: const TextStyle(color: Colors.white),
+ onSaved: (value) {
+ _link = value ?? '';
+ },
+ );
+ }
+
+ Widget _buildSubmitButton() {
+ return ElevatedButton(
+ onPressed: () {
+ if (_formKey.currentState!.validate()) {
+ _formKey.currentState!.save();
+ // Logique pour soumettre les données
+ Navigator.of(context).pop();
+ }
+ },
+ style: ElevatedButton.styleFrom(
+ backgroundColor: const Color(0xFF1DBF73),
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ padding: const EdgeInsets.symmetric(vertical: 12.0),
+ minimumSize: const Size(double.infinity, 40),
+ ),
+ child: const Text('Ajouter l\'événement', style: TextStyle(color: Colors.white)),
+ );
+ }
+}
+
+class LocationPickerScreen extends StatelessWidget {
+ const LocationPickerScreen({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: const Text('Sélectionnez une localisation'),
+ backgroundColor: const Color(0xFF1E1E2C),
+ ),
+ body: GoogleMap(
+ initialCameraPosition: const CameraPosition(
+ target: LatLng(48.8566, 2.3522), // Paris par défaut
+ zoom: 12.0,
+ ),
+ markers: Set.of([
+ Marker(
+ markerId: const MarkerId('selectedLocation'),
+ position: LatLng(48.8566, 2.3522), // Position par défaut
+ draggable: true,
+ onDragEnd: (newPosition) {
+ Navigator.of(context).pop(newPosition);
+ },
+ )
+ ]),
+ onTap: (position) {
+ Navigator.of(context).pop(position);
+ },
+ ),
+ );
+ }
+}
diff --git a/lib/presentation/screens/event/event_card.dart b/lib/presentation/screens/event/event_card.dart
new file mode 100644
index 0000000..e727dce
--- /dev/null
+++ b/lib/presentation/screens/event/event_card.dart
@@ -0,0 +1,209 @@
+import 'package:flutter/material.dart';
+
+class EventCard extends StatelessWidget {
+ final String profileImage;
+ final String name;
+ final String datePosted;
+ final String eventTitle;
+ final String eventDescription;
+ final String eventImageUrl;
+ final int reactionsCount;
+ final int commentsCount;
+ final int sharesCount;
+ final VoidCallback onReact;
+ final VoidCallback onComment;
+ final VoidCallback onShare;
+ final VoidCallback onParticipate;
+ final VoidCallback onCloseEvent;
+ final VoidCallback onMoreOptions;
+
+ const EventCard({
+ Key? key,
+ required this.profileImage,
+ required this.name,
+ required this.datePosted,
+ required this.eventTitle,
+ required this.eventDescription,
+ required this.eventImageUrl,
+ required this.reactionsCount,
+ required this.commentsCount,
+ required this.sharesCount,
+ required this.onReact,
+ required this.onComment,
+ required this.onShare,
+ required this.onParticipate,
+ required this.onCloseEvent,
+ required this.onMoreOptions, required String assetImage,
+ }) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return Card(
+ color: const Color(0xFF2C2C3E),
+ margin: const EdgeInsets.symmetric(vertical: 10.0),
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(15.0),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(12.0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ _buildHeader(),
+ const SizedBox(height: 10),
+ _buildEventDetails(),
+ const SizedBox(height: 10),
+ _buildEventImage(),
+ const SizedBox(height: 10),
+ Divider(color: Colors.white.withOpacity(0.2)),
+ _buildInteractionRow(),
+ const SizedBox(height: 10),
+ _buildParticipateButton(),
+ ],
+ ),
+ ),
+ );
+ }
+
+ Widget _buildHeader() {
+ return Row(
+ children: [
+ CircleAvatar(
+ backgroundImage: AssetImage(profileImage),
+ radius: 25,
+ ),
+ const SizedBox(width: 10),
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ name,
+ style: const TextStyle(
+ color: Colors.white,
+ fontSize: 16,
+ fontWeight: FontWeight.bold,
+ ),
+ ),
+ Text(
+ datePosted,
+ style: const TextStyle(color: Colors.white70, fontSize: 14),
+ ),
+ ],
+ ),
+ ),
+ IconButton(
+ icon: const Icon(Icons.more_vert, color: Colors.white),
+ onPressed: onMoreOptions,
+ ),
+ IconButton(
+ icon: const Icon(Icons.close, color: Colors.white),
+ onPressed: onCloseEvent,
+ ),
+ ],
+ );
+ }
+
+ Widget _buildEventDetails() {
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ eventTitle,
+ style: const TextStyle(
+ color: Colors.white,
+ fontSize: 18,
+ fontWeight: FontWeight.bold,
+ ),
+ ),
+ const SizedBox(height: 5),
+ Text(
+ eventDescription,
+ style: const TextStyle(color: Colors.white70, fontSize: 14),
+ ),
+ ],
+ );
+ }
+
+ Widget _buildEventImage() {
+ return ClipRRect(
+ borderRadius: BorderRadius.circular(10.0),
+ child: Image.network(
+ eventImageUrl,
+ height: 180,
+ width: double.infinity,
+ fit: BoxFit.cover,
+ errorBuilder: (context, error, stackTrace) {
+ return Image.asset(
+ 'lib/assets/images/placeholder.png',
+ height: 180,
+ width: double.infinity,
+ fit: BoxFit.cover,
+ );
+ },
+ ),
+ );
+ }
+
+ Widget _buildInteractionRow() {
+ return Padding(
+ padding: const EdgeInsets.symmetric(vertical: 8.0),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ _buildIconButton(
+ icon: Icons.thumb_up_alt_outlined,
+ label: 'Réagir',
+ count: reactionsCount,
+ onPressed: onReact,
+ ),
+ _buildIconButton(
+ icon: Icons.comment_outlined,
+ label: 'Commenter',
+ count: commentsCount,
+ onPressed: onComment,
+ ),
+ _buildIconButton(
+ icon: Icons.share_outlined,
+ label: 'Partager',
+ count: sharesCount,
+ onPressed: onShare,
+ ),
+ ],
+ ),
+ );
+ }
+
+ Widget _buildIconButton({
+ required IconData icon,
+ required String label,
+ required int count,
+ required VoidCallback onPressed,
+ }) {
+ return Expanded(
+ child: TextButton.icon(
+ onPressed: onPressed,
+ icon: Icon(icon, color: const Color(0xFF1DBF73), size: 20),
+ label: Text(
+ '$label ($count)',
+ style: const TextStyle(color: Colors.white70, fontSize: 12),
+ ),
+ ),
+ );
+ }
+
+ Widget _buildParticipateButton() {
+ return ElevatedButton(
+ onPressed: onParticipate,
+ style: ElevatedButton.styleFrom(
+ backgroundColor: const Color(0xFF1DBF73),
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ padding: const EdgeInsets.symmetric(vertical: 12.0),
+ minimumSize: const Size(double.infinity, 40),
+ ),
+ child: const Text('Participer', style: TextStyle(color: Colors.white)),
+ );
+ }
+}
diff --git a/lib/presentation/screens/event/event_screen.dart b/lib/presentation/screens/event/event_screen.dart
index a881064..f04b97e 100644
--- a/lib/presentation/screens/event/event_screen.dart
+++ b/lib/presentation/screens/event/event_screen.dart
@@ -1,4 +1,6 @@
import 'package:flutter/material.dart';
+import '../dialogs/add_event_dialog.dart';
+import 'event_card.dart';
class EventScreen extends StatelessWidget {
const EventScreen({super.key});
@@ -13,130 +15,44 @@ class EventScreen extends StatelessWidget {
IconButton(
icon: const Icon(Icons.add_circle_outline, size: 28, color: Color(0xFF1DBF73)),
onPressed: () {
- // Logique pour ajouter un nouvel événement
+ _showAddEventDialog(context);
},
),
],
),
body: ListView.builder(
padding: const EdgeInsets.all(16.0),
- itemCount: 10, // Remplacez par le nombre réel d'événements
+ itemCount: 10,
itemBuilder: (context, index) {
- return Card(
- color: const Color(0xFF2C2C3E),
- margin: const EdgeInsets.symmetric(vertical: 10.0),
- shape: RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(15.0),
- ),
- child: Padding(
- padding: const EdgeInsets.all(12.0),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- const Row(
- children: [
- CircleAvatar(
- backgroundImage: NetworkImage(
- 'https://example.com/profile_picture.png', // Remplacez par l'URL réelle de l'image de profil
- ),
- radius: 25,
- ),
- SizedBox(width: 10),
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(
- 'Nom Prénom', // Remplacez par le nom réel
- style: TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold),
- ),
- Text(
- 'Posté le 24/08/2024', // Remplacez par la date réelle
- style: TextStyle(color: Colors.white70, fontSize: 14),
- ),
- ],
- ),
- ],
- ),
- const SizedBox(height: 10),
- const Text(
- 'Titre de l\'événement', // Remplacez par le titre réel
- style: TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold),
- ),
- const SizedBox(height: 5),
- const Text(
- 'Description détaillée de l\'événement...', // Remplacez par la description réelle
- style: TextStyle(color: Colors.white70, fontSize: 14),
- ),
- const SizedBox(height: 10),
- ClipRRect(
- borderRadius: BorderRadius.circular(10.0),
- child: Image.network(
- 'https://example.com/event_image.png', // Remplacez par l'URL réelle de l'image de l'événement
- height: 180,
- width: double.infinity,
- fit: BoxFit.cover,
- errorBuilder: (context, error, stackTrace) {
- return Image.asset(
- 'lib/assets/images/placeholder.png', // Chemin vers une image de remplacement locale
- height: 180,
- width: double.infinity,
- fit: BoxFit.cover,
- );
- },
- ),
- ),
- const SizedBox(height: 10),
- Divider(color: Colors.white.withOpacity(0.2)), // Ligne de séparation discrète
- Padding(
- padding: const EdgeInsets.symmetric(vertical: 8.0),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- _buildIconButton(
- icon: Icons.thumb_up_alt_outlined,
- label: 'Réagir',
- count: 120, // Remplacez par le nombre réel de j'aimes
- onPressed: () {
- // Logique pour réagir à l'événement
- },
- ),
- _buildIconButton(
- icon: Icons.comment_outlined,
- label: 'Commenter',
- count: 45, // Remplacez par le nombre réel de commentaires
- onPressed: () {
- // Logique pour commenter l'événement
- },
- ),
- _buildIconButton(
- icon: Icons.share_outlined,
- label: 'Partager',
- count: 30, // Remplacez par le nombre réel de partages
- onPressed: () {
- // Logique pour partager l'événement
- },
- ),
- ],
- ),
- ),
- const SizedBox(height: 10),
- ElevatedButton(
- onPressed: () {
- // Logique pour participer à l'événement
- },
- style: ElevatedButton.styleFrom(
- backgroundColor: const Color(0xFF1DBF73),
- shape: RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(8.0),
- ),
- padding: const EdgeInsets.symmetric(vertical: 12.0),
- minimumSize: const Size(double.infinity, 40),
- ),
- child: const Text('Participer', style: TextStyle(color: Colors.white)),
- ),
- ],
- ),
- ),
+ return EventCard(
+ profileImage: 'lib/assets/images/profile_picture.png',
+ name: 'Nom Prénom',
+ datePosted: 'Posté le 24/08/2024',
+ eventTitle: 'Titre de l\'événement',
+ eventDescription: 'Description détaillée de l\'événement...',
+ eventImageUrl: 'lib/assets/images/profile_picture.png',
+ reactionsCount: 120,
+ commentsCount: 45,
+ sharesCount: 30,
+ onReact: () {
+ // Logique pour réagir à l'événement
+ },
+ onComment: () {
+ // Logique pour commenter l'événement
+ },
+ onShare: () {
+ // Logique pour partager l'événement
+ },
+ onParticipate: () {
+ // Logique pour participer à l'événement
+ },
+ onCloseEvent: () {
+ // Logique pour fermer l'événement
+ },
+ onMoreOptions: () {
+ // Logique pour afficher plus d'options
+ },
+ assetImage: 'lib/assets/images/placeholder.png', // Ajoutez ce paramètre requis
);
},
),
@@ -144,26 +60,12 @@ class EventScreen extends StatelessWidget {
);
}
- Widget _buildIconButton({
- required IconData icon,
- required String label,
- required int count,
- required VoidCallback onPressed,
- }) {
- return Container(
- margin: const EdgeInsets.only(right: 8.0), // Espacement entre les boutons
- child: Column(
- children: [
- IconButton(
- icon: Icon(icon, color: const Color(0xFF1DBF73), size: 20),
- onPressed: onPressed,
- ),
- Text(
- '$label ($count)',
- style: const TextStyle(color: Colors.white70, fontSize: 12),
- ),
- ],
- ),
+ void _showAddEventDialog(BuildContext context) {
+ showDialog(
+ context: context,
+ builder: (BuildContext context) {
+ return const AddEventDialog();
+ },
);
}
}
diff --git a/lib/presentation/screens/profile/profile_screen.dart b/lib/presentation/screens/profile/profile_screen.dart
index 61e9cb9..031825f 100644
--- a/lib/presentation/screens/profile/profile_screen.dart
+++ b/lib/presentation/screens/profile/profile_screen.dart
@@ -50,25 +50,25 @@ class ProfileScreen extends StatelessWidget {
}
Widget _buildUserInfoSection(BuildContext context) {
- return Column(
+ return const Column(
children: [
- const CircleAvatar(
+ CircleAvatar(
radius: 50,
- backgroundImage: AssetImage('lib/assets/images/profile_picture.png'), // Remplacer par la photo de profil
+ backgroundImage: AssetImage('lib/assets/images/profile_picture.png'), //Photo de profil
),
- const SizedBox(height: 10),
- const Text(
- 'Nom Prénom',
+ SizedBox(height: 10),
+ Text(
+ 'GBANE Dahoud',
style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold, color: Colors.white),
),
- const SizedBox(height: 5),
- const Text(
+ SizedBox(height: 5),
+ Text(
'pseudo',
style: TextStyle(fontSize: 16, color: Colors.grey),
),
- const SizedBox(height: 5),
- const Text(
- 'email@example.com',
+ SizedBox(height: 5),
+ Text(
+ 'gbanedahoud@lions.dev',
style: TextStyle(fontSize: 14, color: Colors.grey),
),
],
diff --git a/pubspec.lock b/pubspec.lock
index 781db0c..2856321 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -49,6 +49,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.18.0"
+ csslib:
+ dependency: transitive
+ description:
+ name: csslib
+ sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.0"
cupertino_icons:
dependency: "direct main"
description:
@@ -102,11 +110,24 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.0.0"
+ flutter_plugin_android_lifecycle:
+ dependency: transitive
+ description:
+ name: flutter_plugin_android_lifecycle
+ sha256: "9ee02950848f61c4129af3d6ec84a1cfc0e47931abc746b03e7a3bc3e8ff6eda"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.22"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
+ flutter_web_plugins:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.0"
get_it:
dependency: "direct main"
description:
@@ -115,6 +136,62 @@ packages:
url: "https://pub.dev"
source: hosted
version: "7.7.0"
+ google_maps:
+ dependency: transitive
+ description:
+ name: google_maps
+ sha256: "463b38e5a92a05cde41220a11fd5eef3847031fef3e8cf295ac76ec453246907"
+ url: "https://pub.dev"
+ source: hosted
+ version: "8.0.0"
+ google_maps_flutter:
+ dependency: "direct main"
+ description:
+ name: google_maps_flutter
+ sha256: "2e302fa3aaf4e2a297f0342d83ebc5e8e9f826e9a716aef473fe7f404ec630a7"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.9.0"
+ google_maps_flutter_android:
+ dependency: transitive
+ description:
+ name: google_maps_flutter_android
+ sha256: "60a005bf1ba8d178144e442f6e2d734b0ffc2cc800a05415388472f934ad6d6a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.14.4"
+ google_maps_flutter_ios:
+ dependency: transitive
+ description:
+ name: google_maps_flutter_ios
+ sha256: "3a484846fc56f15e47e3de1f5ea80a7ff2b31721d2faa88f390f3b3cf580c953"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.13.0"
+ google_maps_flutter_platform_interface:
+ dependency: transitive
+ description:
+ name: google_maps_flutter_platform_interface
+ sha256: "4f6930fd668bf5d40feb2695d5695dbc0c35e5542b557a34ad35be491686d2ba"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.9.0"
+ google_maps_flutter_web:
+ dependency: transitive
+ description:
+ name: google_maps_flutter_web
+ sha256: ff39211bd25d7fad125d19f757eba85bd154460907cd4d135e07e3d0f98a4130
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.5.10"
+ html:
+ dependency: transitive
+ description:
+ name: html
+ sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.15.4"
http:
dependency: "direct main"
description:
@@ -203,6 +280,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.9.0"
+ plugin_platform_interface:
+ dependency: transitive
+ description:
+ name: plugin_platform_interface
+ sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.8"
provider:
dependency: transitive
description:
@@ -211,6 +296,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.1.2"
+ sanitize_html:
+ dependency: transitive
+ description:
+ name: sanitize_html
+ sha256: "12669c4a913688a26555323fb9cec373d8f9fbe091f2d01c40c723b33caa8989"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.0"
sky_engine:
dependency: transitive
description: flutter
@@ -240,6 +333,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.2"
+ stream_transform:
+ dependency: transitive
+ description:
+ name: stream_transform
+ sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.0"
string_scanner:
dependency: transitive
description:
@@ -288,6 +389,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "14.2.5"
+ web:
+ dependency: transitive
+ description:
+ name: web
+ sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.0"
sdks:
dart: ">=3.5.1 <4.0.0"
- flutter: ">=3.18.0-18.0.pre.54"
+ flutter: ">=3.22.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index 8376ad8..a33fd2d 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -11,6 +11,7 @@ dependencies:
flutter:
sdk: flutter
+ google_maps_flutter: ^2.0.10
cupertino_icons: ^1.0.8
# State management with flutter_bloc
@@ -40,6 +41,8 @@ flutter:
assets:
- lib/assets/images/logo.png
- lib/assets/images/background.webp
+ - lib/assets/images/profile_picture.png
+ - lib/assets/images/placeholder.png
# To add assets to your application, add an assets section, like this:
# assets: