Flutter应用程序是由一些零散且有关联的控件组成的,那么控件是什么?控件,就是你在屏幕上看到那些东西。例如,一间教室相当于一个屏幕,它里面可以放椅子,也可以放桌子,教室就是一个控件。在这个教室里,放一张桌子,在上面写上“Hello World”这个经典名句,桌子就是一个控件,它上面写有文字。这相当于你在屏幕上放一个Text控件,然后在Text控件的data属性中写上“Hello World”这句话。你也可以在教室里放一把椅子,在它上面画上一幅画,这个凳子就是一个控件,它上面放一幅画。这就好比在屏幕上放一个Image控件,然后在Image控件的file属性中放一张图片。

因此,在开始设计第一个Flutter应用前,很有必要先了解Flutter的控件,因为你以后会经常和它们打交道。如果你已经创建了一个Flutter项目,会发现/lib目录下的每一个.dart(Flutter代码文件格式)文件的第一行都会导入flutter/material.dart包。

import 'package:flutter/material.dart';

material包是Flutter实现Material Design设计风格的基础包,其中有Text、Icon、Image等基础控件,有Align、Column、Decoration等布局控件,更多的还有异步控件、动画控件以及其他函数与方法。更多关于material包的细节,请访问Flutter API文档。

每一个Flutter项目的/lib目录下都有一个main.dart文件,打开该文件,里面应该有一个main()函数。Flutter使用Dart语言开发,而在Dart语言中,main()函数是Dart程序的入口,也就是说,Flutter程序在运行的时候,第一个执行的函数就是main()函数。

void main() => runApp(Widget app);

如果你是第一次接触Dart语言,可能会对上面的语法感到陌生,这是一种Dart语言特有的速写语法,将其展开后,完整语法如下所示。

void main() {return runApp(Widget app);
}

从上面的代码中可以看到,main()函数中只调用runApp函数,使用runApp函数可以将给定的根控件填满整个屏幕。你可能会有疑问,为什么一定要使用runApp函数?如果不调用runApp函数,项目也可以正常执行,但是屏幕上什么都不会显示。Flutter是Dart语言的移动应用框架,runApp函数就是Flutter框架的入口,如果不调用runApp函数,那你执行的就是一个Dart控制台应用。更多关于Dart语言的细节,请访问Dart API文档。

在Dart代码中,如果定义类时继承了StatelessWidgetStatefulWidget抽象类,说明该类是StatelessWidgetStatefulWidget抽象类的子类,即Flutter控件类。在Flutter框架中,控件类又细分为有状态控件类(继承StatefulWidget抽象类)和无状态控件类(继承StatelessWidget抽象类),两者的差别在于是否有状态。

有状态控件类是具有可变状态的控件,创建一个有状态控件类的实例时,会调用StatefulWidget.createState抽象方法在控件树中的给定位置创建这个控件的可变状态,Flutter框架中的状态有两个特点:可以在构建控件时同步读取信息、在控件的生命周期内可以改变。当控件的配置被更改时会调用State.didUpdateWidget方法,此时框架会重新绘制控件。你也可以使用State.setState方法在状态发生变化时通知框架,告诉框架该对象的内部状态已经改变,框架接到通知后也会重新绘制控件。更多关于StatefulWidget抽象类的细节,请访问Flutter API文档。

无状态控件类是不需要可变状态的控件,无状态控件的构建方法通常只在以下三种情况下被调用:第一次将控件插入到控件树中、第一次在控件的父级更改配置时、使用InheritedWidget抽象类(控件的基类)时。更多关于StatelessWidget抽象类的细节,请访问Flutter API文档。

在上面的图片中,有一个BuildContext抽象类,它表示一个控件在整个控件树中的位置句柄,每个控件都有自己的BuildContext实例。某些静态函数(例如showDialog、Theme.of等)也有BuildContext实例,以便它们可以代表调用控件或专门针对给定上下文获取数据。BuildContext对象被传递给WidgetBuilder函数,它为创建控件的函数签名,例如StatelessWidget.buildState.build

你也可以从State.context属性中获得BuildContext对象,在使用StatefulWidget.createState创建它们之前以及在调用initState之前,框架将State对象与BuildContext关联起来,该关联是永久的:State对象永远不会改变它的BuildContext(但是BuildContext本身可以在控件树中移动)。更多关于BuildContext抽象类的细节,请访问Flutter API文档。

看到这里的你估计是一脸懵逼的,不过没关系,现在先留一个印象,以后遇到相关内容时再回来看看。简单地总结一下本文:一个Flutter应用是由各种不同功能的控件组成的。当你想展示的内容只需要改动控件本身的配置信息就可以实现时,例如文本、图像等,可以考虑使用无状态控件(StatelessWidget)。如果你想展示的内容是可以动态改变才能实现时,例如滚动列表、动画效果等,可以考虑使用有状态控件(StatefulWidget)。

Flutter框架基础相关推荐

  1. Flutter框架分析(五)-- 动画

    Flutter框架分析分析系列文章: <Flutter框架分析(一)-- 总览和Window> <Flutter框架分析(二)-- 初始化> <Flutter框架分析(三 ...

  2. 深入理解 Flutter 框架层次结构

    作者: Frederik Schweiger 链接 : The Layer Cake Flutter 是一个非常优秀的跨平台开发框架,基于 Flutter 我们可以用很少的代码快速的开发出界面精美的 ...

  3. Flutter 框架层次结构

    作者:Frederik Schweiger 链接: https://medium.com/flutter-community/the-layer-cake-widgets-elements-rende ...

  4. Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版 没有什么不可能  之前一直用的是自 ...

  5. python学习框架图-Python学习---Python的框架基础学习

    框架基础 框架实质: 所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 B/S结构的响应: import socket def handle_requ ...

  6. 《Android的设计与实现:卷I》——第2章 框架基础JNI

    第2章 框架基础JNI JNI(Java Native Interface,Java本地接口)是Java平台上定义的一套标准的本地编程接口.JNI允许Java代码与本地代码互操作,即Java代码可以调 ...

  7. python前端学习-------Flask框架基础(建议收藏)

    Flask框架基础 下载并安装Flask框架 Flask基础 第一个Flask应用 开启调试模式 路由 变量规则 构造URL HTTP方法 模板 语法格式 模板变量 控制结构 条件控制语句 `if` ...

  8. data spring 指定时区_Spring 框架基础(05):Mvc架构模式,执行流程详解

    本文源码:GitHub || GitEE 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面, ...

  9. php 框架获取服务器,Thinkphp 框架基础之源码获取、环境要求与目录结构分析

    本文实例讲述了Thinkphp 框架基础之源码获取.环境要求与目录结构.分享给大家供大家参考,具体如下: 获取ThinkPHP 获取ThinkPHP的方式很多,官方网站(http://thinkphp ...

最新文章

  1. [UWP小白日记-10]程序启动屏(ios解锁既视感)
  2. 打包caddy为docker镜像
  3. Facebook 开源了一整套重要的 Linux 内核组件与工具!
  4. Ios 被拒出现3.1.1
  5. 服务器重装系统网站打不开怎么办,网页打不开,小编教你网页打不开怎么办
  6. heidisql导出为mysql_HeidiSQL工具导出导入MySQL数据
  7. mongodb php存储日志,laravel 框架使用mongodb 保存日志
  8. 企业财务分析一头雾水?有了这个财务报表工具,问题一键解决
  9. python:实现峰值信噪比算法(附完整源码)
  10. 江苏开票系统安全接入服务器地址,江苏省增值税发票查询平台网址.doc
  11. 二、python解析XML文档
  12. MATLAB ttest和ttest2的区别
  13. Web快速开发平台,基于二次开发平台
  14. python调用virustota接口api实现上传文件返回查毒结果
  15. KVM虚拟化,云平台
  16. 2023最新淘宝天猫商品销量,宝贝详情,店铺列表信息分析
  17. 59.qt quick-qml调色板(颜色取色器)实现、自定义QQuickStyle样式
  18. 【汇正财经】选股有什么策略?如何找到适合自己的选股策略?
  19. c++ 发邮件(含附件)
  20. 几种常见的RAID工作模式讨论

热门文章

  1. Pytorch:RuntimeError: DataLoader worker (pid 27) is killed by signal: Killed. Details are lost due
  2. numpy.arange()官方用法详解(附numpy官方文档)
  3. matplotlib 绘图代码库(自用)
  4. 面试题 01.01. 判定字符是否唯一 (计数排序思想)
  5. 【Angular 4】响应式编程
  6. Hash类的键值对允不允许为空的问题
  7. mysql 提示ssl问题
  8. SQL SERVER数据库设计与现实
  9. sql server 更新语句
  10. Nowcoder farm ( 树状数组、二维前缀和、二维偏序 )