龙空技术网

MXFlutter:基于JS的Flutter框架,用JS也能写出Flutter应用

Gitee 4197

前言:

现时兄弟们对“js控件封装”都比较看重,小伙伴们都想要了解一些“js控件封装”的相关文章。那么小编在网上汇集了一些对于“js控件封装””的相关知识,希望朋友们能喜欢,姐妹们一起来学习一下吧!

项目名称:MXFlutter

项目作者:MXFlutter Team

开源许可协议:MIT

项目地址:

项目简介

MXFlutter 是一套基于 JavaScript 的 Flutter 框架,可以用极其类似 Dart 的开发方式,通过编写 JavaScript 代码,来开发 Flutter 应用,或者使用 mxjsbuilder 编译器,把现有Flutter 工程编译为JS,运行在 mxflutter 之上。

项目特性支持Dart Flutter语法支持定义Flutter中同名Widget类支持定义相同的Build方式,SetState刷新及事件响应方法支持js模块化开发支持模拟器页面热更新核心思想

把 Flutter 的渲染逻辑中的三棵树(即:WidgetTree、Element、RenderObject )中的第一棵(即:WidgetTree),放到 JavaScript 中生成。用 JavaScript 完整实现了 Flutter 控件层封装,可以使用 JavaScript,用极其类似 Dart 的开发方式,开发Flutter应用,利用JavaScript版的轻量级Flutter Runtime,生成UI描述,传递给Dart层的UI引擎,UI引擎把UI描述生产真正的 Flutter 控件。所以,它在iOS上是完全动态化的。

项目结构

MXFlutter,就是用JavaScript,以Flutter的写法开发Flutter。具体的项目结构分为三层,请看下图:

1.VM层:

MXFlutter Runtime定义和Flutter Widget同名镜像类响应式UI框架

2.Flutter层:

Script脚本管理模块DSL2Widget UIEngine,事件支持Dart业务API支持内存管理,对象生命周期管理

3.Native层:

VM虚拟机线程管理Native业务API支持项目效果 UI 展示

单页面演示

下面是UI截图对应的JS代码,没错,你没有眼花,这个是真的 JavaScript 代码,可以在 MXFlutter 的运行时库上渲染出 Flutter 的UI,(是不是很像Flutter里面的组件代码)!

class JSPestoPage extends MXJSWidget {  constructor() {    super("JSPestoPage");    this.recipes = recipeList;  }  build(context) {    let statusBarHeight = 24;    let mq = MediaQuery.of(context);    if (mq) {      statusBarHeight = mq.padding.top    }    let w = new Scaffold({      appBar: new AppBar({        title: new Text("Pesto Demo")      }),      floatingActionButton: new FloatingActionButton({        child: new Icon(new IconData(0xe3c9)),        onPressed: function () {        },      }),      body: new CustomScrollView({        semanticChildCount: this.recipes.length,        slivers: [          //this.buildAppBar(context, statusBarHeight),          this.buildBody(context, statusBarHeight),        ],      }),      //body:this.buildItems()[0]    });    return w;  }  buildAppBar(context, statusBarHeight) {    return SliverAppBar({      pinned: true,      expandedHeight: _kAppBarHeight,      actions: [        IconButton({          icon: new Icon(new IconData(1)),          tooltip: 'Search',          onPressed: function () {          },        }),      ],      flexibleSpace: LayoutBuilder({        builder: function (context, constraints) {          size = constraints.biggest;          appBarHeight = size.height - statusBarHeight;          t = (appBarHeight - kToolbarHeight) / (_kAppBarHeight - kToolbarHeight);          extraPadding = new Tween({ begin: 10.0, end: 24.0 }).transform(t);          logoHeight = appBarHeight - 1.5 * extraPadding;          return Padding({            padding: EdgeInsets.only({              top: statusBarHeight + 0.5 * extraPadding,              bottom: extraPadding,            }),            child: Center({              child: new Icon(new IconData(1))            }),          });        },      }),    });  }  buildBody(context, statusBarHeight) {    let mediaPadding = EdgeInsets.all(0);    let mq = MediaQuery.of(context);    if (mq) {      mediaPadding = MediaQuery.of(context).padding;    }    let padding = EdgeInsets.only({      top: 8.0,      left: 8.0 + mediaPadding.left,      right: 8.0 + mediaPadding.right,      bottom: 8.0    });    return new SliverPadding({      padding: padding,      sliver: new SliverGrid({        gridDelegate: new SliverGridDelegateWithMaxCrossAxisExtent({          maxCrossAxisExtent: _kRecipePageMaxWidth,          crossAxisSpacing: 8.0,          mainAxisSpacing: 8.0,        }),        delegate: new SliverChildBuilderDelegate(          function (context, index) {            let recipe = this.recipes[index];            let w = new RecipeCard({              recipe: recipe,              onTap: function () { showRecipePage(context, recipe); },            });            return w;          },          {            childCount: this.recipes.length,          }),      }), 

如果你想要了解它更详细的使用和接入方法,那么就点击下方了解更多前往项目主页看看吧。

标签: #js控件封装