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
相关推荐
数据猎手小k3 小时前
AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。
android·人工智能·机器学习·语言模型
你的小103 小时前
JavaWeb项目-----博客系统
android
风和先行4 小时前
adb 命令查看设备存储占用情况
android·adb
AaVictory.5 小时前
Android 开发 Java中 list实现 按照时间格式 yyyy-MM-dd HH:mm 顺序
android·java·list
似霰6 小时前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder
大风起兮云飞扬丶6 小时前
Android——网络请求
android
干一行,爱一行6 小时前
android camera data -> surface 显示
android
断墨先生6 小时前
uniapp—android原生插件开发(3Android真机调试)
android·uni-app
无极程序员8 小时前
PHP常量
android·ide·android studio
萌面小侠Plus9 小时前
Android笔记(三十三):封装设备性能级别判断工具——低端机还是高端机
android·性能优化·kotlin·工具类·低端机