From 0b1a41f3bd50443d3fb1ab5e2c93c27bccdc1412 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Sat, 7 Dec 2019 16:21:28 +0100 Subject: [PATCH] FolderListing: Use Provider to fetch the NotesFolder This is our first use case of trying to use 'Provider' for state management. Right now, we're doing state management quite horribly as all the widgets are rebuilt whenever the state of the app changes. With this, we can now start to refactor and only rebuild the widgets whose data has changed. There we many many different state management solutions to choose from, I've settled on Provider, as it seems like the simplest to integrate into the code base. Bloc/Redux seemed like they would add too much complexity for me. --- lib/app.dart | 6 +++++- lib/screens/folder_listing.dart | 10 +++++----- pubspec.lock | 7 +++++++ pubspec.yaml | 1 + 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index 448f3d08..ccabb61e 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -5,6 +5,7 @@ import 'package:fimber/fimber.dart'; import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:firebase_analytics/observer.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:gitjournal/apis/git.dart'; import 'package:gitjournal/settings.dart'; @@ -46,7 +47,10 @@ class JournalApp extends StatelessWidget { runApp(StateContainer( appState: appState, - child: JournalApp(), + child: ChangeNotifierProvider( + child: JournalApp(), + create: (_) => appState.notesFolder, + ), )); } diff --git a/lib/screens/folder_listing.dart b/lib/screens/folder_listing.dart index 710b102c..c883c455 100644 --- a/lib/screens/folder_listing.dart +++ b/lib/screens/folder_listing.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:gitjournal/widgets/app_bar_menu_button.dart'; import 'package:gitjournal/widgets/app_drawer.dart'; @@ -18,11 +19,10 @@ class _FolderListingScreenState extends State { @override Widget build(BuildContext context) { - final container = StateContainer.of(context); - final appState = container.appState; + final notesFolder = Provider.of(context); var treeView = FolderTreeView( - rootFolder: appState.notesFolder, + rootFolder: notesFolder, onFolderEntered: (NotesFolder folder) { var route = MaterialPageRoute( builder: (context) => JournalListingScreen( @@ -99,9 +99,9 @@ class _CreateFolderButtonState extends State { await showDialog(context: context, builder: _buildAlert); if (folderName is String) { final container = StateContainer.of(context); - final appState = container.appState; + final notesFolder = Provider.of(context); - container.createFolder(appState.notesFolder, folderName); + container.createFolder(notesFolder, folderName); } }, child: Icon(Icons.add), diff --git a/pubspec.lock b/pubspec.lock index edb7c903..44292a66 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -399,6 +399,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.11" + provider: + dependency: "direct main" + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.0" pub_semver: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 116032ff..2ff1ad9e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -29,6 +29,7 @@ dependencies: flushbar: ^1.9.0 flutter_staggered_grid_view: ^0.3.0 page_transition: "^1.1.5" + provider: ^3.2.0 dev_dependencies: flutter_launcher_icons: "^0.7.2"