2023-12-26
上面三个插件按需引入
flutter_html: ^3.0.0-alpha.3 webview_flutter: ^3.0.2 url_launcher: ^6.1.0
WebView( initialUrl: : _url, //是否开启JS javascriptMode: JavascriptMode.unrestricted, ///WebView创建 onWebViewCreated: _onWebViewCreated, ///页面开始加载 onPageStarted: _onPageStarted, ///页面加载家属 onPageFinished: _onPageFinished, ///如果出现错误 onWebResourceError: (WebResourceError error) => debugPrint('error:${error.description}'), )), void _onWebViewCreated(WebViewController controller) async { webViewController = controller; _controller.complete(controller); webViewController!.clearCache(); } void _onPageStarted(String url) { EasyLoading.show(); } void _onPageFinished(String url) async { EasyLoading.dismiss(); }
加载本地网页的时候需要在WebViewCreated的时候调用方法来获取本地html文件
_loadHtmlFromAssets() async { String fileHtmlContents = await rootBundle.loadString(_url); webViewController?.loadUrl(Uri.dataFromString(fileHtmlContents, mimeType: 'text/html', encoding: Encoding.getByName('utf-8')) .toString()); }
这里使用的是HTML插件 封装起来非常的简单
class HtmlRichText extends StatelessWidget { final String richText; final Map? style; const HtmlRichText({Key? key, this.richText = "内容为空", this.style}) : super(key: key); @override Widget build(BuildContext context) { return ListView( children: [ Html( data: richText, style: style ?? {}, ) ], ); }}
onJumpTo 这个是你之前定义路由器的时候跳转方法 这里需要你自己去实现
加载网络地址
onJumpTo(name: RouterName.webViewPage, arguments: { "title": "百度一下, "url": "https://www.baidu.com", "isLocalUrl": false, });
加载 本地地址
onJumpTo(name: RouterName.webViewPage, arguments: { "title": "我自己的文件,/// 你自己存储的文件路径 这个路径还需要在 pubspec.yaml中注册 "url": "assets/html/html.html", "isLocalUrl": true, });
加载代码段
onJumpTo(name: RouterName.webViewPage, arguments:
class WebViewPage extends StatefulWidget { final Map? arguments; const WebViewPage({Key? key, this.arguments}) : super(key: key); @override State createState() => _WebViewPageState();}class _WebViewPageState extends State { WebViewController? webViewController; final Completer _controller = Completer(); String _title = ""; String _url = ""; String _richText = ""; bool _isLocalUrl = false; bool _isShowAppBar = true; @override void initState() { super.initState(); _title = StringUtil.isNotEmpty(widget.arguments?["title"]) ? widget.arguments!["title"] : ""; _url = StringUtil.isNotEmpty(widget.arguments?["url"]) ? widget.arguments!["url"] : ""; _richText = StringUtil.isNotEmpty(widget.arguments?["richText"]) ? widget.arguments!["richText"] : ""; _isLocalUrl = widget.arguments?["isLocalUrl"] ?? false; _isShowAppBar = widget.arguments?["isShowAppBar"] ?? true; } @override void dispose() { EasyLoading.dismiss(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: _isShowAppBar ? ComAppBar.buildNormal(center: Text(_title)) : null, body: WillPopScope( onWillPop: () async { goBack(); return false; }, child: ((StringUtil.isEmpty(_url) && !_isLocalUrl) || (_isLocalUrl && (StringUtil.isEmpty(_richText) && StringUtil.isEmpty(_url)))) ? Container( padding: EdgeInsets.all(ScreenHelper.width(18)), child: const Center( child: Text("当前路径为空"), ), ) : _isLocalUrl && StringUtil.isNotEmpty(_richText) ? HtmlRichText( richText: _richText, ) : WebView( initialUrl: _isLocalUrl ? "" : _url, //是否开启JS javascriptMode: JavascriptMode.unrestricted, ///WebView创建 onWebViewCreated: _onWebViewCreated, ///页面开始加载 onPageStarted: _onPageStarted, ///页面加载家属 onPageFinished: _onPageFinished, ///如果出现错误 onWebResourceError: (WebResourceError error) => debugPrint('error:${error.description}'), )), ); } goBack() async { if (webViewController == null) { NavigatorUtil().pop(); return; } bool goBack = await webViewController!.canGoBack(); if (goBack) { webViewController!.goBack(); } else { NavigatorUtil().pop(); } } void _onWebViewCreated(WebViewController controller) async { webViewController = controller; if (_isLocalUrl) { await _loadHtmlFromAssets(); } _controller.complete(controller); webViewController!.clearCache(); } void _onPageStarted(String url) { EasyLoading.show(); } void _onPageFinished(String url) async { if (_isLocalUrl) { //加载js文件 // String jsContent = await rootBundle.loadString(jsPath); // webViewController?.runJavascript(jsContent); //加载js脚本 _webViewController.runJavascriptReturningResult("setname('hsw')").then((value) => { // print(value) } EasyLoading.dismiss(); } _loadHtmlFromAssets() async { String fileHtmlContents = await rootBundle.loadString(_url); webViewController?.loadUrl(Uri.dataFromString(fileHtmlContents, mimeType: 'text/html', encoding: Encoding.getByName('utf-8')) .toString()); }}
2025-02-13
2025-02-13
专为校服企业量身打造的校服订购商城,操作简单,订购高效,尺码按需选购,帮助校服企业实现数字化生产,减少库存压力,提高校服企业的工作效率,节省人工成本,减轻学校订购压力。
2025-02-13
几度互联最新智慧粮仓项目旨在利用先进的信息技术、物联网技术和自动化控制技术,构建一个全方位、智能化的粮食仓储管理系统,实现对粮情的实时监测、精准控制和高效管理,确保粮食储存安全,降低损耗,提高仓储运营效率。
2025-02-13
自运营一个无人售货机品牌需要系统性的规划和多方面的准备,以下是从市场调研到长期运营优化的关键步骤和建议
2024-12-28