From 7f557d3d3e46846ce8ddf72b35763ddfdf01616f Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Wed, 9 Oct 2019 00:12:58 +0200 Subject: [PATCH] Use Flushbar for Snackbars The flutter default Snackbars are a major PITA to use as they require a Scaffold, additionaly, they will not be shown if the parent Scaffold is destroyed, which is the case when deleting a note and returning to the main screen. --- lib/screens/githostsetup_screens.dart | 6 ++---- lib/screens/home_screen.dart | 5 ++--- lib/screens/note_viewer.dart | 7 +------ lib/utils.dart | 29 +++++++++++++++++++-------- lib/widgets/journal_list.dart | 3 +-- pubspec.lock | 7 +++++++ pubspec.yaml | 3 ++- 7 files changed, 36 insertions(+), 24 deletions(-) diff --git a/lib/screens/githostsetup_screens.dart b/lib/screens/githostsetup_screens.dart index 5bfaee46..8fdb4764 100644 --- a/lib/screens/githostsetup_screens.dart +++ b/lib/screens/githostsetup_screens.dart @@ -9,6 +9,7 @@ import 'package:gitjournal/analytics.dart'; import 'package:gitjournal/apis/git.dart'; import 'package:gitjournal/apis/githost_factory.dart'; import 'package:gitjournal/state_container.dart'; +import 'package:gitjournal/utils.dart'; import 'package:path/path.dart' as p; import 'package:url_launcher/url_launcher.dart'; @@ -319,10 +320,7 @@ class GitHostSetupScreenState extends State { void _copyKeyToClipboard(BuildContext context) { Clipboard.setData(ClipboardData(text: publicKey)); - var text = "Public Key copied to Clipboard"; - Scaffold.of(context) - ..removeCurrentSnackBar() - ..showSnackBar(SnackBar(content: Text(text))); + showSnackbar(context, "Public Key copied to Clipboard"); } void _launchDeployKeyPage() async { diff --git a/lib/screens/home_screen.dart b/lib/screens/home_screen.dart index c8b3035d..d18cc9d3 100644 --- a/lib/screens/home_screen.dart +++ b/lib/screens/home_screen.dart @@ -1,6 +1,7 @@ import 'package:badges/badges.dart'; import 'package:flutter/material.dart'; import 'package:gitjournal/note.dart'; +import 'package:gitjournal/utils.dart'; import 'package:gitjournal/apis/git.dart'; import 'package:gitjournal/screens/note_editor.dart'; import 'package:gitjournal/screens/note_viewer.dart'; @@ -72,9 +73,7 @@ class HomeScreen extends StatelessWidget { try { await container.syncNotes(); } on GitException catch (exp) { - _scaffoldKey.currentState - ..removeCurrentSnackBar() - ..showSnackBar(SnackBar(content: Text(exp.cause))); + showSnackbar(context, exp.cause); } }), ), diff --git a/lib/screens/note_viewer.dart b/lib/screens/note_viewer.dart index b753cc82..01a5cc48 100644 --- a/lib/screens/note_viewer.dart +++ b/lib/screens/note_viewer.dart @@ -28,7 +28,6 @@ class NoteBrowsingScreen extends StatefulWidget { class NoteBrowsingScreenState extends State { PageController pageController; - final GlobalKey _scaffoldKey = GlobalKey(); NoteBrowsingScreenState({@required int noteIndex}) { pageController = PageController(initialPage: noteIndex); @@ -49,7 +48,6 @@ class NoteBrowsingScreenState extends State { ); return Scaffold( - key: _scaffoldKey, appBar: AppBar( title: Text('TIMELINE'), actions: [ @@ -97,10 +95,7 @@ class NoteBrowsingScreenState extends State { Navigator.pop(context); Fimber.d("Shwoing an undo snackbar"); - var snackbar = buildUndoDeleteSnackbar(context, note, noteIndex); - _scaffoldKey.currentState - ..removeCurrentSnackBar() - ..showSnackBar(snackbar); + showUndoDeleteSnackbar(context, note, noteIndex); } Widget _buildAlertDialog(BuildContext context) { diff --git a/lib/utils.dart b/lib/utils.dart index 51a0046e..1dd2e40a 100644 --- a/lib/utils.dart +++ b/lib/utils.dart @@ -3,6 +3,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:package_info/package_info.dart'; +import 'package:flushbar/flushbar.dart'; + import 'app.dart'; import 'note.dart'; import 'state_container.dart'; @@ -40,22 +42,33 @@ Future dumpAppLogs() async { return logsFilePath; } -SnackBar buildUndoDeleteSnackbar( +void showUndoDeleteSnackbar( BuildContext context, Note deletedNote, int deletedNoteIndex, ) { - var snackbar = SnackBar( - content: Text("Note Deleted"), - action: SnackBarAction( - label: "Undo", + var theme = Theme.of(context); + + Flushbar( + message: "Note Deleted", + duration: Duration(seconds: 3), + mainButton: FlatButton( + child: Text( + "Undo", + style: TextStyle(color: theme.accentColor), + ), onPressed: () { Fimber.d("Undoing delete"); var stateContainer = StateContainer.of(context); stateContainer.undoRemoveNote(deletedNote, deletedNoteIndex); }, ), - ); - - return snackbar; + ).show(context); +} + +void showSnackbar(BuildContext context, String message) { + Flushbar( + message: message, + duration: Duration(seconds: 3), + ).show(context); } diff --git a/lib/widgets/journal_list.dart b/lib/widgets/journal_list.dart index 2798dab5..6e58bfff 100644 --- a/lib/widgets/journal_list.dart +++ b/lib/widgets/journal_list.dart @@ -58,8 +58,7 @@ class JournalList extends StatelessWidget { final stateContainer = StateContainer.of(context); stateContainer.removeNote(note); - Scaffold.of(context) - .showSnackBar(buildUndoDeleteSnackbar(context, note, i)); + showUndoDeleteSnackbar(context, note, i); }, ); }, diff --git a/pubspec.lock b/pubspec.lock index cf9f6f18..57fe41b8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -127,6 +127,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.2" + flushbar: + dependency: "direct main" + description: + name: flushbar + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.0" flutter: dependency: "direct main" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 52d50063..23e2a38c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: gitjournal description: A Journaling App Built on top of Git -version: 1.1.15+10 +version: 1.1.16+10 dependencies: flutter: @@ -26,6 +26,7 @@ dependencies: auto_size_text: ^2.0.1 fimber: ^0.3.0 dynamic_theme: ^1.0.0 + flushbar: ^1.9.0 dev_dependencies: flutter_launcher_icons: "^0.7.2"