使用flutter_webview_plugin 加載一個(gè)H5頁(yè)面罩锐,是從dart頁(yè)面中跳轉(zhuǎn)h5頁(yè)面侦高,h5頁(yè)面中可返回dart頁(yè)面停巷,也可跳轉(zhuǎn)到其他dart頁(yè)面师坎。
經(jīng)測(cè)試恕酸,在Android上可正常使用,但在ios上關(guān)閉web頁(yè)面時(shí)顯示白屏胯陋,web頁(yè)面并沒(méi)有close蕊温,還沒(méi)找到原因。遏乔。义矛。
import 'dart:io';
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:nav_router/nav_router.dart'; // 路由插件
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
import 'class_room.dart'; // dart文件
class ClassRoomWebView extends StatefulWidget {
ClassRoomWebView({this.url}) : super();
final String url; // 外部傳入的URL
@override
_ClassRoomWebViewState createState() => _ClassRoomWebViewState();
}
class _ClassRoomWebViewState extends State<ClassRoomWebView> {
BuildContext _context;
FlutterWebviewPlugin flutterWebviewPlugin = FlutterWebviewPlugin();
double _navBarHeight = 27;// 劉海高度
@override
void initState() {
super.initState();
flutterWebviewPlugin.onUrlChanged.listen((loadUrl){
//WebviewScaffold 加載的url變化時(shí)觸發(fā)此方法
// print('===>>當(dāng)前 url:$loadUrl');
// h5 點(diǎn)退出按鈕,關(guān)閉webView
if (loadUrl.endsWith('/backapp')){
flutterWebviewPlugin.close();
pop();
}
// 跳轉(zhuǎn)到dart頁(yè)面
else if (loadUrl.endsWith('/policy')){
// 因?yàn)閒lutter_webview_plugin 是浮在flutterUI上的一層視圖盟萨,它不在widget樹(shù)中凉翻,跳轉(zhuǎn)到dart頁(yè)面時(shí),需要隱藏掉web頁(yè)面捻激,再跳回來(lái)時(shí)再顯示web頁(yè)面
flutterWebviewPlugin.hide();
routePush(ClassRoomPage()).then((value) {
flutterWebviewPlugin.show();
flutterWebviewPlugin.reloadUrl(widget.url);
});
//跳轉(zhuǎn)到dart頁(yè)面時(shí)制轰,也可以關(guān)閉掉web頁(yè)面前计,再跳回來(lái)時(shí)再創(chuàng)建一個(gè)web頁(yè)面
// flutterWebviewPlugin.close();
// routePush(ClassRoomPage()).then((value){
// flutterWebviewPlugin.launch(widget.url,
// rect: new Rect.fromLTWH( // 設(shè)置web頁(yè)面的尺寸
// 0.0,
// _navBarHeight,
// MediaQuery.of(_context).size.width,
// MediaQuery.of(_context).size.height-_navBarHeight,
// ),
// );
// });
}
});
//加載錯(cuò)誤時(shí)監(jiān)聽(tīng)
// flutterWebviewPlugin.onHttpError.listen((error){
// print('加載錯(cuò)誤:${error.code} ${error.url}');
// });
//加載狀態(tài)變化監(jiān)聽(tīng)
// flutterWebviewPlugin.onStateChanged.listen((state){
// print('狀態(tài)監(jiān)聽(tīng):${state.type.toString()}');
// });
}
@override
void dispose() {
flutterWebviewPlugin.dispose(); // 頁(yè)面退出時(shí)銷毀flutter_webview_plugin
super.dispose();
}
@override
Widget build(BuildContext context) {
_context = context;
_navBarHeight = MediaQuery.of(context).padding.top; //屏幕劉海高度
return WebviewScaffold(
// 導(dǎo)航欄是H5頁(yè)面的,這里需要留出劉海的高度
appBar: PreferredSize(
child: Container(
color: Colors.white,
),
preferredSize: Size.fromHeight(0)
),
url: widget.url,
initialChild: Container(
color: Colors.green,
child: Center(
child: Text('加載中...',style: TextStyle(fontSize: 14, color: Colors.black),),
),
),
);
}
}