flutter【13】从框架层面看看flutter的widget

经过前面的一篇文章,flutter 工程创建和组织方面的工作就基本结束了,下一步就可以进行具体的开发。

flutter 作为一个跨平台的 ui 工具包,核心理念就是 widget,所以网上的文章也大多是从 widget 入手进行 flutter 讲解,但是 flutter 中的 widget 太多了,提供了各种各样的 widget,在方便开发者的同时也让人难以从宏观方面把握 flutter 的 widget 的组织结构。

现在网上的文章虽多,大部分侧重于介绍单个 widget 的使用,或者 widget 层级继承原理等方面,这些固然重要,但是在探讨具体 widget 的具体细节之前,如果能从宏观、框架层面了解 flutter 的 组织结构,widget 是怎么划分的,以什么逻辑组织的,在后续的开发工作中,可以更有针对性的选择合适的 widget ,心中也会有一个 widget 的脉络图。

下面还是从初始工程的 main.dart 文件入手,一步一步梳理 flutter 的 widget 组织逻辑。

这里再放一次 main.dart 代码吧,方便叙述。

import 'package:flutter/material.dart';

//这是 app 的入口
void main() => runApp(MyApp());

/**
 * flutter 中绝大多数东西都是 widget,主要有两种,无状态的(StatelessWidget)、有状态的(StatefulWidget)
 */
class MyApp extends StatelessWidget {
  // StatelessWidget 主要的就是这个 build 方法,主要用来执行 widget 的构建
  @override
  Widget build(BuildContext context) {
    return MaterialApp(//MateriaApp 是flutter提供的android平台风格的库
      title: 'Flutter Demo',
      theme: ThemeData(//可以配置主题
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

// 有状态的 widget
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  //主要的方法就是 createState() ,用来创建一个 State
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

//这就是和上面 StatefulWidget 绑定的 State
class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    //有状态的widget,可以使用 setState 方法来更新状态,然后 widget 树会根据最新的状态重新构建
    setState(() {
      _counter++;
    });
  }

  //这是 State 的核心方法,用来执行 widget 的构建
  @override
  Widget build(BuildContext context) {
    return Scaffold(//Scaffold 是android 风格app的一个骨架 widget,里面可以配置 appbar等
      appBar: AppBar(
        // 这里的widget就是上面的MyHomePage对象
        title: Text(widget.title),
      ),
      body: Center(//一个单子元素在中间的布局widget
        child: Column(//竖直布局widget
          mainAxisAlignment: MainAxisAlignment.center,//主方向的对齐方式
          children: <Widget>[//子元素列表
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

上述代码中使用的 widget 有 MaterialApp、StatelessWidget、StatefulWidget、Scaffold……,开头的 import 'package:flutter/material.dart'; 这句代码,会将flutter 的大部分 widget 导入进来进行使用。

AS中 ctrl+鼠标左键 点击 material.dart 就可以定位到 material.dart 文件了,文件的内容这里贴出来,如下:

library material;

export 'src/material/about.dart';
export 'src/material/animated_icons.dart';
export 'src/material/app.dart';
export 'src/material/app_bar.dart';
export 'src/material/app_bar_theme.dart';
export 'src/material/arc.dart';
export 'src/material/back_button.dart';
export 'src/material/bottom_app_bar.dart';
export 'src/material/bottom_app_bar_theme.dart';
export 'src/material/bottom_navigation_bar.dart';
export 'src/material/bottom_sheet.dart';
export 'src/material/bottom_sheet_theme.dart';
export 'src/material/button.dart';
export 'src/material/button_bar.dart';
export 'src/material/button_theme.dart';
export 'src/material/card.dart';
export 'src/material/card_theme.dart';
export 'src/material/checkbox.dart';
export 'src/material/checkbox_list_tile.dart';
export 'src/material/chip.dart';
export 'src/material/chip_theme.dart';
export 'src/material/circle_avatar.dart';
export 'src/material/color_scheme.dart';
export 'src/material/colors.dart';
export 'src/material/constants.dart';
export 'src/material/data_table.dart';
export 'src/material/data_table_source.dart';
export 'src/material/date_picker.dart';
export 'src/material/debug.dart';
export 'src/material/dialog.dart';
export 'src/material/dialog_theme.dart';
export 'src/material/divider.dart';
export 'src/material/drawer.dart';
export 'src/material/drawer_header.dart';
export 'src/material/dropdown.dart';
export 'src/material/expand_icon.dart';
export 'src/material/expansion_panel.dart';
export 'src/material/expansion_tile.dart';
export 'src/material/feedback.dart';
export 'src/material/flat_button.dart';
export 'src/material/flexible_space_bar.dart';
export 'src/material/floating_action_button.dart';
export 'src/material/floating_action_button_location.dart';
export 'src/material/floating_action_button_theme.dart';
export 'src/material/flutter_logo.dart';
export 'src/material/grid_tile.dart';
export 'src/material/grid_tile_bar.dart';
export 'src/material/icon_button.dart';
export 'src/material/icons.dart';
export 'src/material/ink_decoration.dart';
export 'src/material/ink_highlight.dart';
export 'src/material/ink_ripple.dart';
export 'src/material/ink_splash.dart';
export 'src/material/ink_well.dart';
export 'src/material/input_border.dart';
export 'src/material/input_decorator.dart';
export 'src/material/list_tile.dart';
export 'src/material/material.dart';
export 'src/material/material_button.dart';
export 'src/material/material_localizations.dart';
export 'src/material/material_state.dart';
export 'src/material/mergeable_material.dart';
export 'src/material/outline_button.dart';
export 'src/material/page.dart';
export 'src/material/page_transitions_theme.dart';
export 'src/material/paginated_data_table.dart';
export 'src/material/popup_menu.dart';
export 'src/material/progress_indicator.dart';
export 'src/material/radio.dart';
export 'src/material/radio_list_tile.dart';
export 'src/material/raised_button.dart';
export 'src/material/range_slider.dart';
export 'src/material/refresh_indicator.dart';
export 'src/material/reorderable_list.dart';
export 'src/material/scaffold.dart';
export 'src/material/scrollbar.dart';
export 'src/material/search.dart';
export 'src/material/shadows.dart';
export 'src/material/slider.dart';
export 'src/material/slider_theme.dart';
export 'src/material/snack_bar.dart';
export 'src/material/snack_bar_theme.dart';
export 'src/material/stepper.dart';
export 'src/material/switch.dart';
export 'src/material/switch_list_tile.dart';
export 'src/material/tab_bar_theme.dart';
export 'src/material/tab_controller.dart';
export 'src/material/tab_indicator.dart';
export 'src/material/tabs.dart';
export 'src/material/text_field.dart';
export 'src/material/text_form_field.dart';
export 'src/material/text_selection.dart';
export 'src/material/text_theme.dart';
export 'src/material/theme.dart';
export 'src/material/theme_data.dart';
export 'src/material/time.dart';
export 'src/material/time_picker.dart';
export 'src/material/toggleable.dart';
export 'src/material/tooltip.dart';
export 'src/material/typography.dart';
export 'src/material/user_accounts_drawer_header.dart';
export 'widgets.dart';

可以看到这个文件中仅仅是声明导入了一些包,并没有具体的实现,需要注意的是前面都是 src/material 开头的路径,很显然,material.dart 文件名字相对应,而最后一个是 widgets.dart,这是为什么呢?

其实你用文件资源管理器打开 material.dart 所在的位置就明白了,具体路径在 flutter\packages\flutter\lib , 该文件夹的全部的文件及子文件夹中的文件在文章的最后会附上。

该目录下有 12 个 dart 文件,内容都和 material.dart 的内容类似,都是使用 export 自动导入了一些包。这些包的具体实现都在 src 目录中,src 的字目录名字和 12 个 dart 文件的名字一致。

需要注意的是这 12 个 dart 文件以及 src 目录中具体实现的 widget dart 文件并不是孤立的,而是相互之间引用的,就如同上面 material.dart 文件中最后一行引用了 widget.dart。也就是说整个 flutter 按照功能或者能力分为 12 个大的模块,模块内部具体的实现根据需要的能力会引用其他模块。

  • animation.dart:动画模块
  • cupertino.dart:ios design 风格模块
  • foundation.dart:底层工具模块
  • gesture.dart:手势识别模块
  • material.dart:android material design 风格模块
  • painting.dart:flutter 绘制引擎模块,包含各种绘制 api,比如缩放图片、阴影插值,绘制边框等等
  • physics.dart:简单一维物理模拟模块,比如弹簧、摩擦、重力等,用于用户界面动画
  • rendering.dart:flutter RenderObjuect 渲染树模块,提供给 wieget 模块使用,实现其后端的布局和绘制
  • scheduler.dart:调度模块,负责程序框架回调以及特定优先级任务的调度
  • semantics.dart:语意模块,SemanticsEvent 类定义了平台的语意事件的发送协议,SemanticsNode层级表示了UI的语意结构,用于特定平台的加速服务
  • services.dart:平台能力服务,整个模块只引用了 core dart 库以及 foundation模块
  • widgets.dart:flutter 的 widgets 框架

从上面可以看出来,flutter 的基础 widgets 都在 widgets.dart 文件中导入了,具体的实现在 src/widgets/ 目录中。

  widgets
            actions.dart
            animated_cross_fade.dart
            animated_list.dart
            animated_size.dart
            animated_switcher.dart
            annotated_region.dart
            app.dart
            async.dart
            automatic_keep_alive.dart
            banner.dart
            basic.dart
            binding.dart
            bottom_navigation_bar_item.dart
            container.dart
            debug.dart
            dismissible.dart
            draggable_scrollable_sheet.dart
            drag_target.dart
            editable_text.dart
            fade_in_image.dart
            focus_manager.dart
            focus_scope.dart
            focus_traversal.dart
            form.dart
            framework.dart
            gesture_detector.dart
            grid_paper.dart
            heroes.dart
            icon.dart
            icon_data.dart
            icon_theme.dart
            icon_theme_data.dart
            image.dart
            image_icon.dart
            implicit_animations.dart
            inherited_model.dart
            inherited_notifier.dart
            layout_builder.dart
            list_wheel_scroll_view.dart
            localizations.dart
            media_query.dart
            modal_barrier.dart
            navigation_toolbar.dart
            navigator.dart
            nested_scroll_view.dart
            notification_listener.dart
            orientation_builder.dart
            overlay.dart
            overscroll_indicator.dart
            pages.dart
            page_storage.dart
            page_view.dart
            performance_overlay.dart
            placeholder.dart
            platform_view.dart
            preferred_size.dart
            primary_scroll_controller.dart
            raw_keyboard_listener.dart
            routes.dart
            safe_area.dart
            scrollable.dart
            scrollbar.dart
            scroll_activity.dart
            scroll_configuration.dart
            scroll_context.dart
            scroll_controller.dart
            scroll_metrics.dart
            scroll_notification.dart
            scroll_physics.dart
            scroll_position.dart
            scroll_position_with_single_context.dart
            scroll_simulation.dart
            scroll_view.dart
            semantics_debugger.dart
            shortcuts.dart
            single_child_scroll_view.dart
            size_changed_layout_notifier.dart
            sliver.dart
            sliver_persistent_header.dart
            sliver_prototype_extent_list.dart
            spacer.dart
            status_transitions.dart
            table.dart
            text.dart
            texture.dart
            text_selection.dart
            ticker_provider.dart
            title.dart
            transitions.dart
            unique_widget.dart
            value_listenable_builder.dart
            viewport.dart
            visibility.dart
            widget_inspector.dart
            widget_span.dart
            will_pop_scope.dart

另外对应android平台下的 material 风格的 widget 是在 material.dart 模块中,该模块实在 widgets.dart 的基础上,实现并补充了一些 android md 风格的 widget,具体的实现都在 src/materal/ 目录下,具体的文件如下:

   ├─material
    │  │  about.dart
    │  │  animated_icons.dart
    │  │  app.dart
    │  │  app_bar.dart
    │  │  app_bar_theme.dart
    │  │  arc.dart
    │  │  back_button.dart
    │  │  bottom_app_bar.dart
    │  │  bottom_app_bar_theme.dart
    │  │  bottom_navigation_bar.dart
    │  │  bottom_sheet.dart
    │  │  bottom_sheet_theme.dart
    │  │  button.dart
    │  │  button_bar.dart
    │  │  button_theme.dart
    │  │  card.dart
    │  │  card_theme.dart
    │  │  checkbox.dart
    │  │  checkbox_list_tile.dart
    │  │  chip.dart
    │  │  chip_theme.dart
    │  │  circle_avatar.dart
    │  │  colors.dart
    │  │  color_scheme.dart
    │  │  constants.dart
    │  │  data_table.dart
    │  │  data_table_source.dart
    │  │  date_picker.dart
    │  │  debug.dart
    │  │  dialog.dart
    │  │  dialog_theme.dart
    │  │  divider.dart
    │  │  drawer.dart
    │  │  drawer_header.dart
    │  │  dropdown.dart
    │  │  expand_icon.dart
    │  │  expansion_panel.dart
    │  │  expansion_tile.dart
    │  │  feedback.dart
    │  │  flat_button.dart
    │  │  flexible_space_bar.dart
    │  │  floating_action_button.dart
    │  │  floating_action_button_location.dart
    │  │  floating_action_button_theme.dart
    │  │  flutter_logo.dart
    │  │  grid_tile.dart
    │  │  grid_tile_bar.dart
    │  │  icons.dart
    │  │  icon_button.dart
    │  │  ink_decoration.dart
    │  │  ink_highlight.dart
    │  │  ink_ripple.dart
    │  │  ink_splash.dart
    │  │  ink_well.dart
    │  │  input_border.dart
    │  │  input_decorator.dart
    │  │  list_tile.dart
    │  │  material.dart
    │  │  material_button.dart
    │  │  material_localizations.dart
    │  │  material_state.dart
    │  │  mergeable_material.dart
    │  │  outline_button.dart
    │  │  page.dart
    │  │  page_transitions_theme.dart
    │  │  paginated_data_table.dart
    │  │  popup_menu.dart
    │  │  progress_indicator.dart
    │  │  radio.dart
    │  │  radio_list_tile.dart
    │  │  raised_button.dart
    │  │  range_slider.dart
    │  │  refresh_indicator.dart
    │  │  reorderable_list.dart
    │  │  scaffold.dart
    │  │  scrollbar.dart
    │  │  search.dart
    │  │  shadows.dart
    │  │  slider.dart
    │  │  slider_theme.dart
    │  │  snack_bar.dart
    │  │  snack_bar_theme.dart
    │  │  stepper.dart
    │  │  switch.dart
    │  │  switch_list_tile.dart
    │  │  tabs.dart
    │  │  tab_bar_theme.dart
    │  │  tab_controller.dart
    │  │  tab_indicator.dart
    │  │  text_field.dart
    │  │  text_form_field.dart
    │  │  text_selection.dart
    │  │  text_theme.dart
    │  │  theme.dart
    │  │  theme_data.dart
    │  │  time.dart
    │  │  time_picker.dart
    │  │  toggleable.dart
    │  │  tooltip.dart
    │  │  typography.dart
    │  │  user_accounts_drawer_header.dart
    │  │  
    │  └─animated_icons
    │      │  animated_icons.dart
    │      │  animated_icons_data.dart
    │      │  
    │      └─data
    │              add_event.g.dart
    │              arrow_menu.g.dart
    │              close_menu.g.dart
    │              ellipsis_search.g.dart
    │              event_add.g.dart
    │              home_menu.g.dart
    │              list_view.g.dart
    │              menu_arrow.g.dart
    │              menu_close.g.dart
    │              menu_home.g.dart
    │              pause_play.g.dart
    │              play_pause.g.dart
    │              search_ellipsis.g.dart
    │              view_list.g.dart

另外 ios 平台的 widget 在 cupertino.dart 模块中,对应的目录为 src/cupertino。这里就不再列举了。

src/widgets、src/material 目录中的文件,每一个文件对应这一个/多个/一类 widget。也就是说后面我们开发的过程中,可以在该目录下寻找需要的 widget,同时平时浏览下该目录下文件的内容,看看都有哪些 widget,提前有个印象。

到这里 main.dart 中用到的那些 widget 你就可以 ctrl+鼠标左键 点进去看看了,像 StatelessWidget、StatefulWidget 这种基础 widget 是在 widgets.dart 模块中,而 MaterialApp 这种和android平台相关的 widget 是在 material.dart 模块中。

最后放上一张 flutter 的框架图,现在看着应该就不会太抽象了

image

本文从框架的角度,分析了 flutter 的模块组织,描述了 widget 的划分和组织逻辑,从宏观上有一个印象,为后续讲解具体 widget 用法做铺垫,免得在大量 widget 中迷失自我。

最后附上 flutter\packages\flutter\lib 路径下所有的文件和文件夹以及子文件夹中的内容。

│  analysis_options_user.yaml
│  animation.dart
│  cupertino.dart
│  foundation.dart
│  gestures.dart
│  material.dart
│  painting.dart
│  physics.dart
│  rendering.dart
│  scheduler.dart
│  semantics.dart
│  services.dart
│  widgets.dart
│  
└─src
    ├─animation
    │      animation.dart
    │      animations.dart
    │      animation_controller.dart
    │      curves.dart
    │      listener_helpers.dart
    │      tween.dart
    │      tween_sequence.dart
    │      
    ├─cupertino
    │      action_sheet.dart
    │      activity_indicator.dart
    │      app.dart
    │      bottom_tab_bar.dart
    │      button.dart
    │      colors.dart
    │      date_picker.dart
    │      dialog.dart
    │      icons.dart
    │      localizations.dart
    │      nav_bar.dart
    │      page_scaffold.dart
    │      picker.dart
    │      refresh.dart
    │      route.dart
    │      scrollbar.dart
    │      segmented_control.dart
    │      slider.dart
    │      switch.dart
    │      tab_scaffold.dart
    │      tab_view.dart
    │      text_field.dart
    │      text_selection.dart
    │      text_theme.dart
    │      theme.dart
    │      thumb_painter.dart
    │      
    ├─foundation
    │      annotations.dart
    │      assertions.dart
    │      basic_types.dart
    │      binding.dart
    │      bitfield.dart
    │      change_notifier.dart
    │      collections.dart
    │      consolidate_response.dart
    │      constants.dart
    │      debug.dart
    │      diagnostics.dart
    │      isolates.dart
    │      key.dart
    │      licenses.dart
    │      node.dart
    │      observer_list.dart
    │      platform.dart
    │      print.dart
    │      profile.dart
    │      README.md
    │      serialization.dart
    │      synchronous_future.dart
    │      unicode.dart
    │      _bitfield_io.dart
    │      _bitfield_web.dart
    │      _isolates_io.dart
    │      _isolates_web.dart
    │      _platform_io.dart
    │      _platform_web.dart
    │      
    ├─gestures
    │      arena.dart
    │      binding.dart
    │      constants.dart
    │      converter.dart
    │      debug.dart
    │      drag.dart
    │      drag_details.dart
    │      eager.dart
    │      events.dart
    │      force_press.dart
    │      hit_test.dart
    │      long_press.dart
    │      lsq_solver.dart
    │      monodrag.dart
    │      mouse_tracking.dart
    │      multidrag.dart
    │      multitap.dart
    │      pointer_router.dart
    │      pointer_signal_resolver.dart
    │      recognizer.dart
    │      scale.dart
    │      tap.dart
    │      team.dart
    │      velocity_tracker.dart
    │      
    ├─material
    │  │  about.dart
    │  │  animated_icons.dart
    │  │  app.dart
    │  │  app_bar.dart
    │  │  app_bar_theme.dart
    │  │  arc.dart
    │  │  back_button.dart
    │  │  bottom_app_bar.dart
    │  │  bottom_app_bar_theme.dart
    │  │  bottom_navigation_bar.dart
    │  │  bottom_sheet.dart
    │  │  bottom_sheet_theme.dart
    │  │  button.dart
    │  │  button_bar.dart
    │  │  button_theme.dart
    │  │  card.dart
    │  │  card_theme.dart
    │  │  checkbox.dart
    │  │  checkbox_list_tile.dart
    │  │  chip.dart
    │  │  chip_theme.dart
    │  │  circle_avatar.dart
    │  │  colors.dart
    │  │  color_scheme.dart
    │  │  constants.dart
    │  │  data_table.dart
    │  │  data_table_source.dart
    │  │  date_picker.dart
    │  │  debug.dart
    │  │  dialog.dart
    │  │  dialog_theme.dart
    │  │  divider.dart
    │  │  drawer.dart
    │  │  drawer_header.dart
    │  │  dropdown.dart
    │  │  expand_icon.dart
    │  │  expansion_panel.dart
    │  │  expansion_tile.dart
    │  │  feedback.dart
    │  │  flat_button.dart
    │  │  flexible_space_bar.dart
    │  │  floating_action_button.dart
    │  │  floating_action_button_location.dart
    │  │  floating_action_button_theme.dart
    │  │  flutter_logo.dart
    │  │  grid_tile.dart
    │  │  grid_tile_bar.dart
    │  │  icons.dart
    │  │  icon_button.dart
    │  │  ink_decoration.dart
    │  │  ink_highlight.dart
    │  │  ink_ripple.dart
    │  │  ink_splash.dart
    │  │  ink_well.dart
    │  │  input_border.dart
    │  │  input_decorator.dart
    │  │  list_tile.dart
    │  │  material.dart
    │  │  material_button.dart
    │  │  material_localizations.dart
    │  │  material_state.dart
    │  │  mergeable_material.dart
    │  │  outline_button.dart
    │  │  page.dart
    │  │  page_transitions_theme.dart
    │  │  paginated_data_table.dart
    │  │  popup_menu.dart
    │  │  progress_indicator.dart
    │  │  radio.dart
    │  │  radio_list_tile.dart
    │  │  raised_button.dart
    │  │  range_slider.dart
    │  │  refresh_indicator.dart
    │  │  reorderable_list.dart
    │  │  scaffold.dart
    │  │  scrollbar.dart
    │  │  search.dart
    │  │  shadows.dart
    │  │  slider.dart
    │  │  slider_theme.dart
    │  │  snack_bar.dart
    │  │  snack_bar_theme.dart
    │  │  stepper.dart
    │  │  switch.dart
    │  │  switch_list_tile.dart
    │  │  tabs.dart
    │  │  tab_bar_theme.dart
    │  │  tab_controller.dart
    │  │  tab_indicator.dart
    │  │  text_field.dart
    │  │  text_form_field.dart
    │  │  text_selection.dart
    │  │  text_theme.dart
    │  │  theme.dart
    │  │  theme_data.dart
    │  │  time.dart
    │  │  time_picker.dart
    │  │  toggleable.dart
    │  │  tooltip.dart
    │  │  typography.dart
    │  │  user_accounts_drawer_header.dart
    │  │  
    │  └─animated_icons
    │      │  animated_icons.dart
    │      │  animated_icons_data.dart
    │      │  
    │      └─data
    │              add_event.g.dart
    │              arrow_menu.g.dart
    │              close_menu.g.dart
    │              ellipsis_search.g.dart
    │              event_add.g.dart
    │              home_menu.g.dart
    │              list_view.g.dart
    │              menu_arrow.g.dart
    │              menu_close.g.dart
    │              menu_home.g.dart
    │              pause_play.g.dart
    │              play_pause.g.dart
    │              search_ellipsis.g.dart
    │              view_list.g.dart
    │              
    ├─painting
    │      alignment.dart
    │      basic_types.dart
    │      beveled_rectangle_border.dart
    │      binding.dart
    │      borders.dart
    │      border_radius.dart
    │      box_border.dart
    │      box_decoration.dart
    │      box_fit.dart
    │      box_shadow.dart
    │      circle_border.dart
    │      clip.dart
    │      colors.dart
    │      continuous_rectangle_border.dart
    │      debug.dart
    │      decoration.dart
    │      decoration_image.dart
    │      edge_insets.dart
    │      flutter_logo.dart
    │      fractional_offset.dart
    │      geometry.dart
    │      gradient.dart
    │      image_cache.dart
    │      image_decoder.dart
    │      image_provider.dart
    │      image_resolution.dart
    │      image_stream.dart
    │      inline_span.dart
    │      matrix_utils.dart
    │      notched_shapes.dart
    │      paint_utilities.dart
    │      placeholder_span.dart
    │      rounded_rectangle_border.dart
    │      shader_warm_up.dart
    │      shape_decoration.dart
    │      stadium_border.dart
    │      strut_style.dart
    │      text_painter.dart
    │      text_span.dart
    │      text_style.dart
    │      _network_image_io.dart
    │      _network_image_web.dart
    │      
    ├─physics
    │      clamped_simulation.dart
    │      friction_simulation.dart
    │      gravity_simulation.dart
    │      simulation.dart
    │      spring_simulation.dart
    │      tolerance.dart
    │      utils.dart
    │      
    ├─rendering
    │      animated_size.dart
    │      binding.dart
    │      box.dart
    │      custom_layout.dart
    │      custom_paint.dart
    │      debug.dart
    │      debug_overflow_indicator.dart
    │      editable.dart
    │      error.dart
    │      flex.dart
    │      flow.dart
    │      image.dart
    │      layer.dart
    │      list_body.dart
    │      list_wheel_viewport.dart
    │      object.dart
    │      paragraph.dart
    │      performance_overlay.dart
    │      platform_view.dart
    │      proxy_box.dart
    │      rotated_box.dart
    │      shifted_box.dart
    │      sliver.dart
    │      sliver_fill.dart
    │      sliver_fixed_extent_list.dart
    │      sliver_grid.dart
    │      sliver_list.dart
    │      sliver_multi_box_adaptor.dart
    │      sliver_padding.dart
    │      sliver_persistent_header.dart
    │      stack.dart
    │      table.dart
    │      table_border.dart
    │      texture.dart
    │      tweens.dart
    │      view.dart
    │      viewport.dart
    │      viewport_offset.dart
    │      wrap.dart
    │      
    ├─scheduler
    │      binding.dart
    │      debug.dart
    │      priority.dart
    │      ticker.dart
    │      
    ├─semantics
    │      binding.dart
    │      debug.dart
    │      semantics.dart
    │      semantics_event.dart
    │      semantics_service.dart
    │      
    ├─services
    │      asset_bundle.dart
    │      binary_messenger.dart
    │      binding.dart
    │      clipboard.dart
    │      font_loader.dart
    │      haptic_feedback.dart
    │      keyboard_key.dart
    │      keyboard_maps.dart
    │      message_codec.dart
    │      message_codecs.dart
    │      platform_channel.dart
    │      platform_messages.dart
    │      platform_views.dart
    │      raw_keyboard.dart
    │      raw_keyboard_android.dart
    │      raw_keyboard_fuchsia.dart
    │      raw_keyboard_linux.dart
    │      raw_keyboard_macos.dart
    │      system_channels.dart
    │      system_chrome.dart
    │      system_navigator.dart
    │      system_sound.dart
    │      text_editing.dart
    │      text_formatter.dart
    │      text_input.dart
    │      
    └─widgets
            actions.dart
            animated_cross_fade.dart
            animated_list.dart
            animated_size.dart
            animated_switcher.dart
            annotated_region.dart
            app.dart
            async.dart
            automatic_keep_alive.dart
            banner.dart
            basic.dart
            binding.dart
            bottom_navigation_bar_item.dart
            container.dart
            debug.dart
            dismissible.dart
            draggable_scrollable_sheet.dart
            drag_target.dart
            editable_text.dart
            fade_in_image.dart
            focus_manager.dart
            focus_scope.dart
            focus_traversal.dart
            form.dart
            framework.dart
            gesture_detector.dart
            grid_paper.dart
            heroes.dart
            icon.dart
            icon_data.dart
            icon_theme.dart
            icon_theme_data.dart
            image.dart
            image_icon.dart
            implicit_animations.dart
            inherited_model.dart
            inherited_notifier.dart
            layout_builder.dart
            list_wheel_scroll_view.dart
            localizations.dart
            media_query.dart
            modal_barrier.dart
            navigation_toolbar.dart
            navigator.dart
            nested_scroll_view.dart
            notification_listener.dart
            orientation_builder.dart
            overlay.dart
            overscroll_indicator.dart
            pages.dart
            page_storage.dart
            page_view.dart
            performance_overlay.dart
            placeholder.dart
            platform_view.dart
            preferred_size.dart
            primary_scroll_controller.dart
            raw_keyboard_listener.dart
            routes.dart
            safe_area.dart
            scrollable.dart
            scrollbar.dart
            scroll_activity.dart
            scroll_configuration.dart
            scroll_context.dart
            scroll_controller.dart
            scroll_metrics.dart
            scroll_notification.dart
            scroll_physics.dart
            scroll_position.dart
            scroll_position_with_single_context.dart
            scroll_simulation.dart
            scroll_view.dart
            semantics_debugger.dart
            shortcuts.dart
            single_child_scroll_view.dart
            size_changed_layout_notifier.dart
            sliver.dart
            sliver_persistent_header.dart
            sliver_prototype_extent_list.dart
            spacer.dart
            status_transitions.dart
            table.dart
            text.dart
            texture.dart
            text_selection.dart
            ticker_provider.dart
            title.dart
            transitions.dart
            unique_widget.dart
            value_listenable_builder.dart
            viewport.dart
            visibility.dart
            widget_inspector.dart
            widget_span.dart
            will_pop_scope.dart
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容