Crie a variavel nivelMax e nivelColor, além de criar uma lista. Modifiquei a função upNivel para definir um nível máximo de acordo com o numero de estrelas de dificuldade, e que caso o nível máximo seja atingido, haja a mudança de cor de acordo com a lista de cores predefinidas, se a lista de cores for totalmente percorrida, há um else para fazer a lista reiniciar.
class _TaskState extends State<Task> {
int nivel = 0;
int nivelMax = 10;
int nivelColor = 0;
List listColors = [
Colors.blue,
Colors.green,
Colors.grey,
Colors.purple,
Colors.brown,
Colors.red,
Colors.pinkAccent,
];
void upNivel() {
if (nivel < (widget.dificuldade * nivelMax)) {
nivel++;
} else {
nivel = 1;
if (nivelColor < listColors.length - 1) {
nivelColor++;
} else {
nivelColor = 0;
}
}
}
double incrementProgressBar() {
return (widget.dificuldade > 0)
? (nivel / (widget.dificuldade * nivelMax))
: 0;
}
E seguir ficou dentro do Widget build
SizedBox(
height: 52,
width: 52,
child: ElevatedButton(
onPressed: () {
setState(() {
upNivel();
});
},
child: Column(
Container(
color: listColors[nivelColor],
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Padding(
padding: const EdgeInsets.all(8),
child: SizedBox(
child: LinearProgressIndicator(
color: Colors.white,
value: incrementProgressBar(),
),
width: 200,
),
),
Padding(
padding: const EdgeInsets.all(12),
child: Text(
'Nivel $nivel',
style: TextStyle(color: Colors.white, fontSize: 16),
),
),
],
),
)