import 'dart:async'; import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:zhiying_base_widget/pages/launch_page/launch_page.dart'; import 'package:zhiying_comm/util/log/let_log.dart'; import 'package:zhiying_comm/util/empty_util.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:webview_flutter/webview_flutter.dart'; import 'package:zhiying_comm/util/shared_prefe_util.dart'; import 'package:zhiying_comm/util/global_config.dart'; class BaseWebview extends StatefulWidget { final Map model; const BaseWebview(this.model, {Key key}) : super(key: key); @override _BaseWebviewState createState() => _BaseWebviewState(); } class _BaseWebviewState extends State { String _url; String _title; WebViewController _webViewController; bool _isiOSReview = false; double progress = 0.0; Timer timer; @override void initState() { _url = widget.model['url'] ?? ''; _settingIosReview(); super.initState(); } @override void dispose() { // TODO: implement dispose timer?.cancel(); super.dispose(); } loadData() { print("加载数据"); progress = 0.0; if(timer?.isActive??false){ timer?.cancel(); } timer = Timer.periodic(Duration(milliseconds: 10), (timer) { if (progress > 0.8) { progress = progress + 0.01; } else if (progress > 0.7) { progress = progress + 0.002; } else if (progress > 0.5) { progress += 0.005; } else { progress = progress + 0.01; } if (progress > 1.1) { timer.cancel(); } setState(() {}); }); } void _settingIosReview() async { String is_ios_review = await SharedPreferencesUtil.getStringValue(GlobalConfig.IS_IOS_REVIEW, defaultVal: '0'); setState(() { if (is_ios_review == '1') { _isiOSReview = true; print(_isiOSReview); } }); } @override Widget build(BuildContext context) { return Scaffold( appBar: _createNav(), backgroundColor: Colors.white, body: Stack( children: [ WebView( initialUrl: _url, javascriptMode: JavascriptMode.unrestricted, onWebViewCreated: (WebViewController webViewController) { _webViewController = webViewController; loadData(); }, navigationDelegate: (NavigationRequest request) async { // 解决Android的拼多多webview 转发的问题 if (Platform.isAndroid) { String url = request?.url?.toString(); if (!EmptyUtil.isEmpty(url) && !url.startsWith('https://') && !url.startsWith('http://')) { Logger.log('navigation url = $url'); // if(await canLaunch(url)){ // await launch(url); // } return NavigationDecision.prevent; } } return NavigationDecision.navigate; }, onPageStarted: (String url) { print('Page started loading: $url'); }, onPageFinished: (String url) { if(progress<0.8){ progress = 0.8; } setState(() {}); print('Page finished loading: $url'); _webViewController.getTitle().then((title) { _title = title; setState(() {}); }); }, gestureNavigationEnabled: true, ), progress <= 1.0 ? _createProgress() : Container(), ], ), ); } // 导航栏 Widget _createNav() { return CupertinoNavigationBar( border: Border( bottom: BorderSide( width: 0.0, // One physical pixel. style: BorderStyle.none, ), ), backgroundColor: Colors.white, leading: Navigator.canPop(context) ? GestureDetector( child: Container( padding: EdgeInsets.zero, child: Icon( Icons.arrow_back_ios, size: 20, ), ), onTap: () { if (Navigator.canPop(context)) { Navigator.pop(context); } }, ) : Container(), middle: Text( _title ?? '', maxLines: 1, style: TextStyle( fontSize: 15, color: Color(0xff333333), ), ), trailing: GestureDetector( child: _isiOSReview ? Container() : Icon( Icons.refresh, size: 20, ), onTap: () { _webViewController.reload(); loadData(); }, ), ); } _createProgress() { return Container( constraints: BoxConstraints(maxHeight: 2), child: LinearProgressIndicator( backgroundColor: Colors.white, valueColor: AlwaysStoppedAnimation(Colors.red), value: progress, ), ); } }