Flutter Web实践

起因

机缘巧合之下,我得到了一个flutter web实践机会,这里记录一下flutter web用于h5的实践。

遇到的问题&解决方案

1、路由&传值

这个问题困扰的时间比较长。在APP的开发里是可以不使用路由的,而web的页面里路由是必要的。

使用flutter build web 命令,生成的代码里,默认的路由是带#号的,其实这并没有问题。但是引发了一个问题:路径后边的传值,得不到了!

代码是这样的:

dart 复制代码
String href = html.window.location.href;
Uri uri = Uri.parse(href);
String code = uri.queryParameters['code'] ?? "";

由于#的存在,href是无论如何得不到#后边的值。

后来查询,使用url_strategy插件即可解决这个问题。这个方法试了,在测试环境是没问题的,一旦把代码部署在正式环境,那么页面就白屏了。。。用flutter web开发h5,问题就像打地鼠,打下去一个又上来一个...

办法总比问题多,路径后边的值是一定要获取到的,怎么办?

换一个思路解决:得到当前的全部地址,手动把#去掉,然后再使用queryParameters。(是否还有更好的解决办法?)

dart 复制代码
//获得全部地址的代码
html.window.location.toString();

2、双重js交互

这个问题困扰的时间是最长的。普通的js交互无非就是h5调用原生的方法,或者原生调用h5的方法。

然而这里就不同了。由于这里的h5是flutter web实现的,那么在APP里使用了这个h5页面,点击h5的按钮,调取APP的方法,如何实现?(同为flutter,但是所在的场地不同)

网上好像没有现成的解决方案,但之前的经验以及与同事的讨论带给了我灵感:flutter web里首先调用js方法,然后js方法里调用APP的方法。这样似乎是行的通的,于是我开始了尝试。

举个例子:点击h5里的按钮,实现APP的返回功能,关键代码展示:

flutter web 源码:

arduino 复制代码
//在flutter web项目里,点击按钮调用这个方法,引号里的名称即为js代码里方法的名称
js.context.callMethod('h5back');

flutter web生成的html文件修改,源码:

dart 复制代码
<script>
......
//appBack,这个名称是APP里定义的方法名称。
function h5back(){
    appBack.postMessage(''); //注意,方法里的引号是必传的,否则方法调不通。
}
</script>

APP里定义的方法,源码:

dart 复制代码
//这里是flutter app里使用 webview_flutter插件,对应WebviewWidget里的curController里的代码。
..addJavaScriptChannel("appBack", onMessageReceived: (JavaScriptMessage msg) {
    //返回事件
    print("这里是APP的返回事件");
})

扩展:如果h5里我想传参,该当如何?(已解决,留给读者思考)

3、奇怪的问题:iOS设备js交互

这个问题困扰的时间是第二长的。主要是这个问题很奇怪,同样的情况安卓手机没有出现,但是iOS手机出现了。

具体情况是这样的:点击h5里的按钮,调起APP的方法,APP里这个方法是弹一个底部弹窗。iOS机型奇怪的地方在于,这个底部弹窗只有第一次点击有效,第二次点击则没有响应!!!定位花了一部分时间。经过调试,发现如果不弹窗,h5的方法能正常使用。是底部弹窗影响了iOS机型里后续的js交互事件。

目前已经解决了,但是这个问题本质上还需要一个答案...

待解决的问题

1、加载缓慢问题

打开页面,由于需要加载flutter的字体文件,大概1M多,导致页面缓慢,尤其是刚打开的时候字体是叉号!这个情况后续有待优化。

2、路由问题

目前的路由是带#号的,后续考虑优化成不带#号。

总结

实践证明:使用flutter web作为h5,在理论和实践上都是可行的。

在flutter APP里使用flutter web的h5页面,遇到的问题不止这些,但这几个是比较主要的情况。希望这次趟的坑,能给后边走这趟路的人有所帮助。

悄悄感谢同事和leader的帮助~本期活动的地址在这里,欢迎大家体验,并提出宝贵的意见!

bash 复制代码
活动地址(手动复制后打开):
https://m.evimed.com/flutter/#/register?inviteCode=ILCmYXUj8n
相关推荐
李堇15 分钟前
android滚动列表VerticalRollingTextView
android·java
一只大侠的侠32 分钟前
Flutter开源鸿蒙跨平台训练营 Day 3
flutter·开源·harmonyos
lxysbly2 小时前
n64模拟器安卓版带金手指2026
android
一只大侠的侠2 小时前
【Harmonyos】Flutter开源鸿蒙跨平台训练营 Day 2 鸿蒙跨平台开发环境搭建与工程实践
flutter·开源·harmonyos
微祎_3 小时前
Flutter for OpenHarmony:构建一个 Flutter 平衡球游戏,深入解析动画控制器、实时物理模拟与手势驱动交互
flutter·游戏·交互
ZH15455891314 小时前
Flutter for OpenHarmony Python学习助手实战:面向对象编程实战的实现
python·学习·flutter
renke33644 小时前
Flutter for OpenHarmony:构建一个 Flutter 色彩调和师游戏,RGB 空间探索、感知色差计算与视觉认知训练的工程实现
flutter·游戏
游戏开发爱好者85 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
王码码20355 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
黑码哥5 小时前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder