🕸️WebView no Flutter
Documentação Avançada de Uso de WebView com Flutter e Comunicação entre Canais JavaScript
1. Introdução
Esta documentação explica como criar uma aplicação em Flutter com uma WebView, focando principalmente na comunicação bidirecional entre a aplicação Flutter e a página web carregada. Especificamente, abordaremos os canais JavaScript para a comunicação entre as duas plataformas.
2. Configurações Iniciais
Dependências
Adicione as dependências necessárias ao seu pubspec.yaml
:
dependencies:
flutter:
sdk: flutter
webview_flutter: ^latest_version
Importações
Faça as importações apropriadas:
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
3. Implementação da WebView
A WebView pode ser implementada usando o widget WebView
. No exemplo, uma WebView é colocada em um widget Stack
para permitir animações de carregamento.
WebViewWidget(
controller: _controller,
),
4. Comunicação Avançada com Canais JavaScript
Canais JavaScript para Comunicação Unidirecional (Web para Flutter)
Canais JavaScript são interfaces que permitem enviar mensagens do código JavaScript da página web para o código Dart na aplicação Flutter. No exemplo, três canais são definidos para diferentes ações: LOGOUT
, LOGIN
, e verifyIsWebview
.
_controller
..addJavaScriptChannel(
'LOGOUT',
onMessageReceived: (message) {
// O código Dart para deslogar o usuário é chamado aqui
_loginStore.logout(context);
},
)
// ...
Nesse caso, o código JavaScript no lado da web pode emitir um evento para o canal 'LOGOUT', e o método _loginStore.logout(context)
será chamado no código Dart.
Comunicação Bidirecional com runJavaScriptReturningResult
runJavaScriptReturningResult
Para enviar dados do Flutter para a WebView, você pode usar o método runJavaScriptReturningResult
. No código Dart, após ouvir o canal 'verifyIsWebview' sendo acionado pela página web, o Flutter pode enviar dados de volta para a WebView usando este método.
No exemplo, um objeto UserWebView
é usado para passar dados de um usuário autenticado para a página web. O trecho de código abaixo é executado quando o evento 'verifyIsWebview' é recebido:
_controller.addJavaScriptChannel(
'verifyIsWebview',
onMessageReceived: (message) async {
if (isAuthenticated) {
_controller.runJavaScriptReturningResult(
'''onWebviewLogin = new CustomEvent('onWebviewLogin', {
detail: '{
"displayName": "${userWebView.displayName}",
"email": "${userWebView.email}",
"photoURL": "${userWebView.photoUrl}",
"accessToken": "${userWebView.acessToken}",
"uid": "${userWebView.uid}"
}'
})
window.dispatchEvent(onWebviewLogin);'''
);
}
// ... outros códigos
},
)
Neste caso, se o usuário estiver autenticado (isAuthenticated == true
), o evento 'onWebviewLogin' será disparado na página web, e o JavaScript na página web pode ouvir este evento para obter as informações do usuário.
Essa é uma forma de comunicação bidirecional: primeiro, a página web emite um evento 'verifyIsWebview', o Flutter ouve e responde enviando dados do usuário através de um novo evento JavaScript, 'onWebviewLogin'.
5. Eventos de Navegação e Carregamento
Monitoramento do Progresso de Carregamento
O método onProgress
do NavigationDelegate
é chamado sempre que há uma alteração no progresso de carregamento da página web. No exemplo, o estado showLoading
é atualizado para controlar a visibilidade da animação de carregamento.
_controller.setNavigationDelegate(
NavigationDelegate(
onProgress: (int progress) {
// ...
},
// ...
),
)
6. Conclusão
A integração da WebView com o Flutter é um recurso poderoso, especialmente quando combinado com canais JavaScript para comunicação. Este recurso permite criar experiências de usuário ricas e dinâmicas que tiram proveito tanto do ambiente nativo quanto das capacidades da web. Espera-se que esta documentação tenha fornecido insights detalhados sobre como estabelecer essa comunicação bidirecional eficazmente.
Last updated