3
respostas

[Projeto] [Desafio2] Resolução by Gabriel

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

3 respostas

O print da tela: print da tela

Fala Gabriel!

Cara ficou bem legal sua solução e a parte visual também tá bem show :)

Muito obrigado! :D