Как дождаться завершения загрузки WebView после запуска функции JavaScript и отображения html во флаттере?
Я хотел получить готовый загруженный HTML-код веб-сайта из моего headlessWebView, но изначально веб-сайт выполняет некоторые js.
Вот шаги, чтобы получить то, что я хочу:
- Откройте сайт,
- Запустите функцию javascript, чтобы заполнить некоторый контент в текстовом поле, и нажмите "Отправить",
- Подождите, пока веб-сайт выполнит js и завершит загрузку,
- Сохраните результаты веб-просмотра в виде HTML-кода в строке.
Это мой код ниже:
final GlobalKey webViewKey = GlobalKey();
InAppWebViewGroupOptions options = InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(
useShouldOverrideUrlLoading: true,
mediaPlaybackRequiresUserGesture: false,
),
android: AndroidInAppWebViewOptions(
useHybridComposition: true,
),
ios: IOSInAppWebViewOptions(
allowsInlineMediaPlayback: true,
));
HeadlessInAppWebView headlessWebView;
String htmlCode = "";
@override
void initState() {
super.initState();
headlessWebView = new HeadlessInAppWebView(
initialUrlRequest: URLRequest(URL:
Uri.parse("https://example.com/")),
initialOptions: options,
/*InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(),
),*/
shouldOverrideUrlLoading: (controller, navigationAction) async {
var uri = navigationAction.request;
headlessWebView.webViewController.loadUrl(urlRequest: uri);
return NavigationActionPolicy.ALLOW;
},
onWebViewCreated: (controller) {
print('HeadlessInAppWebView created!');
},
onConsoleMessage: (controller, consoleMessage) {
print("CONSOLE MESSAGE: " + consoleMessage.message);
},
onLoadStart: (controller, url) async {
print("onLoadStart $url");
setState(() {
this.url = url.toString();
});
},
onLoadStop: (controller, url) async {
print("onLoadStop $url");
String jsscript =
"javascript:(function() { document.getElementById(\"text_feild\").value ='" +
"sometext" +
"';document.getElementById(\"submit\").click();})();";
await headlessWebView.webViewController
.evaluateJavascript(source: jsscript);
var result = await headlessWebView.webViewController.evaluateJavascript(
source:
"javascript:document.getElementsByTagName('a')[5].getAttribute('href').outerHTML;");
log(result.toString());
htmlCode = result.toString();
},
onUpdateVisitedHistory: (controller, url, androidIsReload) {
print("onUpdateVisitedHistory $url");
setState(() {
this.url = url.toString();
});
},
);
В журнале появляется ошибка (result.toString()); Он всегда равен нулю.
1 ответ
Попробуйте это, чтобы получить HTML-код в строке, которую я сейчас использую, это мое приложение, оно отлично работает.
onLoadStop:
(InAppWebViewController controller, String url) async {
print("onLoadStop: " + url);
var html = await controller.evaluateJavascript(
source:
"window.document.getElementsByTagName('html')[0].outerHTML;");
}