webview_flutter_x5 2.0.8+7 copy "webview_flutter_x5: ^2.0.8+7" to clipboard
webview_flutter_x5: ^2.0.8+7 copied to clipboard

outdated

A Flutter plugin that provides a WebView widget on Android and iOS which Android's core is tencent x5.

example/lib/main.dart

import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:webview_flutter_x5/webview_flutter.dart';
import 'package:webview_flutter/webview_flutter.dart' as OriginWebview;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Webview demp',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({this.title = ''});

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  late FocusNode _focusNode;

  @override
  void initState() {
    super.initState();
    _focusNode = FocusNode();
  }

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    // return Container();
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            GestureDetector(
              onTap: () {
                WebviewFlutterX5.initX5(needPermissionCallback: (List<String> permissions) async {
                  List<Permission> permissionList = [];
                  for (final item in permissions) {
                    if (item == 'camera') {
                      permissionList.add(Permission.camera);
                    } else if (item == 'storage') {
                      permissionList.add(Permission.storage);
                    }
                  }
                  if (permissionList.isNotEmpty) {
                    Map<Permission, PermissionStatus> statuses = await permissionList.request();
                    print('dart层权限: $permissions $statuses');
                  }
                });
              },
              child: Container(
                width: 100.0,
                height: 45.0,
                color: Colors.blue[200],
                alignment: Alignment.center,
                child: Text(
                  'X5初始化',
                ),
              ),
            ),
            GestureDetector(
              onTap: () {
                Navigator.push(context, MaterialPageRoute(builder: (_) {
                  return Scaffold(
                    appBar: AppBar(
                      title: Text('X5内核加载状态'),
                    ),
                    body: SafeArea(child: WebviewPage('http://soft.imtt.qq.com/browser/tes/feedback.html')),
                  );
                }));
              },
              child: Container(
                width: 100.0,
                height: 45.0,
                margin: EdgeInsets.only(top: 20),
                color: Colors.blue[200],
                alignment: Alignment.center,
                child: Text(
                  'X5内核加载状态',
                ),
              ),
            ),
            GestureDetector(
              onTap: () {
                Navigator.push(context, MaterialPageRoute(builder: (_) {
                  return Scaffold(
                    appBar: AppBar(
                      title: Text('x5内核加载测试'),
                    ),
                    body: SafeArea(child: WebviewPage('http://debugtbs.qq.com/')),
                  );
                }));
              },
              child: Container(
                width: 100.0,
                height: 45.0,
                margin: EdgeInsets.only(top: 20),
                color: Colors.blue[200],
                alignment: Alignment.center,
                child: Text(
                  'x5内核加载测试',
                ),
              ),
            ),
            GestureDetector(
              onTap: () async {
                if (_focusNode.hasFocus) {
                  _focusNode.unfocus();
                }
                String url2 =
                    'https://mobilearticlecorrectiongray.tvs.qq.com/?appkey=ea069a10392011eb81764326c026bb6d#/en/real_questions?auth=QQSTUDY%201759fd197e51d7cddede51d5f7fe15ae%2C3db34f7ca58f53cb01b94de3d9b99d49';
                await Navigator.push(context, MaterialPageRoute(builder: (_) {
                  return Scaffold(
                    appBar: AppBar(
                      title: Text('测试'),
                    ),
                    body: SafeArea(child: WebviewPage(url2)),
                  );
                }));
              },
              child: Container(
                width: 100.0,
                height: 45.0,
                margin: EdgeInsets.only(top: 20),
                color: Colors.blue[200],
                alignment: Alignment.center,
                child: Text(
                  '测试',
                ),
              ),
            ),
            GestureDetector(
              onTap: () async {
                if (_focusNode.hasFocus) {
                  _focusNode.unfocus();
                }
                String url2 = 'https://www.baidu.com/';
                await Navigator.push(context, MaterialPageRoute(builder: (_) {
                  return Scaffold(
                    appBar: AppBar(
                      title: Text('官方webview插件'),
                    ),
                    body: SafeArea(
                        child: OriginWebview.WebView(
                      initialUrl: url2,
                    )),
                  );
                }));
              },
              child: Container(
                width: 100.0,
                height: 45.0,
                margin: EdgeInsets.only(top: 20),
                color: Colors.blue[200],
                alignment: Alignment.center,
                child: Text(
                  '官方webview插件',
                ),
              ),
            ),
            GestureDetector(
              onTap: () async {
                await WebviewFlutterX5.canGetDeviceId(false);
              },
              child: Container(
                width: 100.0,
                height: 45.0,
                margin: EdgeInsets.only(top: 20),
                color: Colors.blue[200],
                alignment: Alignment.center,
                child: Text(
                  '禁止获取imei',
                ),
              ),
            ),
            GestureDetector(
              onTap: () async {
                await WebviewFlutterX5.canGetSubscriberId(false);
              },
              child: Container(
                width: 100.0,
                height: 45.0,
                margin: EdgeInsets.only(top: 20),
                color: Colors.blue[200],
                alignment: Alignment.center,
                child: Text(
                  '禁止获取IMSI',
                ),
              ),
            ),
            GestureDetector(
              onTap: () async {
                await WebviewFlutterX5.canGetAndroidId(false);
              },
              child: Container(
                width: 100.0,
                height: 45.0,
                margin: EdgeInsets.only(top: 20),
                color: Colors.blue[200],
                alignment: Alignment.center,
                child: Text(
                  '禁止获取AndroidID',
                ),
              ),
            ),
            GestureDetector(
              onTap: () async {
                await WebviewFlutterX5.forbidPhoneAndSn();
              },
              child: Container(
                width: 100.0,
                height: 45.0,
                margin: EdgeInsets.only(top: 20),
                color: Colors.blue[200],
                alignment: Alignment.center,
                child: Text(
                  '禁止SN和手机型号获取',
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class WebviewPage extends StatefulWidget {
  WebviewPage(this.url);

  final String url;

  @override
  _WebviewPageState createState() => _WebviewPageState();
}

class _WebviewPageState extends State<WebviewPage> {
  final Completer<WebViewController> _completer = Completer<WebViewController>();
  bool loading = true;

  @override
  void initState() {
    super.initState();
    // Enable hybrid composition.
    if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: [
        WebView(
          initialUrl: widget.url,
          onWebViewCreated: _completer.complete,
          javascriptMode: JavascriptMode.unrestricted,
          onPageStarted: (url) {
            print('web view page test: start url:$url');
          },
          onPageFinished: (url) {
            print('web view page test: finish url:$url');
            setState(() {
              loading = false;
            });
          },
          navigationDelegate: (request) {
            print('web view page test: url:${widget.url}');
            // if (request.url.startsWith('http://')) {
            //   request.url.replaceFirst('http://', 'https://');
            // }
            print('web view page test: url:${widget.url}');
            return NavigationDecision.navigate;
          },
        ),
        loading ? Center(child: CircularProgressIndicator()) : Container(),
      ],
    );
  }
}
6
likes
0
pub points
68%
popularity

Publisher

unverified uploader

A Flutter plugin that provides a WebView widget on Android and iOS which Android's core is tencent x5.

Homepage
Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

flutter

More

Packages that depend on webview_flutter_x5