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

Ajuda: Desafio - Subindo de Nível

Galeres, preciso de ajuda. Vi diversos posts aqui no fórum com possíveis resoluções para o desafio da subida de nível porém eu tentei criar uma linha de raciocínio aqui e preciso seguir com ela para realmente aprender rsrs.

Vamos lá.. aqui está o projetinho no github..

Inicialmente eu criei umas funções e variáveis dentro do TaskInheritad:

 int nivelGlobal = 0;
  int colorGlobal = 0;

  int sumDifficulty(){
    int sumDifficulty = 0;
    for (int i=0; i < taskList.length; i++){
      sumDifficulty += taskList[i].dificuldade;
    }
    return sumDifficulty;
  }

  void nivelGlobalUpgrade (){
    if(nivelGlobal<(sumDifficulty()*10)){
      nivelGlobal++;
    } else if(nivelGlobal == (sumDifficulty()+10) && colorGlobal < 6){
      nivelGlobal = 0;
      colorGlobal++;
    }
  }

• A função sumDifficulty() serve exclusivamente para termos o valor da soma das dificuldades em int. • Criei a int nivelGlobal para termos o contagem de cada clique em subir de nível e eu acho que é nessa parte que estamos tendo um problema de context. • Já que eu fiz o esquema de troca de cor conforme vamos passando de nível nas tasks, criei a int colorGlobal para fazer isso na AppBar também.

No arquivo Task, adicionei a função void nivelGlobalUpgrade dentro do onPressed do botão Up. Isso para contabilizar os cliques e ir subindo o nível global. Justamente nessa parte que eu teorizo que esteja havendo um problema de context:

onPressed: () {
                            setState(() {
                              if (widget.nivel < (widget.dificuldade * 10)) {
                                widget.nivel++;
                              } else if (widget.nivel == (widget.dificuldade * 10) &&
                                  widget.color < 6) {
                                widget.nivel = 0;
                                widget.color++;
                                widget.hashcolor = colorChanging(widget.color);
                                TaskInherited.of(context).nivelGlobalUpgrade;
                              }
                            });
                          }

Para finalizar, na Initial_Screen eu criei por enquanto a barra de progresso e o botão de update. No botão de update, eu só coloquei um print com os valores nivelGlobal, colorGlobal e o sumDifficulty. Coloquei esse print só para eu entender se os valores estão mudando e apenas o sumDifficulty está me entregando atualizado conforme incluo novas tasks. Os outros 2 valores não alteram conforme clico em up de alguma task.

AppBar(
          leading: Builder(
            builder: (BuildContext context) {
              return IconButton(
                icon: const Icon(
                  Icons.recycling,
                  color: Colors.white,
                ),
                onPressed: () {
                  setState(() {
                    print(
                        '${TaskInherited.of(context).nivelGlobal}, ${TaskInherited.of(context).colorGlobal} e ${TaskInherited.of(context).sumDifficulty()}');
                  });
                },
                tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip,
              );
            },
          ),
          backgroundColor: colorChanging(TaskInherited.of(context).colorGlobal),
          title: Column(
            children: [
              const Text(
                'Tarefas',
                style: TextStyle(color: Colors.white),
              ),
              LinearProgressIndicator(
                  color: Colors.white,
                  backgroundColor: const Color.fromARGB(100, 255, 255, 255),
                  value: (TaskInherited.of(context).nivelGlobal /
                      (TaskInherited.of(context).sumDifficulty() / 10)))
            ],
          ))

Bom.. é isso. O que devo fazer? rsrsrs

2 respostas
solução!

Olá, Thiago.

Tudo bem?

Na parte do código onde você tem:

TaskInherited.of(context).nivelGlobalUpgrade;

Você está apenas referenciando a função, mas não a está chamando. Para chamar a função, você precisa adicionar parênteses ao final. Portanto, o código deve ser alterado para:

TaskInherited.of(context).nivelGlobalUpgrade();

Além disso, notei que você está utilizando o setState dentro do onPressed do botão Up. No entanto, essa função está sendo chamada no widget da tarefa, e não no widget que contém o nível global. Isso significa que, mesmo que a função nivelGlobalUpgrade seja chamada, o widget que contém o nível global não está sendo reconstruído, portanto, a mudança no nível global não está sendo refletida na interface do usuário.

Para resolver isso, você pode usar um gerenciador de estado, como o Provider, para notificar os widgets que dependem do nível global quando ele for alterado. Com o Provider, você pode chamar notifyListeners na função nivelGlobalUpgrade para informar aos widgets dependentes que eles precisam ser reconstruídos.

Espero ter entendido e conseguido ajudar. Qualquer coisa manda aqui. Bons estudos!

Muito obrigado pela ajuda Renan! Só o detalhe da falta dos () é o que estava impedindo o código de funcionar. E eu achando que era algo mirabolante hahahah.

Por enquanto o botão que criei para atualizar a initial_screen está dando certo. Porém vou estudar essa dica do provider que você deu para melhorar o projeto.