Para resolver meu desafio comecei criando uma variável de lista de cores na classe Task
class Task extends StatefulWidget {
final List<Color> levelColors = [
Colors.blue,
Colors.green,
Colors.yellow,
Colors.orange,
Colors.red,
Colors.purple,
Colors.black,
];
Depois refatorei o TaskState incluindo uma nova variável e criando uma para receber o valor do progressindicator
class _TaskState extends State<Task> {
int taskLevel = 0;
int progressLevel = 0;
double progressIndicatorValue = 0.0;
Incluindo a nova lista de cores recebendo o valor de progressLevel para setar as cores conforme o progresso:
Container(
height: 140,
decoration: BoxDecoration(
color: widget.levelColors[progressLevel], // inserido aqui
No ElevatedButton eu removí o código e incluí uma função nova para separar as responsabilidades
ElevatedButton(
onPressed: () {
calculateProgress(); // aqui
},
Coloquei o progressIndicatorValue no LinearProgressIndicator para receber o valor atualizado e separar a lógica de calculo
LinearProgressIndicator(
color: Colors.white,
value: progressIndicatorValue, // aqui
Agora o restante das funções para realizar os calculos
void calculateProgress() {
if (isNotMaxProgress()) {
taskLevel++;
}
if (isTimeToLevelUpProgress()) {
progressLevelUp();
} else {
updateProgress();
}
}
bool isNotMaxProgress() {
return progressLevel <= 6 && progressIndicatorValue < 1;
}
bool isTimeToLevelUpProgress() {
return progressIndicatorValue.compareTo(1) == 0 && progressLevel <= 5;
}
void progressLevelUp() {
setState(() {
progressIndicatorValue = 0;
taskLevel = 0;
progressLevel++;
});
}
void updateProgress() {
if (widget.difficulty <= 0) {
setState(() {
progressIndicatorValue = 1;
});
} else if (progressIndicatorValue < 1) {
setState(() {
progressIndicatorValue = (taskLevel / widget.difficulty) / 10;
});
}
}