Flutter源码阅读分析:Framework层的启动

Framework的启动


本文也发布于本人的知乎专栏:https://zhuanlan.zhihu.com/p/394564792

0. 前言

在我之前的文章Flutter源码阅读分析:引擎初始化与启动的最后,提到了在引擎启动时,会以“main”方法作为主入口函数,执行Dart代码。那么本片文章就从“main”方法着手,分析Dart Framework具体做了什么。

Framework代码:https://github.com/flutter/flutter


1. runApp

首先我们从flutter官方给的例子来看:

// ./examples/hello_world/lib/main.dart
void main() =>
  runApp( //[1]
    const Center( // [2]
      child:
        Text('Hello, world!',
          key: Key('title'),
          textDirection: TextDirection.ltr
        )
      )
    );
  • [1] runApp方法的主要功能是填充给定的Widget并将其附到屏幕上。
  • [2] Center是一种将子节点置于中心的Align,这些都是Fllutter的Widget系统,这个在后文中详细分析。

此处先看runApp做了什么:

// ./packages/flutter/lib/src/widgets/binging.dart
void runApp(Widget app) {
   
  WidgetsFlutterBinding.ensureInitialized()
    ..scheduleAttachRootWidget(app)
    ..scheduleWarmUpFrame();
}

如果重复调用runApp方法,那么会将之前的根Widget从屏幕中移除,并将新的指定的Widget替换到该位置。这个新的Widget树与前者进行对比,并将区别的地方应用到后续的渲染树。这里涉及到Flutter的布局渲染机制,会在后续讲解。

WidgetsFlutterBinding类是基于Widget框架的应用程序的具体绑定。这将框架和Flutter引擎绑定起来。

// ./packages/flutter/lib/src/widgets/binding.dart
class WidgetsFlutterBinding extends BindingBase with GestureBinding, SchedulerBinding, ServicesBinding, PaintingBinding, SemanticsBinding, RendererBinding, WidgetsBinding {
   
  static WidgetsBinding ensureInitialized() {
   
    if (WidgetsBinding.instance == null)
      WidgetsFlutterBinding();
    return WidgetsBinding.instance;
  }
}

ensureInitialized方法返回一个WidgetBinding的实例。
再看一下scheduleAttachRootWidgetscheduleWarmUpFrame方法:

// ./packages/flutter/lib/src/widgets/binding.dart
mixin WidgetsBinding on BindingBase, ServicesBinding, SchedulerBinding, GestureBinding, RendererBinding, SemanticsBinding {
   
  ...
  // 通过Timer安排一个任务,用于执行附着根Widget
  @protected
  void scheduleAttachRootWidget(
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董小虫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值