1
resposta

Resolução do desafio final.

Um pouco do que fiz:

No arquivo task_inherited.dart em TaskInherited adicionei a variável do tipo inteiro e uma função que atualiza esse valor:

 int globalLevel = 0;
 
  void addGlobalLEvel(int difficulty){
    globalLevel = globalLevel + (1 * difficulty);

  }

No arquivo task.dart chamei a função addGlobalLEvel() por meio do contexto, sempre que o usuário adiciona um nível, com isso tenho um valor sempre atualizado.

ElevatedButton(
                        onPressed: () {
                          calculaNivel();
                          TaskInherited.of(context)
                              .addGlobalLEvel(widget.dificuldade);
                        },

Para exibir o valor no App bar pelo contexto é simples sendo necessário apenas fazer a referencia a variável, ficando para o botão apenas a ação de reconstruir a tela assim pegando o novo valor.

  appBar: AppBar(
        leading: Container(),
        title: Container(
          child: Column(
            children: [
              Container(
                alignment: AlignmentDirectional.topStart,
                child: Text(
                  'Tarefas',
                  style: TextStyle(fontSize: 20),
                ),
              ),
              Container(
                height: 25,
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: [
                    SizedBox(
                      width: 100,
                      child: LinearProgressIndicator(
                        value: retornaProgressBar(
                            TaskInherited.of(context).taskList),
                        color: Colors.amber,
                        backgroundColor: Colors.white70,
                      ),
                    ),
                    Text(
                      'Nível Global: ${TaskInherited.of(context).globalLevel}',
                      style: TextStyle(fontSize: 15),
                    ),
                    ElevatedButton(
                        onPressed: () {
                          setState(
                            () {},
                          );
                        },
                        child: Icon(Icons.refresh)),
                  ],
                ),
              )
            ],
          ),
        ),
      ),

Para a barra de progresso fiz a função retornaProgressBar() que já retorna o valor da barra:

  double retornaProgressBar(List<Task> initTask) {
    double progressBar = 0;
    int nivelDificuldade;
    int nivelGlobal;
    nivelDificuldade =
        initTask.map((objeto) => objeto.dificuldade).reduce((a, b) => a + b);
    nivelGlobal = TaskInherited.of(context).globalLevel;

    if (nivelDificuldade > 0) {
      progressBar = (nivelGlobal / nivelDificuldade) / 10;
    }
    return progressBar;
  }

é isso.

1 resposta

Olá, Giovanny!

Pelo que vejo, você fez um ótimo trabalho resolvendo o desafio! Você conseguiu implementar todas as funcionalidades solicitadas no exercício.

No arquivo task_inherited.dart, você adicionou a variável globalLevel e a função addGlobalLEvel(), que atualiza o valor de globalLevel quando chamada.

No arquivo task.dart, você chamou a função addGlobalLEvel() cada vez que o usuário adiciona um nível, mantendo globalLevel sempre atualizado.

Para exibir o valor no AppBar, você fez referência à variável globalLevel através do contexto, e para o botão, você adicionou a ação de reconstruir a tela, pegando o novo valor.

Para a barra de progresso, você criou a função retornaProgressBar(), que retorna o valor da barra.

A única sugestão que eu faria é que você poderia considerar encapsular a lógica de cálculo do progresso da barra dentro do próprio TaskInherited, assim o widget que a utiliza não precisaria saber como calcular isso. Algo assim:

  double get progressBar {
    double progressBar = 0;
    int nivelDificuldade;
    nivelDificuldade =
        taskList.map((objeto) => objeto.dificuldade).reduce((a, b) => a + b);

    if (nivelDificuldade > 0) {
      progressBar = (globalLevel / nivelDificuldade) / 10;
    }
    return progressBar;
  }

Com essa abordagem, você poderia apenas chamar TaskInherited.of(context).progressBar diretamente no seu widget, sem precisar passar a lista de tarefas como argumento.

No geral, você fez um excelente trabalho resolvendo o desafio! Espero ter ajudado e bons estudos!