什么是Widget?
Flutter Widget是受到了react的启发,用react框架语法创建的。你可以利用Widget创建你的UI界面,Widget通过配置以及状态决定视图该如何展示出来。当状态改变的时候,Widget会借助渲染树只改变不同的地方,借此提高渲染效率。以下几类Widget是使用的比较多的:Text类,Row/Column类,Stack类,Container类。在Flutter中,将Widget视为可视组件,或与应用程序的可视方面交互的组件。
必须重写的build方法
Missing concrete implementation of StatelessWidget.build。不管是无状态的Widget还是有状态的Widget,我们在重写的时候都必须实现其build方法,要么是在createState() 中实现,要么是直接重写。
Widget-MaterialApp
一个方便的Widget,它会把许多MaterialDesign常用的Widget包裹起来,常用的属性字段有color,home,routes,theme,title。为了继承Material主题的样式,我们的应用需要从Widget-MaterialApp开始,因此我们通常会使用MaterialApp作为顶层的Widget。Material应用程序以Widget-MaterialApp开始,该Widget在应用程序的底部创建了一些有用的widget,其中包括一个Navigator,它管理由字符串标识的widget栈,即页面路由栈。Navigator可以让你的应用程序在页面之间平滑的过渡。
Widget-Scaffold
实现了基本的Material Design可视化布局结构,这个Widget提供了关于drawers,snack bars,bottom sheets的相应API,常用的属性字段有appBar,backgroundColor,body,drawer,bottomSheet,floatingActionButton。
Widget-ListView
一个可以上下滚动的线性Widget列表,ListView是最为常用的可滚动Widget。它在滚动的同时展示它的每一个子组件,在垂直于滚动方向上,子组件会充满整个ListView。
Widget-ListTile
单个固定高度的一行,通常来说,会显示一些小图标加上文字描述。
提供divideTiles函数,接收三个参数,BuildContext,Iterable<Widget>,Color,给每行之间加上一像素的边框,如果没有指定颜色,则使用context中的Theme里的ThemeData.dividerColor。
new从Dart2开始是可选的
在Dart中没有诸如public,private,protected这样的关键词,默认的都是public的,不过带下划线的类或者成员变量会被认为是私有的。
~/
Dart中返回一个整数的除法
final和const的区别
在Dart中,final和const意味着两种完全不同的东西:
1. final表示单一赋值,final变量或字段必须初始化,一旦赋值,就不能改变final变量的值。final用来修饰变量。
2. const用来修饰值,你可以在创建集合时使用它,比如const [1,2,3],也可以在使用构造函数时使用它,比如const Point(2,3)。在这里,const意味着整个对象的深度状态可以在编译时完全确定,并且对象将被冻结and完全不可变。
页面之间的切换靠路由
在Flutter中,导航器Navigator负责管理应用程序的路由栈,将路由push到导航器Navigator的栈中,将会显示更新为该路由页面,从导航器Navigator的栈中pop出路由,将显示返回到上一个路由页面。
Widget的多个子Widget
有些Widget的有些属性需要单个子Widget,而其他的某些属性,需要多个子Widget,需要一组Widget,此时用方括号表示[]。
MaterialPageRoute、CupertinoPageRoute
Navigator.push的参数为Route,一般在MaterialApp中使用MaterialPageRoute,在MaterialPageRoute中定义了Route所代表的界面的Widget信息。如果使用MaterialApp的属性routes定义了全局的路由信息,则可以使用Navigator.pushNamed函数来显示一个具体的界面。MaterialPageRoute是一个PageRoute,用来替换整个屏幕,并且带有过渡动画,builder方法必须重写。CupertinoPageRoute是一个PageRoute,用来替换整个屏幕,并且带有IOS过渡动画。
定义各种路由
在Flutter中,像对话框、菜单、Dropdown下拉选项、BottomSheet等都是通过显示一个Route实现的。在Flutter中有三种路由:PopupRoute、ModalRoute和PageRoute,使用这些路由可以实现各种弹出界面。
什么是Builder?
一个柏拉图式的Widget,用闭包来得到其子Widget。
什么是BuildContext?
一个Widget在当前的Widget树中的位置的句柄。
为什么是final?
Widget子类中的字段往往都会定义为"final"
Widget-Container
A convenience widget that combines common paintings, positioning, and sizing widgets.一个方便的Widget,结合绘制、定位和尺寸。
Widget-Row和Widget-Column
Widget中的Row是水平方向的线性布局(linear layout),children属性接收一个Widget数组,比如children:<Widget>[],这个时候可以用Widget-Expanded来填充尚未被其他子项占用的剩余可用空间,Widget-Expanded可以拥有多个children,然后使用flex参数来确定它们占用剩余空间的比例。
为什么StatefulWidget和State是两个单独的对象?
在Flutter中,这两种对象具有不同的生命周期,widget是临时的对象,用于构建当前配置和状态下的可视组件。而State对象在多次调用build之间保持不变,允许它们记住信息。在Flutter中,事件流是向上传递的,状态流是向下传递的,这类似于React中父子组件通信的方式,子widget到父widget是通过事件通信,而父widget到子widget是通过状态通信,重定向这一流程的共同父元素是State对象。
如何将带状态的复杂组件解耦?
自定义一个widget是无状态的,可以在将构造函数中将接收到的函数或者值存储在final成员变量中,然后在build函数中使用它们。责任分离允许将复杂性逻辑封装在各个widget中,同时保持父项的单纯性。
Dart中的静态构造函数(单例模式)
如果想要让类产生一个永远不会改变的对象,可以让这个对象成为编译时常量。为此,需要定义一个const构造函数,并且确保所有的成员变量都是final关键字修饰的。
Dart中的构造函数
下面是构造函数的执行顺序:
1. initializer list(初始化参数列表)
2. superclass's no-arg constructor(超类的无名构造函数super.xxx)
3. mainclass's no-arg constructor(主烤瓷的无名构造函数this.xxx)