1
resposta

[Projeto] Resposta ao Desafio

Olá, professor!

Consegui resolver o desafio da seguinte forma:

1 - Criei 3 variáveis na classe de estado do Widget Task

a - A primeira delas é "minLevel" que é responsável por guardar o nível mínimo para concluir uma Task de nível 1;

b - A segunda delas é "masteryLevel" que vai armazenar qual nível de maestria atual da minha Task;

c - E por fim eu criei um Map com chave inteira e valor do tipo "Color", a ideia é utilizar a masteryLevel citada anteriormente para acessar o valor do Map de acordo com a chave

class _TaskState extends State<Task> {
  int level = 0;
  int minLevel = 10;
  int masteryLevel = 1; //Esta variável guarda o nível de maestria atual da tarefa

  /*Este map possui como chave um inteiro e valor uma Color, dessa forma é possível mudar a cor
  * da tarefa conforme a progressão da variável masteryLevel*/
  Map<int, Color> mastery = {
    1: Colors.blue,
    2: Colors.yellow,
    3: Colors.orange,
    4: Colors.red,
    5: Colors.purple,
    6: Colors.black,
  };

2 - Depois eu fui no nosso primeiro Container de cor azul e alterei a cor passada para o Map "mastery" utilizando o "masteryValue" como chave para acessar a cor atual de acordo com a maestria na tarefa.

3 - Como o número de cores no Map é limitado eu precisei utilizar um operador ternário que verifica se o masteryLevel ultrapassou o inteiro que representa a última chave do meu Map. Se houver ultrapassado a cor da task se mantém a cor contida na última chave do Map.

Container(
    decoration: BoxDecoration(
      borderRadius: BorderRadius.circular(4),
      /*Como no algoritmo há um número limitado de cores para maestria é utilizado um
      * operador ternário que verifica se o nível de maestria atual não ultrapassa o valor
      * da última chave.
      * Se for o caso a cor da tarefa permanece a da última chave do map*/
      color: masteryLevel <= mastery.keys.last ? mastery[masteryLevel] : mastery[mastery.keys.last],
    ),
    height: 140,
),

4 - No botão da tarefa eu também adicionei uma condição. Caso o quociente da divisão que já estava sendo utilizada no LinearProgressIndicator for maior que o produto do nível mínimo e o nível de maestria o nível deve ser reiniciado e o nível de maestria incrementado.

child: ElevatedButton(
    onPressed: () {
      setState(() {
        level++;
        /*Verifica se o quociente do nível pela dificuldade se tornou maior
        * que o produto do nível mínimo (10) pela maestria.
        * Se a reposta for sim o nível é zerado e a maestria é incrementada*/
        if ((level / widget.difficultyLevel) > (minLevel * masteryLevel)) {
          level = 0;
          masteryLevel++;
        }
      });
    },

5 - Por fim para aumentar a dificuldade conforme se avança pelos níveis de maestria eu adicionei a multiplicação que já podia ser visualizada no código anterior que multiplica o nível mínimo pelo nível de maestria. Logo, conforme a dificuldade da tarefa e conforme a maestria alcançada aumentam, se torna mais difícil alcançar a maestria seguinte.

child: LinearProgressIndicator(
    color: Colors.white,
    value: widget.difficultyLevel > 0
        ? (level / widget.difficultyLevel) /
            (minLevel * masteryLevel) /*Aqui o nível mínimo é multiplicado pela maestria, então
            quanto maior a maestria mais difícil é chegar até o fim da barra de progresso*/
        : 1,
  ),

E para finalizar eu deixo o gif demonstrado o aplicativo funcionando:

1 resposta

CARA****MBA VEEEIIIII FICOU INCRIVELLLL

Vou te contar Emerson eu to muito orgulhoso de ver um código tão bem pensado quanto o seu. Você ta indo muuuito bem cara!

Continue assim e você dominará o Flutter rapidinho!