Dashboard using ChangeNotifier and AnimatedBuilder.
State Management by using built-in Flutter classes.
In this project, you are going to take a look at:
- How to use
ChangeNotifierandAnimatedBuilderto selectively rebuild individual widgets for performance - State Management with build-in classes, no packages
- Dashboard app needs to chart espresso, coffee, latte and total consumption
- Drawing each section bar, the chart needs to refresh independently for performance
- Use the
ChangeNotifierandAnimatedBuilderto allow to selectively rebuild individual widgets for performance
The ChangeNotifier and AnimatedBuilder allow to selectively rebuild individual widgets for performance
- Create a class that extends
ChangeNotifier - Add fields to contain data
- Add methods to modify data and call the
notifyListeners()method - Add the
AnimatedBuilderwidget in the widget tree to rebuild widgets selectively if the data changed
class Section {
int espresso = 0;
int coffee = 0;
int latte = 0;
Section(
{required this.espresso,
required this.coffee,
required this.latte});
}
class TotalCoffeeChangeNotifier extends ChangeNotifier {
int totalCoffee = 0;
void totalNumberOfCoffee({required int espresso, required int coffee, required int latte}) {
totalCoffee = espresso + coffee + latte;
notifyListeners();
}
}
class CoffeeChangeNotifier extends ChangeNotifier {
late Section section;
void addNumberOfCoffee({required int espresso, required int coffee, required int latte}) {
section.espresso += espresso;
section.coffee += coffee;
section.latte += latte;
notifyListeners();
}
}
// Child Widget
AnimatedBuilder(
animation: totalCoffeeChangeNotifier,
builder: (BuildContext context, Widget? snapshot) {
debugPrint('Total: ${totalCoffeeChangeNotifier.totalCoffee}');
return MoodVerticalBarWidget(
icon: Icons.local_cafe_outlined,
numberToPlot: totalCoffeeChangeNotifier.totalCoffee,
numberToPlotMax: numberToPlotMax,
title: 'Total',
);
}
),
ChangeNotifier and ValueListenableBuilder - The ChangeNotifier and AnimatedBuilder allow to selectively rebuild individual widgets for performance. Use fields to contain data defining them in the ChangeNotifier. Use methods to modify data and call the notifyListeners() method. Use the AnimatedBuilder widget in the widget tree to rebuild widgets selectively if the data changed.