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: