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étodo | Propósito | Quando 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.addPostFrameCallback | Executa código após a renderização do primeiro frame | Para acessar propriedades de layout ou iniciar processos dependentes da UI |