Skip to main content

EnsureInitialized e AddPostFrameCallback | Flutter

  • WidgetsBinding.instance.addPostFrameCallback | Flutter

WidgetsFlutterBinding.ensureInitialized() e WidgetsBinding.instance.addPostFrameCallback

WidgetsFlutterBinding.ensureInitialized()

Para que serve?

Esse método é usado para garantir que o binding do Flutter esteja inicializado antes de executar qualquer código que dependa dele. Ele é frequentemente necessário em aplicações que utilizam o ServicesBinding, como quando você precisa usar plugins antes da execução completa do runApp().

Exemplo de uso:

void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(); // Exemplo de um serviço que precisa do binding inicializado
runApp(MyApp());
}

Relação com Platform Channels

Se você precisa acessar um plugin nativo (como câmera, localização, permissões, etc.) antes do runApp(), é essencial garantir que o Flutter esteja pronto para processar essas chamadas. Caso contrário, você pode encontrar erros como:

MissingPluginException (No implementation found for method X on channel Y)

Exemplo com MethodChannel
void main() async {
WidgetsFlutterBinding.ensureInitialized(); // Garante que os platform channels estão prontos

const platform = MethodChannel('com.example.app/channel');
try {
final String result = await platform.invokeMethod('getNativeValue');
print('Valor recebido do código nativo: $result');
} on PlatformException catch (e) {
print('Erro ao chamar o método nativo: ${e.message}');
}

runApp(MyApp());
}

Por que usar?

  • Garante que o Flutter esteja pronto antes de carregar recursos que precisam do binding, como:
    • Firebase
    • SharedPreferences
    • PackageInfo
    • PermissionHandler
    • Platform Channels
  • Evita erros de inicialização ao chamar métodos assíncronos antes do runApp().

WidgetsBinding.instance.addPostFrameCallback()

Para que serve?

Esse método agenda a execução de uma função depois que o primeiro frame da interface foi renderizado. Isso é útil quando você precisa realizar operações dependentes do layout já montado, como acessar tamanhos de widgets ou executar animações iniciais.

Exemplo de uso:

class MyWidget extends StatefulWidget {

_MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {

void initState() {
super.initState();

WidgetsBinding.instance.addPostFrameCallback((_) {
// Este código será executado após o primeiro frame renderizado
print("A tela foi completamente desenhada!");
});
}


Widget build(BuildContext context) {
return Scaffold(
body: Center(child: Text("Olá, Flutter!")),
);
}
}

Por que usar?

  • Para acessar propriedades de layout depois da renderização inicial (MediaQuery, GlobalKey, etc.).
  • Para disparar animações após a tela ser construída.
  • Para carregar dados pesados sem travar o build(), como requisições de API ou inicialização de estados.

Resumo

MétodoPropósitoQuando usar?
WidgetsFlutterBinding.ensureInitialized()Garante a inicialização do binding antes do runApp()Antes de inicializar plugins ou executar código assíncrono no main()
WidgetsBinding.instance.addPostFrameCallbackExecuta código após a renderização do primeiro framePara acessar propriedades de layout ou iniciar processos dependentes da UI