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/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,
),
));
}

View File

@ -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<FolderListingScreen> {
@override
Widget build(BuildContext context) {
final container = StateContainer.of(context);
final appState = container.appState;
final notesFolder = Provider.of<NotesFolder>(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<CreateFolderButton> {
await showDialog(context: context, builder: _buildAlert);
if (folderName is String) {
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),

View File

@ -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:

View File

@ -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"