Giter VIP home page Giter VIP logo

mxflutter's Introduction

MXFlutter Beta

中文版文档|English Document


新版本

【*NEW】MXFlutter Beta (0.1.0) Version 2020-03-30

  性能和稳定性优化,0.1.0版本已在iOS线上使用,Android的支持在开发中。
  • API变化:区分MXJSStatefulWidget、MXJSStatelessWidget
  • Framework目录整理
  • 支持Packages
    1. dio
    2. pull_to_refresh
    3. cached_network_image
    4. shared_preferences
  • 支持MessageChannel
  • 性能和稳定性优化,Bug Fix


MXFlutter是一套基于JavaScript的Flutter框架,它用极类似Dart的开发方式,通过编写JavaScript代码,来开发Flutter应用。更多细节在 基于JavaScript的Flutter框架详细介绍


  • 支持Dart Flutter语法
  • 支持定义Flutter中同名Widget类
  • 支持定义相同的Build方式,SetState刷新及事件响应方法
  • 支持js模块化开发
  • 支持VS Code直接调试
  • 支持模拟器页面热更新

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

关于MXFlutter动态化框架渲染、优化等更多详细细节介绍,请看文档:基于JavaScript的Flutter框架详细介绍


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

  • MXFlutter Runtime
  • 定义和Flutter Widget同名镜像类
  • 响应式UI框架
  • Script脚本管理模块
  • DSL2Widget UIEngine,事件支持
  • Dart业务API支持
  • 内存管理,对象生命周期管理
  • VM虚拟机
  • 线程管理
  • Native业务API支持

MXJSFlutter.getInstance().setup();
MXJSFlutter.getInstance().runJSApp(jsAppName: "app_test", pageName: null);
class AppTest extends MXJSFlutterApp {
    constructor() {
        super("app_test", "initRouteName");
    }

    createJSWidgetWithName(pageName) {
        let w = new JSWidgetHomePage;
        return w;
    }
}

function main(pageName) {

    MXJSLog.log("main:pageName" + pageName);

    let app = new AppTest;
    runApp(app);
}
Navigator.push(context, MaterialPageRoute(builder: (context) => MXJSFlutter.getInstance().navigatorPushWithPageName("JSWidgetHomePage")));

先看看使用效果,以下截图是在MXFlutter框架下用JS开发,大家可以把上面的源码下载下来,里面有完整的JS代码示例:

单页面演示

下图是APP示例截图:

下面是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,
          }),
      }),
    });
  }

项目演示

源码中还有更丰满的示例,高仿知乎页面JSFlutter版,可以点此进入查看代码:

mxflutter_js_src/mxflutter_app_demo/app_demo/pesto.js

下图是对应的UI,已经接近在线上版直接使用了:

本项目里面高仿知乎页面示例借鉴了 zhihu-flutter 的示例代码,在此,鸣谢作者 HackSoul


MXFlutter遵循MIT开源许可证协议。


MXFlutter还需要很多工作去完善功能,修改BUG,建设配套设施,如果大家有兴趣,欢迎加入一起开发。 如果你有好的意见或建议,也欢迎给我们提 IssuesPull Requests

特别感谢以下开发者的贡献

colin3dmax

yuxizhe

Johnny

AiNiBaBa


成员

项目成员luca浪哥,nice,yockie帅哥贡献了动画,控件,示例APP等核心实现, chaodong老师负责了DartVM方案,wenn和不咸同学负责了Android平台的实现,IP老师提供了单元测试,健身大神yofer老师负责了代码维护,工具建设。

项目由来

18年10月份,团队开始引入 Flutter,Flutter 功能强大,开发快捷,但不能像ReactNative一样使用JavaScript语言开发,为了扩展Flutter的开发者阵营,所以启动了这个技术探索项目。

现状

MXFlutter 是一个很大的命题,目前虽然各个模块已相对完整,但投入生产还需要继续优化。因为还有其他项目要顾及,人力仍然很紧张,如果大家有兴趣,期待小伙伴们一起加入,共同建设 MXFlutter 。

由于项目代码量大,时间紧张,MXFlutter还有很多遗留的问题,作为一个技术探索,非常辛苦但非常有趣,期待各位大牛指导,期待小伙伴们提出问题一起讨论解决。

要了解全部,一定要拉下源码,运行起来看看,有问题可以留言一讨论,MXFlutter会持续更新。


iMatrix Team 是一个技术氛围浓厚,有美女有帅哥有趣有爱的团队,欢迎终端,后台,前端同学投递简历哦:[email protected]

对MXFlutter有兴趣的小伙伴,可以加群交流 QQ群:747535761

qrcode

mxflutter's People

Contributors

mxflutter avatar colin3dmax avatar xsoap avatar tgif-lucaliu avatar ainibaba avatar chenzhengxu avatar yuxizhe avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.