diff --git a/lib/constants/routes.dart b/lib/constants/routes.dart index 69d7e28..8109976 100644 --- a/lib/constants/routes.dart +++ b/lib/constants/routes.dart @@ -2,4 +2,4 @@ const loginRoute = '/login/'; const registerRoute = '/register/'; const notesRoute = '/notes/'; const verifyEmailRoute = '/verify-email/'; -const newNoteRoute = '/notes/new-note/'; \ No newline at end of file +const createOrUpdateNoteRoute = '/notes/new-note/'; diff --git a/lib/main.dart b/lib/main.dart index 38077fb..c20d23e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:mynotes/constants/routes.dart'; import 'package:mynotes/services/auth/auth_service.dart'; import 'package:mynotes/views/login_view.dart'; -import 'package:mynotes/views/notes/new_note_view.dart'; +import 'package:mynotes/views/notes/create_update_note_view.dart'; import 'package:mynotes/views/notes/notes_view.dart'; import 'package:mynotes/views/register_view.dart'; import 'package:mynotes/views/verify_email_view.dart'; @@ -22,7 +22,7 @@ void main() { registerRoute: (context) => const RegisterView(), notesRoute: (context) => const NotesView(), verifyEmailRoute: (context) => const VerifyEmailView(), - newNoteRoute: (context) => const NewNoteView(), + createOrUpdateNoteRoute: (context) => const CreateUpdateNoteView(), }, ), ); diff --git a/lib/utilities/generics/get_arguments.dart b/lib/utilities/generics/get_arguments.dart new file mode 100644 index 0000000..3a21d4f --- /dev/null +++ b/lib/utilities/generics/get_arguments.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart' show BuildContext, ModalRoute; + +extension GetArguments on BuildContext { + T? getArgument() { + final modalRoute = ModalRoute.of(this); + if (modalRoute != null) { + final args = modalRoute.settings.arguments; + if (args != null && args is T) { + return args as T; + } + } + return null; + } +} diff --git a/lib/views/notes/new_note_view.dart b/lib/views/notes/create_update_note_view.dart similarity index 78% rename from lib/views/notes/new_note_view.dart rename to lib/views/notes/create_update_note_view.dart index 4a49eb4..90e2f07 100644 --- a/lib/views/notes/new_note_view.dart +++ b/lib/views/notes/create_update_note_view.dart @@ -1,15 +1,16 @@ import 'package:flutter/material.dart'; import 'package:mynotes/services/auth/auth_service.dart'; import 'package:mynotes/services/crud/notes_service.dart'; +import 'package:mynotes/utilities/generics/get_arguments.dart'; -class NewNoteView extends StatefulWidget { - const NewNoteView({Key? key}) : super(key: key); +class CreateUpdateNoteView extends StatefulWidget { + const CreateUpdateNoteView({Key? key}) : super(key: key); @override - _NewNoteViewState createState() => _NewNoteViewState(); + _CreateUpdateNoteViewState createState() => _CreateUpdateNoteViewState(); } -class _NewNoteViewState extends State { +class _CreateUpdateNoteViewState extends State { DatabaseNote? _note; late final NotesService _notesService; late final TextEditingController _textController; @@ -38,7 +39,14 @@ class _NewNoteViewState extends State { _textController.addListener(_textControllerListener); } - Future createNewNote() async { + Future createOrGetExistingNote(BuildContext context) async { + final widgetNote = context.getArgument(); + + if (widgetNote != null) { + _note = widgetNote; + _textController.text = widgetNote.text; + return widgetNote; + } final existingNote = _note; if (existingNote != null) { return existingNote; @@ -46,7 +54,9 @@ class _NewNoteViewState extends State { final currentUser = AuthService.firebase().currentUser!; final email = currentUser.email!; final owner = await _notesService.getUser(email: email); - return await _notesService.createNote(owner: owner); + final newNote = await _notesService.createNote(owner: owner); + _note = newNote; + return newNote; } void _deleteNoteIfTextIsEmpty() { @@ -90,11 +100,10 @@ class _NewNoteViewState extends State { ), ), body: FutureBuilder( - future: createNewNote(), + future: createOrGetExistingNote(context), builder: (context, snapshot) { switch (snapshot.connectionState) { case ConnectionState.done: - _note = snapshot.data as DatabaseNote; _setupTextControllerListener(); return TextField( controller: _textController, diff --git a/lib/views/notes/notes_list_view.dart b/lib/views/notes/notes_list_view.dart index 87bd5c6..f4b4a8c 100644 --- a/lib/views/notes/notes_list_view.dart +++ b/lib/views/notes/notes_list_view.dart @@ -1,18 +1,19 @@ - import 'package:flutter/material.dart'; import 'package:mynotes/services/crud/notes_service.dart'; import 'package:mynotes/utilities/dialogs/delete_dialog.dart'; -typedef DeleteNoteCallback = void Function(DatabaseNote note); +typedef NoteCallback = void Function(DatabaseNote note); class NotesListView extends StatelessWidget { final List notes; - final DeleteNoteCallback onDeleteNote; + final NoteCallback onDeleteNote; + final NoteCallback onTap; const NotesListView({ Key? key, required this.notes, required this.onDeleteNote, + required this.onTap, }) : super(key: key); @override @@ -22,6 +23,9 @@ class NotesListView extends StatelessWidget { itemBuilder: (context, index) { final note = notes[index]; return ListTile( + onTap: () { + onTap(note); + }, title: Text( note.text, maxLines: 1, @@ -41,4 +45,4 @@ class NotesListView extends StatelessWidget { }, ); } -} \ No newline at end of file +} diff --git a/lib/views/notes/notes_view.dart b/lib/views/notes/notes_view.dart index 8adacf5..9a91fa4 100644 --- a/lib/views/notes/notes_view.dart +++ b/lib/views/notes/notes_view.dart @@ -32,7 +32,7 @@ class _NotesViewState extends State { actions: [ IconButton( onPressed: () { - Navigator.of(context).pushNamed(newNoteRoute); + Navigator.of(context).pushNamed(createOrUpdateNoteRoute); }, icon: const Icon(Icons.add), ), @@ -79,6 +79,12 @@ class _NotesViewState extends State { onDeleteNote: (note) async { await _notesService.deleteNote(id: note.id); }, + onTap: (note) { + Navigator.of(context).pushNamed( + createOrUpdateNoteRoute, + arguments: note, + ); + }, ); } else { return const CircularProgressIndicator();