Widget与Element
Widget其实并不是表示最终绘制在设备屏幕上的显示元素,而它只是描述显示元素的一个配置数据。
StatelessWidget
StatelessWidget用于不需要维护状态的场景,它通常在build方法中通过嵌套其它Widget来构建UI,在构建过程中会递归的构建其嵌套的Widget。
Context
build方法有一个context参数,它是BuildContext类的一个实例,表示当前widget在widget树中的上下文,每一个widget都会对应一个context对象(因为每一个widget都是widget树上的一个节点)。实际上,context是当前widget在widget树中位置中执行”相关操作“的一个句柄,比如它提供了从当前widget开始向上遍历widget树以及按照widget类型查找父级widget的方法。
classContextRouteextendsStatelessWidget{@overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:Text("Context测试"),),body:Container(child:Builder(builder:(context){//在Widget树中向上查找最近的父级`Scaffold`widgetScaffoldscaffold=context.ancestorWidgetOfExactType(Scaffold);//直接返回AppBar的title,此处实际上是Text("Context测试")return(scaffold.appBarasAppBar).title;}),),);}}StatefulWidget
State
一个StatefulWidget类会对应一个State类,State表示与其对应的StatefulWidget要维护的状态,State中的保存的状态信息可以:
在widget构建时可以被同步读取。在widget生命周期中可以被改变,当State被改变时,可以手动调用其setState()方法通知Flutterframework状态发生改变,Flutterframework在收到消息后,会重新调用其build方法重新构建widget树,从而达到更新UI的目的。
State生命周期
classCounterWidgetextendsStatefulWidget{constCounterWidget({Keykey,this.initValue:0});finalintinitValue;@override_CounterWidgetStatecreateState()=>new_CounterWidgetState();}class_CounterWidgetStateextendsState<CounterWidget>{int_counter;@overridevoidinitState(){super.initState();//初始化状态_counter=widget.initValue;print("initState");}@overrideWidgetbuild(BuildContextcontext){print("build");returnScaffold(body:Center(child:FlatButton(child:Text('$_counter'),//点击后计数器自增onPressed:()=>setState(()=>++_counter,),),),);}@overridevoiddidUpdateWidget(CounterWidgetoldWidget){super.didUpdateWidget(oldWidget);print("didUpdateWidget");}@overridevoiddeactivate(){super.deactivate();print("deactive");}@overridevoiddispose(){super.dispose();print("dispose");}@overridevoidreassemble(){super.reassemble();print("reassemble");}@overridevoiddidChangeDependencies(){super.didChangeDependencies();print("didChangeDependencies");}}