Qual é a diferença entre didChangeDependencies e initState?

10

Eu sou novo em agitar e quando quero chamar meu contexto no InitState, ele gera um erro: o que é isso, BuildContext.inheritFromWidgetOfExactType mas depois uso didChangeDependencies e ele funciona corretamente.

agora eu tenho 2 pergunta:

1-por que não podemos chamar nosso contexto em initState, mas não há problema para didChangeDependencies? (porque, como li no documento oficial This method is also called immediately after [initState], os dois serão chamados antes do método de compilação.)

2-por que temos acesso ao contexto fora do método build (porque lá temos build(BuildContext context)e podemos usar nosso contexto, mas em didChangeDependencies não temos nada parecido didChangeDependencies(BuildContext context), portanto, de onde podemos chamar o contexto para usá-lo)?

mohammad
fonte

Respostas:

10

O contexto de um estado está disponível para nós a partir do momento em que o Estado carrega suas dependências.

No momento em que a construção é chamada, o contexto está disponível para nós e é passado como argumento.

Agora, o initstate é chamado antes que o estado carregue suas dependências e, por esse motivo, nenhum contexto está disponível e você recebe um erro se você usar o contexto no initstate. No entanto, didChangeDependencies é chamado apenas alguns momentos depois que o estado carrega suas dependências e o contexto está disponível neste momento, então aqui você pode usar o contexto.

No entanto, ambos são chamados antes da compilação ser chamada. A única diferença é que um é chamado antes que o estado carregue suas dependências e outro é chamado alguns momentos depois que o estado carrega suas dependências.

Sanjay Singh
fonte
Pergunta rápida O @SanjaySingh initState é chamado apenas uma vez, e o didChangeDependencies? Porque eu me encontrei em um loop contínuo quando eu o uso! Agradecemos antecipadamente a sua resposta!
abrsh
@abrsh Ei, olhe, o initstate é chamado apenas uma vez quando inicializamos os dados. não podemos chamar initstate repetidamente para atualizar os dados, porque não existe um contexto para que ele não saiba quais dados atualizar (ou seja, inicialize novamente). Portanto, para remover esse problema, alteramos dependências que possuem o contexto e sabem quais dados atualizar. Então, sim, podemos chamar didchangedependencies repetidamente para atualizar / inicializar nossos dados
Sanjay Singh
1
  1. De acordo com a initStatedocumentação

Você não pode usar BuildContext.inheritFromWidgetOfExactTypedeste método. No entanto, didChangeDependenciesserá chamado imediatamente após esse método e BuildContext.inheritFromWidgetOfExactTypepoderá ser usado lá.

Então, você precisa usar BuildContext.inheritFromWidgetOfExactTypeno didChangeDependencies.

  1. Todo widget tem seu próprio context. É por isso que você tem acesso ao contexto fora do método de compilação.

Em relação build(BuildContext context), o buildmétodo aceita contextdo widget pai. Isso significa que esse parâmetro BuildContext contextnão é o contexto atual do widget, mas o contexto de seu pai.

Marat
fonte
Obrigado, entendo a segunda resposta, mas não a primeira, conheço esse comportamento, mas Qual é o motivo?
mohammad
didChangeDependencies será chamado imediatamente após initState, ok, mas por que não podemos usar BuildContext.inheritFromWidgetOfExactType em initState? (Estou entusiasmado por motivo não o comportamento)
mohammad
-2

A resposta está aqui

Esse método não deve ser chamado de construtores de widget ou dos métodos State.initState, porque esses métodos não seriam chamados novamente se o valor herdado fosse alterado. Para garantir que o widget se atualize corretamente quando o valor herdado for alterado, chame isso apenas (direta ou indiretamente) de métodos de construção, retornos de chamada de layout e pintura ou de State.didChangeDependencies.

Marat
fonte