|
|
|
import 'dart:async';
|
|
|
|
import 'dart:convert';
|
|
|
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:one_key/widgets/app_bar.dart';
|
|
|
|
import 'package:webview_flutter/webview_flutter.dart';
|
|
|
|
|
|
|
|
class WebViewPage extends StatefulWidget {
|
|
|
|
|
|
|
|
@override
|
|
|
|
_WebViewPageState createState() => _WebViewPageState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _WebViewPageState extends State<WebViewPage> {
|
|
|
|
final Completer<WebViewController> _controller =
|
|
|
|
Completer<WebViewController>();
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
return Scaffold(
|
|
|
|
// We're using a Builder here so we have a context that is below the Scaffold
|
|
|
|
// to allow calling Scaffold.of(context) so we can show a snackbar.
|
|
|
|
appBar: AppBar(
|
|
|
|
title: const Text('一键订'),
|
|
|
|
// This drop down menu demonstrates that Flutter widgets can be shown over the web view.
|
|
|
|
),
|
|
|
|
body: Builder(builder: (BuildContext context) {
|
|
|
|
return WebView(
|
|
|
|
initialUrl: "https://support.qq.com/product/152856",
|
|
|
|
javascriptMode: JavascriptMode.unrestricted,
|
|
|
|
onWebViewCreated: (WebViewController webViewController) {
|
|
|
|
_controller.complete(webViewController);
|
|
|
|
},
|
|
|
|
// TODO(iskakaushik): Remove this when collection literals makes it to stable.
|
|
|
|
// ignore: prefer_collection_literals
|
|
|
|
javascriptChannels: <JavascriptChannel>[
|
|
|
|
_toasterJavascriptChannel(context),
|
|
|
|
].toSet(),
|
|
|
|
navigationDelegate: (NavigationRequest request) {
|
|
|
|
if (request.url.startsWith('https://www.youtube.com/')) {
|
|
|
|
print('blocking navigation to $request}');
|
|
|
|
return NavigationDecision.prevent;
|
|
|
|
}
|
|
|
|
print('allowing navigation to $request');
|
|
|
|
return NavigationDecision.navigate;
|
|
|
|
},
|
|
|
|
onPageStarted: (String url) {
|
|
|
|
print('Page started loading: $url');
|
|
|
|
},
|
|
|
|
onPageFinished: (String url) {
|
|
|
|
print('Page finished loading: $url');
|
|
|
|
},
|
|
|
|
gestureNavigationEnabled: true,
|
|
|
|
);
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
JavascriptChannel _toasterJavascriptChannel(BuildContext context) {
|
|
|
|
return JavascriptChannel(
|
|
|
|
name: 'Toaster',
|
|
|
|
onMessageReceived: (JavascriptMessage message) {
|
|
|
|
Scaffold.of(context).showSnackBar(
|
|
|
|
SnackBar(content: Text(message.message)),
|
|
|
|
);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
} |
|
|
\ No newline at end of file |
...
|
...
|
|