Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Projeto: Faça como eu fiz: o Widget contra ataca

Olá, quis fazer o projeto com a classe statefulWidget por que queria tentar implementar uma mudança de estado que vimos em aula, deu um trabalhinho para fazer mas cheguei no resultado. Minha primeira ideia, era ter três linha com três sequências de cores cada linhas e ao clicar no botão, as cores seriam trocadas, mas não consegui montar uma lógica para fazer a mudança, então mudei o projeto para uma coluna com três caixas azuis, e ao clicar no botão a coluna vira três linhas de múltiplas cores.

Acredito que o código não esteja da melhor forma, ficou grande...rs.

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          leading: const Icon(Icons.add_task),
          backgroundColor: Colors.blue,
          title: const Text(
            'Flutter: Projeto Cores',
            style: TextStyle(color: Colors.white),
          ),
        ),
        body: const ColorsBox(),
      ),
    );
  }
}

class ColorsBox extends StatefulWidget {
  const ColorsBox({super.key});

  @override
  State<ColorsBox> createState() => _ColorsBoxState();
}

class _ColorsBoxState extends State<ColorsBox> {
  int colornum = 0;
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Column(
        children: [
          Column(children: [
            openColors(Colors.green, Colors.blue, Colors.purple),
            openColors(Colors.orange, Colors.red, Colors.grey),
            openColors(Colors.pink, Colors.purple, Colors.yellow),
            openColors(Colors.blue.shade900, Colors.black, Colors.brown),
          ]),
          ElevatedButton(
            style: ButtonStyle(
              fixedSize: const MaterialStatePropertyAll(Size(100, 30)),
              backgroundColor: MaterialStatePropertyAll(Colors.green.shade500),
            ),
            onPressed: () {
              setState(
                () {
                  colornum++;
                },
              );
            },
            child: const Icon(Icons.check),
          ),
        ],
      ),
    );
  }

  openColors(Color color1, Color color2, Color color3) {
    if (colornum == 0) {
      return Padding(
        padding: const EdgeInsets.all(8.0),
        child: Row(
          children: [
            Container(
              width: 80,
              height: 110,
              color: Colors.blue,
            ),
          ],
        ),
      );
    } else if (colornum == 1) {
      return Padding(
        padding: const EdgeInsets.all(8.0),
        child: Row(
          children: [
            Container(
              width: 80,
              height: 110,
              color: color1,
            ),
            Container(
              width: 80,
              height: 110,
              color: color2,
            ),
            Container(
              width: 80,
              height: 110,
              color: color3,
            ),
          ],
        ),
      );
    } else if (colornum == 2) {
      colornum = 0;
      return Padding(
        padding: const EdgeInsets.all(8.0),
        child: Row(
          children: [
            Container(
              width: 80,
              height: 110,
              color: Colors.blue,
            ),
          ],
        ),
      );
    }
  }
}

Tela inicial:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Tela após clicar no botão:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas

Olá, Julio.

Tudo bem?

Parabéns por se aventurar com o StatefulWidget e tentar implementar uma mudança de estado! Isso é uma ótima forma de praticar o que foi aprendido em aula.

Analisando o código que você compartilhou, percebo que você criou uma lógica de alternância de cores utilizando a variável colornum. A ideia de alternar entre diferentes conjuntos de cores é interessante e pode ser refinada para melhorar a estrutura do código.

Uma sugestão seria evitar o uso de condicionais diretamente no método build para decidir qual conjunto de cores apresentar. Em vez disso, você poderia criar uma lista de widgets que representam cada um dos estados possíveis e, com base no valor de colornum, selecionar o widget apropriado para ser exibido. Isso tornaria o código mais fácil de ler e manter.

Aqui está uma versão simplificada do seu código com essa abordagem:

class _ColorsBoxState extends State<ColorsBox> {
  int colornum = 0;

  List<Widget> colorSets = [
    createColorSet(Colors.blue, Colors.blue, Colors.blue),
    createColorSet(Colors.green, Colors.blue, Colors.purple),
    createColorSet(Colors.orange, Colors.red, Colors.grey),
    // Adicione mais conjuntos de cores conforme necessário
  ];

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Column(
        children: [
          colorSets[colornum % colorSets.length], // Usa o módulo para ciclar entre os conjuntos de cores
          ElevatedButton(
            style: ButtonStyle(
              fixedSize: const MaterialStatePropertyAll(Size(100, 30)),
              backgroundColor: MaterialStatePropertyAll(Colors.green.shade500),
            ),
            onPressed: () {
              setState(() {
                colornum++; // Incrementa colornum para alternar para o próximo conjunto de cores
              });
            },
            child: const Icon(Icons.check),
          ),
        ],
      ),
    );
  }

  Widget createColorSet(Color color1, Color color2, Color color3) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Row(
        children: [
          Container(
            width: 80,
            height: 110,
            color: color1,
          ),
          Container(
            width: 80,
            height: 110,
            color: color2,
          ),
          Container(
            width: 80,
            height: 110,
            color: color3,
          ),
        ],
      ),
    );
  }
}

Neste código, a função createColorSet é responsável por criar um conjunto de cores, e a lista colorSets armazena os diferentes conjuntos que você quer alternar. No método build, usamos colornum % colorSets.length para garantir que sempre haja um índice válido para a lista, independentemente do valor de colornum.

Espero que essa sugestão ajude a simplificar e organizar melhor o seu código. Continue explorando e experimentando com o Flutter para aprimorar suas habilidades.

Lembrando que é só uma sugestão de melhoria, mas essa parte que você já fez está bem legal, o seu código está estruturadinho :)

Espero ter ajudado e bons estudos!

solução!

Renan, Valeu pelo retorno e pela sugestão, posso estudar novas possibilidades de usar o código.