3
respostas

[Projeto] Compartilhando o código

class Tasks extends StatefulWidget {
  final String nome;
  final String foto;
  final int dificuldade;

  const Tasks(this.nome, this.foto, this.dificuldade, {Key? key})
      : super(key: key);

  @override
  State<Tasks> createState() => _TasksState();
}

class _TasksState extends State<Tasks> {
  int level = 1;
  int mastery = 1;

  void levelUp() {
    setState(() {
      level++;
      if (level == widget.dificuldade * 10 + 1) {
        level = 1;
        mastery++;
      }
    });
  }

  List<Color> masteryColors = [
    Colors.blue,
    Colors.green,
    Colors.yellow,
    Colors.orange,
    Colors.red,
    Colors.purple,
    Colors.black
  ];

  blockButton() {
    if (level == widget.dificuldade * 10 && mastery == 7) {
      return true;
    } else {
      return false;
    }
  }
  
 // CONTINUA...
3 respostas
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Stack(
        children: [
          Container(
            decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(4),
              color: masteryColors[mastery - 1],
            ),
            height: 140,
          ),
          Column(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              Container(
                decoration: BoxDecoration(
                  borderRadius: BorderRadius.circular(4),
                  color: Colors.white,
                ),
                height: 100,
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: [
                    Container(
                      decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(4),
                        color: Colors.black12,
                      ),
                      child: ClipRRect(
                        borderRadius: BorderRadius.circular(4),
                        child: Image.asset(
                          widget.foto,
                          height: 100,
                          width: 72,
                          fit: BoxFit.cover,
                        ),
                      ),
                    ),
                    Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        SizedBox(
                          width: 200,
                          child: Text(
                            widget.nome,
                            style: const TextStyle(
                                fontSize: 24, overflow: TextOverflow.ellipsis),
                          ),
                        ),
                        Difficulty(widget.dificuldade),
                        // vai ser um novo componente.
                      ],
                    ),
                    Padding(
                      padding: const EdgeInsets.all(16.0),
                      child: SizedBox(
                        height: 55,
                        width: 65,
                        child: IgnorePointer(
                          ignoring: blockButton(),
                          child: ElevatedButton(
                            onPressed: levelUp,
                            child: Column(
                              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                              crossAxisAlignment: CrossAxisAlignment.end,
                              children: [
                                const Icon(Icons.arrow_drop_up),
                                Text(
                                  'UP',
                                  style: TextStyle(
                                      fontSize: 12,
                                      color: blockButton() == true
                                          ? Colors.grey
                                          : Colors.black),
                                ),
                              ],
                            ),
                          ),
                        ),
                      ),
                    )
                  ],
                ),
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  Padding(
                    padding: const EdgeInsets.only(
                      left: 8,
                    ),
                    child: SizedBox(
                      width: 200,
                      child: LinearProgressIndicator(
                        color: Colors.white,
                        value: widget.dificuldade > 0
                            ? ((level / widget.dificuldade) / 10)
                            : 1,
                      ),
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.all(12.0),
                    child: Text(
                      'Nivel: $level',
                      style: const TextStyle(color: Colors.white, fontSize: 16),
                    ),
                  ),
                ],
              )
            ],
          ),
        ],
      ),
    );
  }
}

Resultado:

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

No código que você compartilhou, é um bom exemplo de como usar o padrão Stateful Widget em Flutter para criar uma interface dinâmica onde os elementos interagem entre si com base em ações do usuário. Vamos destacar alguns pontos importantes do seu código e como eles se encaixam para formar a funcionalidade desejada:

  1. Estrutura da Classe Stateful Widget:

    • Você tem uma classe Tasks que é um StatefulWidget, o que significa que ela pode alterar seu estado em resposta a eventos, como interações do usuário.
    • A classe _TasksState é onde o estado é mantido e manipulado, neste caso, para controlar os níveis e mestrias de uma tarefa.
  2. Gerenciamento de Estado:

    • As funções levelUp() e blockButton() são usadas para manipular e verificar o estado, respectivamente. A levelUp() aumenta o nível e, potencialmente, a maestria, enquanto a blockButton() verifica se o botão deve ser desabilitado.
  3. Personalização Visual com State:

    • A personalização das cores é feita usando uma lista masteryColors que muda a cor de fundo do container principal conforme o usuário avança em maestria.
  4. Widgets e Layout:

    • Você usa Stack, Container, Column, e outros widgets para criar um layout visualmente atrativo que apresenta várias peças de informação e controles interativos como botões e barras de progresso.
    • O uso de Padding, SizedBox, LinearProgressIndicator e outros auxilia na criação de uma interface clara e organizada.
  5. Interatividade:

    • O ElevatedButton dentro do IgnorePointer é uma maneira inteligente de desativar interatividade sem remover o botão, mantendo a experiência do usuário consistente.
    • O botão chama levelUp quando pressionado, a menos que seja bloqueado pela função blockButton().
  6. Performance e Boas Práticas:

    • O uso de setState() dentro da levelUp() é adequado para este caso, pois você está alterando o estado local que afeta apenas esta parte da UI.
    • Dividir responsabilidades e criar componentes customizados (como o mencionado Difficulty) é uma excelente prática para manter o código organizado e reutilizável.

O projeto parece bem estruturado e aproveita as capacidades do Flutter para criar uma experiência de usuário dinâmica e interativa. A única sugestão seria verificar se há algum potencial para otimização ou redução de código redundante, especialmente em manipulações de estado que podem ser simplificadas ou melhor documentadas para manutenção futura.

Se houver áreas específicas do projeto ou funcionalidades que você gostaria de discutir ou melhorar, fique à vontade para compartilhar mais detalhes!

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

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software