专栏首页Flutter【Flutter实战】Flutter 中那么多组件,难道要都学一遍?

【Flutter实战】Flutter 中那么多组件,难道要都学一遍?

历史上的今天

通古斯因陨星坠落发生大爆炸,1908年6月30日上午7时,在中西伯利亚上空,一个雪亮的火球从东南向西北掠空而过。一个几十万吨重的大流星落在通古斯河以北。从叶尼塞河至勒拿河之间1500公里的范围都曾看见,爆炸声在直径为2000公里范围可听到,世界各地的地震仪都有地震波记录下来。

流星降落的头几夜,天光明亮,在高加索不用点灯即可看报。像通古斯这样的巨型陨星,迄今发现的只有10个,其中最大的两个均落在西伯利亚。另一个于1947年2月12日上午11时,落在海参崴附近的老爷岭山脉,故称老爷岭陨星。通古斯卡陨星以每秒60公里的速度向地球迎面冲击。由于速度太快,在空中都烧毁了,地面上难以找到它的碎片。

正文

在 Flutter 中一切皆是 组件,仅仅 Widget 的子类和间接子类就有 350 多个,整理的 Flutter组件继承关系图(文末有地址) 可以帮助大家更好的理解学习 Flutter,回归正题,如此多的组件到底如果学习,真的需要学习 350 多个组件?

在经济学中有一个著名的定律 二八定律

二八定律 是意大利经济学家帕累托发现的。帕累托认为任何一组东西中最重要的只占其中一小部分约占20%,其余80%尽管是多数,却是次要的。

学习 Flutter 也同样适用于二八定律,大部分组件是平时很少用到的,因此作为初学者,只需学习那 20% 常用的组件即可,常用的组件及案例地址:http://laomengit.com/guide/introduction/mobile_system.html

除了常用组件外,还总结了300多个其余组件的详细用法,这些组件可以作为手册,需要的时候再查阅即可,地址:http://laomengit.com/flutter/widgets/widgets_structure.html

组件树

Flutter 创建App的时候,所有的组件最后会生成一个组件树,例如如下代码:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
      ),
      home: Scaffold(
        body: Text('老孟'),
      ),
    );
  }
}

main 函数是应用程序开始的地方,运行 MyApp 组件。生成的组件树如下:

让 Text 组件居中,修改如下:

Scaffold(
  body: Center(
    child: Text('老孟'),
  ),
)

生成的组件树如下:

给应用程序添加 AppBar:

Scaffold(
  appBar: AppBar(),
  body: Center(
    child: Text('老孟'),
  ),
)

生成的组件树如下:

Stateful vs Stateless

Flutter 组件分为 无状态组件(StatelessWidget)有状态组件(StatefulWidget) 两种。它们唯一的区别就是运行时 重新加载 组件的方式不同,StatelessWidget 组件重新加载时重新创建当前组件的实例,而StatefulWidget组件重新加载时不会重新创建实例,而是重新执行 build 函数。

StatelessWidget 组件创建的方式:

class StatelessWidgetDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

build 函数返回当前组件,此组件一旦创建将不可改变,build 函数只能执行一次。如果想重新绘制此组件,只能重新创建此组件新的实例。

StatefulWidget 组件创建的方式:

class StatefulWidgetDemo extends StatefulWidget {
  @override
  _StatefulWidgetDemoState createState() => _StatefulWidgetDemoState();
}

class _StatefulWidgetDemoState extends State<StatefulWidgetDemo> {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

StatefulWidget 组件的创建方式和 StatelessWidget 不同,State<> 中的 build 函数返回当前组件,有状态的组件可以在其生命周期内多次重绘,即多次调用 build 函数,而不是创建一个新的实例。

StatefulWidget 组件重绘需要调用 setstate 方法,setState 会使其自身及其子组件重绘,所以尽量封装 StatefulWidget 组件,避免无效的重建和重绘,影响性能。

快速书写小技巧:在 Android Studio 和 VS Code 中 输入 stl 然后点击回车,可以快速创建 StatelessWidget 组件,同理输入 stf 点击回车,可以快速创建 StatefulWidget 组件,这是编辑器 Live Templates 的功能。

Material vs Cupertino

Flutter 中包含两套风格的组件,分别是 Material 和 Cupertino ,Cupertino 是 iOS风格的组件,命名都带 Cupertino 前缀,比如 CupertinoSlider 、 CupertinoDatePicker 等, Material Design 是由 Google 推出,旨在为手机、平板电脑、台式机和“其他平台”提供更一致、更广泛的“外观和感觉”。

Flutter 使用一套代码在不同的平台上表现一致,它不会根据不同的平台绘制不同的外形,比如使用 AlertDialog 弹出警告框,不管在 Android 上,还是在 iOS上效果是一样。

但有一些功能 Flutter 区分平台,比如 ListView 滑动到底部时继续滑动,Android 底部会出现淡蓝色(默认情况下)拱形,而 iOS 上则没有,这是因为 Flutter 在封装此组件时在代码中区分了平台,所以在查看 Flutter 源码到过程中会经常看到根据不同的平台做不同处理的情况。

Flutter组件继承关系图地址:http://laomengit.com/flutter/widgets/widgets_structure.html

本文分享自微信公众号 - 老孟Flutter(lao_meng_qd),作者:老孟Flutter

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 说一句最好的Flutter开源项目也不过分

    老孟导读:首先声明此项目不是我完成的,是大神`张风捷特烈`呕心沥血之作,对初学者有极大对帮助,当然我获得了大神`张风捷特烈`的授权,所以我不是盗版哦。

    老孟Flutter
  • 【Flutter组件终结篇】332个组件 658页PDF

    老孟导读:历时1年的时间,整理完成了330+组件的详细用法,不仅包含UI组件,还包含了功能性的组件。

    老孟Flutter
  • 一篇带你看懂Flutter叠加组件Stack

    Stack未定位的子组件大小由fit参数决定,默认值是StackFit.loose,表示子组件自己决定,StackFit.expand表示尽可能的大,用法如下:

    老孟Flutter
  • ExtJS关于组件Component生命周期

      初始化工作开始于组件的诞生,所有必须的配置设定、事件注册、预渲染处理等都在此时进行。

    yaohong
  • vue -- 7 个 有用的 Vue 开发技巧

    随着组件的细化,就会遇到多组件状态共享的情况, Vuex当然可以解决这类问题,不过就像 Vuex官方文档所说的,如果应用不够大,为避免代码繁琐冗余,最好不要使用...

    小蔚
  • 微信小程序组件调用和传值

    微信小程序像Vue和React一样赋于了组件的开发能力,支持组件的调用和传值,同时由于小程序上传时限制在2MB以内,对于稍微大一点的小程序组件的使用就特别重要了...

    越陌度阡
  • 关于组件,你真的了解么?

    最近经常听到“组件化开发”,那架构设计里,组件到底如何定义、设计和应用呢,今天我们一起来聊聊。

    架构精进之路
  • vue父组件传字符串到子组件不需要写 v-bind 绑定或语法糖 :

    跟着阿笨一起玩NET
  • 代码组件 | 我的代码没有else

    前端大行组件化的当今,我们在写后端接口代码的时候还是按照业务思路一头写到尾吗?我们是否可以思索,「后端接口业务代码如何可以简单快速组件化?」,答案是肯定的,这就...

    用户1093396
  • vuejs中的组件以及父子组件间通信传值

    您将在本文当中了解到,往网页中添加数据,从传统的dom操作过渡到数据层操作,实现同一个目标,两种不同的方式.以及什么是组件,如何定义和使用组件,父子组件之间如何...

    itclanCoder

扫码关注云+社区

领取腾讯云代金券