webview_page.dart 3.86 KB
import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:one_key/utils/event_bus.dart';
import 'package:one_key/widgets/app_bar.dart';
import 'package:one_key/widgets/system_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
  void initState() {
    super.initState();
    // Enable hybrid composition.
    if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
  }

  @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: SystemAppBar(
        '一键订',
        onTap: () {
          EventBus().emit('changeStatusColor');
          Navigator.of(context).pop();
        },
      ),
      body: Builder(builder: (BuildContext context) {
        return WebView(
          initialUrl: 'https://support.qq.com/product/152856',
          javascriptMode: JavascriptMode.unrestricted,
          onWebViewCreated: (WebViewController webViewController) {
            _controller.complete(webViewController);
          },
          onProgress: (int progress) {
            print('WebView is loading (progress : $progress%)');
          },
          javascriptChannels: <JavascriptChannel>{
            _toasterJavascriptChannel(context),
          },
          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,
          // backgroundColor: const Color(0x00000000),
        );
        // 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)),
          );
        });
  }
}