十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
需求,app中使用webview和h5交互,根据h5发过来的消息,在屏幕上展示flutter组件,并且可以发送消息给h5。
创新互联是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的十载时间我们累计服务了上千家以及全国政企客户,如成都铜雕雕塑等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致赞扬。
首先使用的组件是flutter_WebView_plugin,这个组件不能嵌套flutter组件,所以放弃这个组件。
flutter_inappbrowser 可以实现组合布局, 所以选用了此库, GitHub链接
[
flutter与webview交互
因为web端项目用的是vue框架 按照网上的教程flutter端调用js端方法不管用:
flutter端
web端
后来发现是vue的方法不会暴露给app使用 需要把方法名暴露给window
(*注:以下仅个人配置过程参考,系统win7-64)
所需软件
vsCode,Android Studio, MuMu模拟器 (直连手机调试的话就不需要了)
配置过程
1、Flutter安装
安装时忘记截图,具体可参考链接 flutter中文网 相关教程+ 百度 ,现在网上教程很多,多踩点坑总会成功的。
2、MuMu模拟器调试时需进行相关配置
(*注:直连手机调试可忽略以下;执行以下操作需要在执行flutter doctor成功后,flutter run执行前)
(1)mumu模拟器端口监听,需要执行
(2)mumu模拟器调试flutter run可能会报错,可以改成,具体原因可直接百度“--enable-software-rendering”
3、如需调试ios端可尝试虚拟机+macOS+xCode
vmware+macOs可参考链接 VMware15安装MacOS系统 ,笔者按照该步骤已安装成功
需要创建两个工程,一个是FlutterWeb工程最终打包成Web页面,一个是Flutter原生工程承载一个WebView用来加载Web页面。这样做的好处在于只需要一种语言开发iOS和Android不用对接两次,可以直接使用社区Flutter原生工程的插件,只需要封装给Web调用。
FlutterWeb工程pubspec.yaml添加依赖
Flutter原生工程pubspec.yaml添加依赖
创建一个 toast_channel.dart,定义一个类实现 JavascriptChannel 重写name指定channel名称和onMessageReceived指定调用函数
在WebView的 javascriptChannels 配置上定义的Channel
创建一个 native_channel.dart ,定义一个外部函数通过 @JS("调用的channel和函数名") 注解指定调用的原生函数(JavascriptChannel固定名称为postMessage)
需要使用的地方直接调用
创建一个 js_function.dart,存放被原生调用的函数名称
将要提供给原生调用的函数,通过 js.context[原生调用名称] = 函数 开放给外部调用
如果在FlutterWeb工程要使用这个函数也可以使用@JS注解
WebView 创建时会回调 onWebViewCreated 获得 WebViewController ,WebViewController 调用 runJavascript 会执行JS函数无返回值,调用 runJavascriptReturningResult 会执行JS函数有返回值。
FutureBuilder获取WebViewController, 需要使用的地方直接调用
使用 HTML,CSS,Canvas 和 SVG 元素来渲染。
缺点:会存在不同平台效果不一样。
优点:不加载canvaskit默认使用系统字体,加载过程没有多余开销。
需要用到wasm,WebAssembly 要求需要浏览器支持,WebView Android需要最低需要57,Safari iOS 需要最低需要 11。
缺点:canvaskit 有7m大默认地址在国外首次加载耗时;中文会加载字体库默认地址在国外加载慢。
优点:性能更好,渲染效果一致。
--web-renderer=auto 默认移动端浏览器选择 HTML,桌面端浏览器选择 CanvasKit。
--web-renderer=html 使用 HTML 渲染器
--web-renderer=canvaskit 使用 CanvasKit 渲染器
综上所诉推荐移动端使用HTML渲染更合适,在编译和打包时指定渲染器 --web-renderer=html 。
--debug 模式构建的 Web 应用没有被压缩,且 Tree-shaking 没有执行。
--profile 模式构建的 Web 应用没有被压缩,但 Tree-shaking 执行了。
--release 模式构建的 Web 应用被压缩了,并且 Tree-shaking 执行了
运行命令
flutter run web --dart-define=FLUTTER_WEB_CANVASKIT_URL=./canvaskit/ --web-renderer=html
flutter run web --dart-define=FLUTTER_WEB_CANVASKIT_URL=./canvaskit/ --web-renderer=html --profile
打包命令
flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=./canvaskit/ --web-renderer=html --release
Flutter是谷歌公司推出的跨终端的开发框架,支持Android、iOS和WEB终端。1.0版在2018年12月5日发布,目前的最新版本是1.5,它采用的开发语言是Dart,Dart也是谷歌开发的计算机编程语言,语法类似C,是编译型语言:
hello world例子,打印字符串“Hello World!”:
1、没有桥接层
React Native、Weex等技术都是跨终端的框架,然而性能跟原生App存在很大差距。这是由于它们的工作原理决定的:
React Native、Weex等技术多了一个桥接层,所以界面渲染会慢一些,由于UI渲染非常频繁,想要不卡顿,基本上比较难,性能和用户体验跟原生代码有差距。而这恰恰是Flutter的优势所在:
Dart可以被编译成不同平台的本地代码,让Flutter不通过桥接层直接跟平台通信,自然性能会快一些。
2、编译执行
JavaScript是解释执行的,Dart是编译执行的,性能谁好一目了然。
3、Flutter Engine虚拟机
Flutter是依靠Flutter Engine虚拟机在iOS和Android上运行的,Flutter Engine使用C/C++编写,开发人员通过Flutter框架直接和API在内部进行交互,所以具有输入低延迟和UI渲染高帧速率的特点。除了这特点之外,Flutter还提供了自己的小部件,Flutter小部件是使用从React获取灵感的现代框架构建的。 中心思想是您使用小部件构建UI。
窗口小部件根据其当前配置和状态描述了它们的视图。 当窗口小部件的状态发生更改时,窗口小部件会重建其描述,框架将根据前面的描述进行区分,以确定底层呈现树从一个状态转换到下一个状态所需的最小更改。可以直接在OS平台提供的画布上进行描绘,也就是一些核心类库直接放到虚拟机里面,调用起来更快。
从它的系统结构可以看出,类似安卓的ART(Android Run Time)虚拟机,同样采用AOT(Ahead of TIme)技术,会在APP安装时就编译成机器语言,不再解释执行,从而优化了APP运行的性能。
4、自带渲染引擎
Flutter使用谷歌自己的Skia渲染引擎,而Android系统自带Skia引擎,iOS平台上Flutter也会把Skia引擎打包到APP中,从而实现了高效渲染。而React Native通过桥接层访问原生UI,操作频繁就容易出性能问题。
综合所述,Flutter 是性能最接近原生代码 的一种开发框架,未来也会是构建谷歌Fuchsia应用的主要方式,前途不可限量,唯一的问题就是需要学习一门新的语言:Dart,而有Java或者C#语言基础的程序员会比较容易学习。