1,Widget
在 Flutter 中一切的显示都是 Widget ,包括对齐(alignment),填充(padding)和布局(layout)等,他们都是以widget的形式提供的。 Widget 是一切的基础,利用响应式模式进行渲染。
我们可以通过修改数据,再用setState 设置数据,Flutter 会自动通过绑定的数据更新 Widget , 所以你需要做的就是实现 Widget 界面,并且和数据绑定起来。
Widget 分为 有状态 和 无状态 两种,在 Flutter 中每个页面都是一帧,无状态就是保持在那一帧,而有状态的 Widget 当数据更新时,其实是创建了新的 Widget,只是 State 实现了跨帧的数据同步保存。
Tip:
这里有个小 Tip ,当代码框里输入 stl 的时候,可以自动弹出创建无状态控件的模板选项,而输入 stf 的时,就会弹出创建有状态 Widget 的模板选项。
2,有状态StatefulWidget,State生命周期
initState :初始化,理论上只有初始化一次,第二篇中会说特殊情况下。
didChangeDependencies:在 initState 之后调用,此时可以获取其他 State 。
dispose :销毁,只会调用一次。
看到没,Flutter 其实就是这么简单!你的关注点只要在:创建你的 StatelessWidget 或者 StatefulWidget 而已。你需要的就是在 build 中堆积你的布局,然后把数据添加到 Widget 中,最后通过 setState 改变数据,从而实现画面变化。
3,Column、Row 布局
mainAxisAlignment://主轴方向,Column的竖向、Row的横向
crossAxisAlignment: //副轴方向,Column的横向、Row的竖向
1,代码缩进
提示: 将代码粘贴到应用中时,缩进可能会变形。您可以使用Flutter工具自动修复此问题:
1,Android Studio / IntelliJ IDEA: 右键单击Dart代码,然后选择 Reformat Code with dartfmt.
2,VS Code: 右键单击并选择 Format Document.
3,Terminal: 运行 flutter format <filename>.
2,open ios/Runner.xcworkspace
在你Flutter项目目录中通过 open ios/Runner.xcworkspace 打开默认的Xcode workspace.
3,运行flutter项目:
flutter run
4,下载依赖包:
flutter packages get
5,开发依赖项
开发依赖项是不包含在我们的应用程序源代码中的依赖项,它是开发过程中的一些辅助工具、脚本,和node中的开发依赖项相似。
比如要包含json_serializable到我们的项目中,我们需要一个常规和两个开发依赖项:
dependencies:
Your other regular dependencies here
json_annotation: ^2.0.0
dev_dependencies:
Your other dev_dependencies here
build_runner: ^1.0.0
json_serializable: ^2.0.0
6,dependencies和dev_dependencies
dependencies:应用或包依赖的其他包或插件。
dev_dependencies:开发环境依赖的工具包(而不是Flutter应用本身依赖的包)。
dependencies依赖的包将作为APP的源码的一部分参与编译,生成最终的安装包。而dev_dependencies依赖的包只是作为开发阶段的一些工具包,主要用于帮助我们提高开发和测试效率,比如Flutter的自动化测试包等。
6,平台通道
由于Flutter本身只是一个UI系统,它本身是无法提供一些系统能力,比如使用蓝牙、相机、GPS等,因此要在Flutter APP中调用这些能力就必须和原生平台进行通信。为此,Flutter中提供了一个平台通道(platform channel),用于Flutter和原生平台的通信。平台通道正是Flutter和原生之间通信的桥梁,它也是Flutter插件的底层基础设施。
7,CPU和GPU
CPU和GPU的任务是各有偏重的,CPU主要用于基本数学和逻辑计算,而GPU主要执行和图形处理相关的复杂的数学,如矩阵变化和几何计算,GPU的主要作用就是确定最终输送给显示器的各个像素点的色值。
8,插槽
所谓插槽,就是指预留的一个接口或位置,这个接口和位置是由其它对象来接入或占据的,这个接口或位置在软件中通常用预留变量来表示。(14.3)
9,vsync
垂直同步信号
10,FPS(Frame Per-Second)
我们之前说的Flutter可以实现60fps,就是指一秒钟可以触发60次重绘,FPS值越大,界面就越流畅。(14.4)
11,全局变量和共享状态
全局变量就是单纯指会贯穿整个APP生命周期的变量,用于单纯的保存一些信息,或者封装一些全局工具和方法的对象。而共享状态则是指哪些需要跨组件或跨路由共享的信息,这些信息通常也是全局变量,而共享状态和全局变量的不同在于前者发生改变时需要通知所有使用该状态的组件,而后者不需要。(15.4)
12,dependOnInheritedWidgetOfExactType() 和 getElementForInheritedWidgetOfExactType()的区别
区别就是前者会注册依赖关系,而后者不会。(7.3)
13,GlobalKey
Flutter还有一种通用的获取State对象的方法——通过GlobalKey来获取! 步骤分两步:
1,给目标StatefulWidget添加GlobalKey。
//定义一个globalKey, 由于GlobalKey要保持全局唯一性,我们使用静态变量存储
static GlobalKey<ScaffoldState> _globalKey= GlobalKey();
...
Scaffold(
key: _globalKey , //设置key
...
)
2,通过GlobalKey来获取State对象
_globalKey.currentState.openDrawer()
GlobalKey是Flutter提供的一种在整个APP中引用element的机制。如果一个widget设置了GlobalKey,那么我们便可以通过globalKey.currentWidget获得该widget对象、globalKey.currentElement来获得widget对应的element对象,如果当前widget是StatefulWidget,则可以通过globalKey.currentState来获得该widget对应的state对象。
注意:使用GlobalKey开销较大,如果有其他可选方案,应尽量避免使用它。另外同一个GlobalKey在整个widget树中必须是唯一的,不能重复。
14,遇到问题求助:Stack Overflow, GitHub issue
网友评论