把Flutter扩展到微信小程序端的探索

05-14 1329阅读

Flutter是声明式UI框架,声明式UI只需要向框架描述UI长什么样子而不用关心框架具体的实现细节,具体到Flutter,上层的UI描述使用底层的skia图形引擎处理就是原生Flutter,而把底层处理换成html/css/canvas就是flutter_web,flutter_mp则是探索在类小程序上对这些UI描述的处理。

我们看一个最简单例子

var x = ‘Hello World’

Center(

child: Text(x)

);

对于上面的UI结构,我们只需要在小程序的wxml文件里,用如下的结构对应就OK了。

// wxml部分

{{x}}

// js 部分

Component({

data: {

x: ‘Hello World’

}

})

虽然实际的结构要比上面的情况复杂的多,不过通过上面简单的例子,我们知道起码要做两个事情:

我们需要根据Flutter代码生成相关小程序wxml模版文件 收集wxml渲染需要的数据,放置到小程序组件的data字段。

wxml结构生成

我们知道小程序是无法动态操作节点的,wxml结构需要预先生成,所以Flutter运行在小程序之前,会存在一个编译打包阶段,这个阶段会遍历Dart代码, 根据一定规则生成wxml文件(编译阶段还会做下文将要提到的另外一个重要事情 — 把Dart编译为js)。

具体的,我们首先会将Dart源码处理为可分析的AST结构,AST是源代码的树型表示结构。然后我们深度遍历这份AST语法树结构,生成目标wxml,整个过程如下:

把Flutter扩展到微信小程序端的探索

构建wxml结构的难点在于:Flutter不仅是声明式UI还是“值UI”,什么叫“值UI”?简单来说,Flutter把UI看成是一个普通的值,类似于字符串,数字一样的值,既然是一个普通的值,就可以参与所有的控制流程,可以是函数的返回值也可以是函数参数等等。而小程序的wxml虽然也是声明式UI,却不是“值UI”,wxml更加像模版,更加的静态。怎么用静态的wxml表达动态的“值UI”是构建wxml结构的关键所在。

看个例子

Widget getX() {

if (condition1) {

return Text(‘Hello’);

} else if (condition2) {

return Container(

child: …

);

} else if (condition3) {

return Center(

child: …

);

}

}

Widget x = getX();

Center(

child: x //

);

这里的child: x x是一个动态值,它的具体值需要在运行阶段才能确定,它可能是任意的Widget,如何在静态的wxml上处理这里动态的x?受Alita框架的启发,这里主要是借助于小程序template的动态性(template的is属性可以接受变量值)。有如下几步:

1、首先在遍历Dart源码AST结构的时候,会把每一个独立完整的“UI值”片段,对应到wxml的template, 比如上文 getX 里面的UI

Hello

...

2、在遇到 类似x 这种动态值的时候,固定的会生成一个template占位

3、在运行阶段,会根据getX

函数的运行结果来决定x映射的“UI值”,如果getX里面condition1为true,那么这里的templateName的值就是template001。具体的数据计算收集工作,参考下面要的 “渲染数据收集”过程。可以看出flutter_mp处理“值UI”方式,完全参考了Alita。

渲染数据收集

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

把Flutter扩展到微信小程序端的探索

把Flutter扩展到微信小程序端的探索

把Flutter扩展到微信小程序端的探索

把Flutter扩展到微信小程序端的探索

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)

把Flutter扩展到微信小程序端的探索

学习分享,共勉

Android高级架构师进阶之路

题外话,我在阿里工作多年,深知技术改革和创新的方向,Android开发以其美观、快速、高效、开放等优势迅速俘获人心,但很多Android兴趣爱好者所需的进阶学习资料确实不太系统,完整。今天我把我搜集和整理的这份学习资料分享给有需要的人,若有关Android学习进阶可以与我在Android终极开发交流群一起讨论交流。 点击这里前往我的Git领取资料 的同时,还可以加入一个好的学习交流圈,何乐而不为呢?加入我们和我们一起吧!!

  • Android进阶知识体系学习脑图

    把Flutter扩展到微信小程序端的探索

    • Android进阶高级工程师学习全套手册

      把Flutter扩展到微信小程序端的探索

      • 对标Android阿里P7,年薪50w+学习视频

        把Flutter扩展到微信小程序端的探索

        • 大厂内部Android高频面试题,以及面试经历

          外链图片转存中…(img-h8ooJsXA-1710703585087)]

          • Android进阶高级工程师学习全套手册

            [外链图片转存中…(img-MmG4PqYM-1710703585087)]

            • 对标Android阿里P7,年薪50w+学习视频

              [外链图片转存中…(img-sd6QqnKB-1710703585087)]

              • 大厂内部Android高频面试题,以及面试经历

                把Flutter扩展到微信小程序端的探索

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]