Para resolver o desafio eu comecei incluído 4 variáveis no TaskView
(TaskScreen) e achei mais interessante ser um nivel de upgrade Global e ir mudando as cores igual as tasks conforme abaixo:
class TasksView extends StatefulWidget {
TasksView({Key? key}) : super(key: key);
int globalLevel = 0;
double globalProgressIndicatorValue = 0.0;
int globalProgressLevel = 0;
final List<Color> globalLevelColors = [
Colors.blue,
Colors.green,
Colors.yellow,
Colors.orange,
Colors.red,
Colors.purple,
Colors.black,
];
Incluí o backgroundColor
no AppBar
com a variável de lista de cores recebendo o nível global de progresso:
backgroundColor: widget.globalLevelColors[widget.globalProgressLevel],
Incluí uma coluna no título para receber o título com a barra de progresso e o valor do nível:
title: Column(
children: [
const Text('Tarefas'),
const SizedBox(height: 5),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
SizedBox(
width: 170,
child: LinearProgressIndicator(
color: Colors.white,
value: widget.globalProgressIndicatorValue,
),
),
Text('Nível: ${widget.globalLevel}',
style: const TextStyle(
color: Colors.white,
fontSize: 14,
)),
],
),
],
),
Incluí um IconButton
para o refresh dos dados, realizando os cálculos executando o método calculateGlobalProgress()
:
actions: [
IconButton(
onPressed: () {
calculateGlobalProgress();
},
icon: const Icon(Icons.refresh)),
],
Por fim os métodos de cálculo:
void calculateGlobalProgress() {
final taskListSize = TaskInherited.of(context)!.taskList.length;
widget.globalLevel = TaskInherited.of(context)!.taskList.fold(
0,
(previousValue, task) => task.progressLevel + previousValue,
);
for (var level = 1; level <= 7; level++) {
if (isTimeToUpgradeGlobalProgress(
taskListSize: taskListSize,
level: level,
)) {
widget.globalProgressLevel = level;
break;
}
}
setState(() {
widget.globalLevel;
widget.globalProgressIndicatorValue =
widget.globalLevel / (taskListSize * 7);
});
}
bool isTimeToUpgradeGlobalProgress({
required int taskListSize,
required int level,
}) {
return widget.globalProgressLevel < level &&
widget.globalLevel >= (taskListSize * level);
}
Repositório do GitHub: https://github.com/blandygbc/tasks_flutter_alura