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.
This commit is contained in:
Vishesh Handa
2019-12-07 16:21:28 +01:00
parent 6288a7cfa0
commit 0b1a41f3bd
4 changed files with 18 additions and 6 deletions

View File

@ -5,6 +5,7 @@ import 'package:fimber/fimber.dart';
import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_analytics/observer.dart'; import 'package:firebase_analytics/observer.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:gitjournal/apis/git.dart'; import 'package:gitjournal/apis/git.dart';
import 'package:gitjournal/settings.dart'; import 'package:gitjournal/settings.dart';
@ -46,7 +47,10 @@ class JournalApp extends StatelessWidget {
runApp(StateContainer( runApp(StateContainer(
appState: appState, appState: appState,
child: JournalApp(), child: ChangeNotifierProvider(
child: JournalApp(),
create: (_) => appState.notesFolder,
),
)); ));
} }

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:gitjournal/widgets/app_bar_menu_button.dart'; import 'package:gitjournal/widgets/app_bar_menu_button.dart';
import 'package:gitjournal/widgets/app_drawer.dart'; import 'package:gitjournal/widgets/app_drawer.dart';
@ -18,11 +19,10 @@ class _FolderListingScreenState extends State<FolderListingScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final container = StateContainer.of(context); final notesFolder = Provider.of<NotesFolder>(context);
final appState = container.appState;
var treeView = FolderTreeView( var treeView = FolderTreeView(
rootFolder: appState.notesFolder, rootFolder: notesFolder,
onFolderEntered: (NotesFolder folder) { onFolderEntered: (NotesFolder folder) {
var route = MaterialPageRoute( var route = MaterialPageRoute(
builder: (context) => JournalListingScreen( builder: (context) => JournalListingScreen(
@ -99,9 +99,9 @@ class _CreateFolderButtonState extends State<CreateFolderButton> {
await showDialog(context: context, builder: _buildAlert); await showDialog(context: context, builder: _buildAlert);
if (folderName is String) { if (folderName is String) {
final container = StateContainer.of(context); final container = StateContainer.of(context);
final appState = container.appState; final notesFolder = Provider.of<NotesFolder>(context);
container.createFolder(appState.notesFolder, folderName); container.createFolder(notesFolder, folderName);
} }
}, },
child: Icon(Icons.add), child: Icon(Icons.add),

View File

@ -399,6 +399,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.11" version: "3.0.11"
provider:
dependency: "direct main"
description:
name: provider
url: "https://pub.dartlang.org"
source: hosted
version: "3.2.0"
pub_semver: pub_semver:
dependency: transitive dependency: transitive
description: description:

View File

@ -29,6 +29,7 @@ dependencies:
flushbar: ^1.9.0 flushbar: ^1.9.0
flutter_staggered_grid_view: ^0.3.0 flutter_staggered_grid_view: ^0.3.0
page_transition: "^1.1.5" page_transition: "^1.1.5"
provider: ^3.2.0
dev_dependencies: dev_dependencies:
flutter_launcher_icons: "^0.7.2" flutter_launcher_icons: "^0.7.2"