ExpressionChangedAfterItHasBeenCheckedError Explained

Explique-me por que continuo recebendo este erro:ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked.

Obviamente, eu só o obtenho no modo dev, isso não acontece na minha produção, mas é muito chato e simplesmente não entendo os benefícios de ter um erro no meu ambiente dev que não aparece no produto - Provavelmente por causa da minha falta de entendimento.

Normalmente, a correção é fácil, apenas envolvo o erro que causa o código em um setTimeout como este:

setTimeout(()=> {
    this.isLoading = true;
}, 0);

Ou force a detecção de alterações com um construtor como este:constructor(private cd: ChangeDetectorRef) {}:

this.isLoading = true;
this.cd.detectChanges();

Mas por que constantemente encontro esse erro? Quero entender para evitar essas correções hacky no futuro.

questionAnswers(16)

yourAnswerToTheQuestion