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()); }}
2024-05-08
2024-05-06
几度互联保障房管理系统开发是为了落实中央关于住房保障的相关政策,实现对低收入家庭住房状况的调查管理、保障计划及落实管理、保障申请及审核管理、保障户和保障房源档案管理等。
针对政府保障房产管理的一站式解决方案,专注于为解决复杂、繁琐的管理问题。通过强大的软件功能和卓越的技术支持,帮助您提高工作效率、简化业务流程,实现更高效、更便捷的房产管理。
2024-04-30
最近很多客户咨询,抖音小程序怎么做,淘宝小程序可不可以做?其实确实,我们好像提到小程序就是默认为是微信小程序,确实微信是最早提出和开发小程序的。
那么关于几度互联抖音小程序和淘宝小程序能不能做?开发一个这样的小程序要多少钱?
2024-04-30
随着互联网的快速发展,网约车、打车小程序等新型出行方式已经成为了人们日常出行的主要选择之一。这些应用程序不仅方便快捷,还可以帮助乘客更快速地找到合适的车辆,同时为司机提供更多的接单机会。那么,如何开发一个网约车、打车小程序,让用户随时随地享受专车接送呢?本文将为您揭秘其中的奥秘。
2024-04-28
智能外呼文书送达系统是一款集成身份认证、电子签名、数据交换等功能的互联网文书签署产品,实现了刑事诉讼权利义务告知的流程再造。主要通过外呼机器人以电话语音形式告知嫌疑人诉讼程序节点及权利义务,在拨通电话核对好身份信息后发送权利义务的短信链接,引导嫌疑人、被害人、证人等从贵院微信公众号“文书送达”模块完成相关法律文书送达并签字回执。通过电子文书送达逐步替代纸质文书,保障司法服务、维护当事人合法权益。