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

Comportamento inesperado da aplicação

O aplicativo está tendo um comportamento estranho

Vou descrever. Hoje quando escrevo é dia 11/10/2024 e quando o app é ligado sem dados no banco de dados ele cria uma lista vazia de 11 posições

do dia 01 até dia 11.

Então, eu crio 4 notas no diário, pra facilitar eu escrevo "Dia 02" no dia 2 Dia3 no dia 3 ...

Tudo é salvo e mostrado tudo Ok

Quando eu reinicio a aplicação tudo sai fora do local. Aparentemente o app não sabe estruturar a lista de entradas pelos id gerados. Tudo fica deslocado. e dependendo da posição salva a entrada fica inacessível. Isto é, está no banco de dados da API mas não carrega no App.

Isso ocorre principalmente quando vc salva na primeira posição quando construído o app sem dados pela primeira vez, se você tentar salvar um dado na data do topo, ela vai pro banco de dados, mas não aparece na tela. Quando vc cria uma nova entrada, ela salva de novo sem carregar na tela.

Só eu estou tendo esse problema?

3 respostas

Olá, Fernando!

Poderia compartilhar o código ou o repositório com o projeto para que eu possa analisar melhor o que está acontecendo? Assim, consigo identificar mais precisamente o que pode estar causando esse comportamento.

Fico no aguardo e à disposição

Ola Mike,

não sei se é só isso o problema

no arquivo "home_screen.dart" temos um forEach loop (abaixo)

database.forEach(
    (key, value) {
      if (value.createdAt.isAfter(currentDay.subtract(Duration(days: windowPage)))) {
        int difference = value.createdAt
            .difference(currentDay.subtract(Duration(days: windowPage)))
            .inDays
            .abs();

        list[difference] = JournalCard(
          showedDate: list[difference].showedDate,
          journal: value,
          refreshFunction: refreshFunction,
        );
      }
    },
  );

eu fiz coloquei um "+1" ficando assim:

database.forEach(
    (key, value) {
      if (value.createdAt.isAfter(currentDay.subtract(Duration(days: windowPage)))) {
        int difference = (value.createdAt
            .difference(currentDay.subtract(Duration(days: windowPage)))
            .inDays
            .abs())+1;

        list[difference] = JournalCard(
          showedDate: list[difference].showedDate,
          journal: value,
          refreshFunction: refreshFunction,
        );
      }
    },
  );

Na versão 1 do código o comportamento é: Quando eu salvo uma nova entrada ele salva na data correta, mas quando reinicio (hot reload) a entrada salva fica no lugar errado.

Na versão 2 do código (com o "+1") quando eu salvo ele grava no lugar errado e quando atualizo daí fica no lugar certo.

Quanto ao código, é exatamente do curso.

baixei a partir daqui

https://cursos.alura.com.br/course/flutter-web-api-integracao-aplicacao/task/113141

solução!

Continuando a saga

acredito que o problema esteja na nessa parte do código no arquivo "home_screen_list.dart"

database.forEach(
    (key, value) {
      if (value.createdAt.isAfter(currentDay.subtract(Duration(days: windowPage)))) {
        int difference = value.createdAt
            .difference(currentDay.subtract(Duration(days: windowPage)))
            .inDays
            .abs();

        list[difference] = JournalCard(
          showedDate: list[difference].showedDate,
          journal: value,
          refreshFunction: refreshFunction,
        );
      }
    },
  );

Eu reescrevi essa parte com código "menos sofisticado" ficando assim

for (int i = 0; i < list.length; i++) {
    JournalCard journalCard = list[i];
    database.forEach((key, journalDatabase) {
      if (journalCard.showedDate.day==journalDatabase.createdAt.day) {
        list[i] = JournalCard(
          journal: journalDatabase,
          showedDate: journalDatabase.createdAt,
          refreshFunction: refreshFunction,
        );
      }
    });
  }

Por hora parece que resolveu, tanto adição quanto hot restart estão ok. Não sei como vai se comportar mais a frente. Se der problema volto aqui.

Mas falando sobre a solução, essa parte do código preenche entradas não nulas da lista para ser apresentada na tela. O código original, não sei porque, estava dando resultados diferentes em momentos diferentes da aplicação. O código que fiz é mais simples e vai direto na comparação entre a data em dias do dado que vem da API com a data da lista substituindo os "journals" nulos da "list" por aqueles da API.