Flutter:封裝一個簡易的網頁瀏覽器

先看效果圖


WechatIMG306.jpeg

然后是代碼



import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:wanandroid/utils/ScreenUtils.dart';
import 'package:webview_flutter/webview_flutter.dart';

class WebViewBrowser extends StatefulWidget{

  @override
  _WebViewBrowserState createState() {
    return _WebViewBrowserState();
  }
}

class _WebViewBrowserState extends State<WebViewBrowser>{

  /// 當前頁的標題
  String _title = "";
  /// 獲取當前標題
  void _getNavTitle() async {
    _title = _webViewController!=null ? await _webViewController.getTitle():"";
  }
  /// WebViewController對象
  WebViewController _webViewController;
  /// 頁面加載結束
  bool _loadingEnded = true;
  /// 是否可以返回
  bool _canGoBack = false;
  /// 操作面板按鈕
  IconButton _shareButton;


  @override
  void initState() {
    super.initState();

    _loadingEnded = true;
    _canGoBack = false;
    /// 根據加載狀態(tài)顯示分享按鈕還是進度提示
    _shareButton = IconButton(icon: Icon(Icons.more_horiz_rounded), onPressed: (){
      _operationAction();
    });
  }

  @override
  Widget build(BuildContext context) {

    var _url = (ModalRoute.of(context).settings.arguments).toString() ?? "https://www.baidu.com";

    return Scaffold(
      appBar: AppBar(
        brightness: Brightness.dark,
        automaticallyImplyLeading: true,
        toolbarHeight: Screen.navigationBarHeight,
        elevation: 1,
        title: _loadingEnded?Text(_title,style: TextStyle(fontSize: 14),maxLines: 2):CupertinoActivityIndicator(),
        centerTitle: false,
        leadingWidth: 54,
        /// 返回按鍵
        leading: IconButton(icon: Icon(Icons.arrow_back), onPressed: () async {
          if(_canGoBack == true){
            _webViewController.goBack();
          }else{
            if(Navigator.canPop(context)){ Navigator.pop(context); }
          }
        }),
        /// 分享按鈕和關閉按鈕
        actions: _canGoBack==true?[
          //關閉當前頁面
          IconButton(icon: Icon(Icons.close), onPressed: (){
            if(Navigator.canPop(context)){ Navigator.pop(context); }
          }),
          // 彈出操作面板
          _shareButton
        ]:[ _shareButton ]
      ),
      body: WebView(
        initialUrl: _url,
        javascriptMode: JavascriptMode.unrestricted,
        gestureNavigationEnabled: true,
        debuggingEnabled: true,
        onWebViewCreated: (webViewController)async{
          _webViewController = webViewController;
          _loadingEnded = false;
          _canGoBack = await _webViewController.canGoBack();
          _getNavTitle();
          setState(() {
          });
        },
        onPageStarted: (currentUrl)async{
          _loadingEnded = false;
          _title = currentUrl;
          _canGoBack = await _webViewController.canGoBack();
          _getNavTitle();
          setState(() {
          });
        },
        onPageFinished: (currentUrl) async{
          _loadingEnded = true;
          _canGoBack = await _webViewController.canGoBack();
          _getNavTitle();
          setState(() {
          });
        },
        onWebResourceError: (error){
          _title = error.description;
          setState(() {
          });
        },
        navigationDelegate: (delegate){
          // if (delegate.url.startsWith('alipay:') ||
          //     delegate.url.startsWith('weixin:')) {
          //   return NavigationDecision.prevent;
          // }
          return NavigationDecision.navigate;
        },
      ),
    );
  }

  @override
  void dispose() {
    super.dispose();
  }

  /// 在這里顯示操作面板
  void _operationAction(){

  }
}

Flutter小白歡迎各位大佬進行指教溅呢,謝謝了琢唾。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蛔六,一起剝皮案震驚了整個濱河市擎鸠,隨后出現(xiàn)的幾起案子睦焕,更是在濱河造成了極大的恐慌红省,老刑警劉巖策菜,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晶疼,死亡現(xiàn)場離奇詭異,居然都是意外死亡又憨,警方通過查閱死者的電腦和手機翠霍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蠢莺,“玉大人壶运,你說我怎么就攤上這事±嗣兀” “怎么了蒋情?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耸携。 經常有香客問我棵癣,道長,這世上最難降的妖魔是什么夺衍? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任狈谊,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘河劝。我一直安慰自己壁榕,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布赎瞎。 她就那樣靜靜地躺著牌里,像睡著了一般。 火紅的嫁衣襯著肌膚如雪务甥。 梳的紋絲不亂的頭發(fā)上牡辽,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音敞临,去河邊找鬼态辛。 笑死,一個胖子當著我的面吹牛挺尿,可吹牛的內容都是我干的奏黑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼编矾,長吁一口氣:“原來是場噩夢啊……” “哼熟史!你這毒婦竟也來了?” 一聲冷哼從身側響起洽沟,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤以故,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后裆操,有當地人在樹林里發(fā)現(xiàn)了一具尸體怒详,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年踪区,在試婚紗的時候發(fā)現(xiàn)自己被綠了昆烁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡缎岗,死狀恐怖静尼,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情传泊,我是刑警寧澤鼠渺,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站眷细,受9級特大地震影響拦盹,放射性物質發(fā)生泄漏。R本人自食惡果不足惜溪椎,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一普舆、第九天 我趴在偏房一處隱蔽的房頂上張望恬口。 院中可真熱鬧,春花似錦沼侣、人聲如沸祖能。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽养铸。三九已至,卻和暖如春雅潭,著一層夾襖步出監(jiān)牢的瞬間揭厚,已是汗流浹背却特。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工扶供, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裂明。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓椿浓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闽晦。 傳聞我的和親對象是個殘疾皇子扳碍,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容