sobre Widget
concepto
Flutter casi todos los objetos son un widget, el concepto Widget Flutter más amplio, no sólo pueden representar elementos de interfaz de usuario, sino que también puede representar un número de componentes funcionales, tales como: medios para detectar un gesto de la GestureDetector
flash, para transferencia de datos es el tema de APP la Theme
así sucesivamente,
widget y Element
- Widget es en realidad
Element
los datos de configuración, árbol de configuración de widget es en realidad un árbol, y el árbol es la verdadera interfaz de usuario emitida por laElement
constitución; sin embargo, comoElement
se genera por Widget, por lo que hay correspondencia entre ellos, en la mayoría de las escenas, nos widget puede ser ampliamente considerado el árbol se refiere a un árbol o controles de interfaz de usuario de interfaz de usuario render árbol. - objeto Widget puede corresponder a una pluralidad de
Element
objetos. Esto se entiende bien, de acuerdo con una configuración (Widget), puede crear varias instancias (elemento).
Widget ventana principal
@immutable
abstract class Widget extends DiagnosticableTree {
const Widget({ this.key });
final Key key;
@protected
Element createElement();
@override
String toStringShort() {
return key == null ? '$runtimeType' : '$runtimeType-$key';
}
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
properties.defaultDiagnosticsTreeStyle = DiagnosticsTreeStyle.dense;
}
static bool canUpdate(Widget oldWidget, Widget newWidget) {
return oldWidget.runtimeType == newWidget.runtimeType
&& oldWidget.key == newWidget.key;
}
}
Widget
hereda de la clase deDiagnosticableTree
,DiagnosticableTree
a saber, "árbol de diagnóstico", la función principal es proporcionar información de depuración.Key
: Estekey
atributo es similar a React / Vue en elkey
papel principal es decidir si la próximabuild
vez multiplexación widget de edad, las condiciones de la decisióncanUpdate()
proceso.createElement()
: Como se mencionó anteriormente, "puede corresponder a una pluralidad de WidgetElement
"; Flutter Marco de interfaz de usuario al construir el árbol, a llamar a este método para generar un nodo correspondienteElement
objeto. Este método se conoce como aleteo marco implícito en nuestro proceso de desarrollo, básicamente, no pone en.debugFillProperties(...)
método de replicación de la clase padre, sobre todo para establecer el diagnóstico de algunas de las características del árbol.canUpdate(...)
Es un método estático, se utiliza principalmente en el árbol de widgets otra vezbuild
cuando la reutilización widget de edad, de hecho, en concreto, debería ser: ya sea con un nuevo objeto Widget para actualizar el árbol de UI de edad correspondienteElement
objeto de configuración, a través de su código fuente podemos ver, siempre y cuandonewWidget
conoldWidget
elruntimeType
ykey
utilizaremos de forma simultánea EQUALnewWidget
para actualizar losElement
objetos de configuración, de lo contrario se creará una nuevaElement
.
StatelessWidget
Papel: la escena no es necesario para mantener el estado, que por lo general se build
construye mediante una interfaz de usuario anidados Widget otros métodos, el proceso de construcción sería construir su Widget recursiva anidada.
Hereda de Widget
la clase, anular el createElement()
método:
@override
StatelessElement createElement() => new StatelessElement(this);
Contexto
contexto es BuildContext
una instancia de una clase, representa un contexto del widget actual en el árbol del widget, cada uno correspondiente a un widget será un objeto de contexto (widget es un widget, ya que cada nodo de un árbol).
StatefulWidget
StatefulWidget se hereda de la clase Widget, y reescribiendo el método createElement (), la diferencia no es el mismo que objeto elemento devuelto; StatefulWidget añade además una nueva clase de interfaz createState ()
abstract class StatefulWidget extends Widget {
const StatefulWidget({ Key key }) : super(key: key);
@override
StatefulElement createElement() => new StatefulElement(this);
@protected
State createState();
}
StatefulElement
Indirecta heredados deElement
la clase con la correspondiente StatefulWidget (como datos de configuración).StatefulElement
Se le puede llamar varias vecescreateState()
para crear el estado (Estado) objetos.createState()
Y con estado Widget para crear relacionadas con el estado, que se puede llamar varias veces en el ciclo de vida del widget con estado. Por ejemplo, cuando una pluralidad de posiciones inserta simultáneamente en el Stateful widget widget de árbol, marco Flutter llamará a este método para cada ubicación para generar un estado separado casos, de hecho, esencialmente unaStatefulElement
corresponde a un ejemplo de Estado.
estado del ciclo de vida
import 'package:flutter/material.dart';
void main() => runApp(CounterWidget(
initValue: 10,
));
class CounterWidget extends StatefulWidget {
final int initValue;
const CounterWidget({Key key, this.initValue});
@override
_CounterWidgetState createState() => _CounterWidgetState();
}
class _CounterWidgetState extends State<CounterWidget> {
int _counter;
/**
* 第一次被调用
*/
@override
void initState() {
super.initState();
//初始化状态
_counter = widget.initValue;
print("生命周期:initState");
}
@override
Widget build(BuildContext context) {
print("生命周期:build");
return MaterialApp(
title: "计数器",
home: Scaffold(
appBar: AppBar(
title: Text("计数器"),
),
body: Center(
child: FlatButton(
child: Text("$_counter"),
//点击后计数器自增
onPressed: () => setState(() => ++_counter),
),
),
),
);
}
//在新旧widget的key和runtimeType同时相等时didUpdateWidget()就会被调用
@override
void didUpdateWidget(CounterWidget oldWidget) {
super.didUpdateWidget(oldWidget);
print("生命周期:didUpdateWidget");
}
//state对象从树中被移除时调用
@override
void deactivate() {
super.deactivate();
print("生命周期:deactivate");
}
//state对象从树中被永久移除时调用
//通常用来回收和释放资源
@override
void dispose() {
super.dispose();
print("生命周期:dispose");
}
//只有热重载时候会调用
@override
void reassemble() {
super.reassemble();
print("生命周期:reassemble");
}
//依赖对象发生变化时被调用
@override
void didChangeDependencies() {
super.didChangeDependencies();
print("生命周期:didChangeDependencies");
}
}
Obtiene objetos de estado Widget en el árbol, y el llamado Bar en dos formas
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "获取State对象",
home: Scaffold(
appBar: AppBar(
title: Text("获取State对象"),
),
body: GetState(),
),
);
}
}
class GetState extends StatefulWidget {
@override
_GetStateState createState() => _GetStateState();
}
class _GetStateState extends State<GetState> {
@override
Widget build(BuildContext context) {
return Center(
child: Column(
children: <Widget>[
Builder(
builder: (context) {
return RaisedButton(
onPressed: () {
// 查找父级最近的Scaffold对应的ScaffoldState对象
ScaffoldState _scaffoldState =
context.ancestorStateOfType(TypeMatcher<ScaffoldState>());
//调用ScaffoldState的showSnackBar来弹出SnackBar
_scaffoldState.showSnackBar(
SnackBar(
content: Text("我是SnackBar"),
),
);
},
child: Text("点击显示SnackBar"),
);
},
),
Builder(
builder: (context) {
return RaisedButton(
onPressed: () {
// 直接通过of静态方法来获取ScaffoldState
ScaffoldState _scaffoldState =
Scaffold.of(context);
//调用ScaffoldState的showSnackBar来弹出SnackBar
_scaffoldState.showSnackBar(
SnackBar(
content: Text("我是SnackBar"),
),
);
},
child: Text("点击显示SnackBar"),
);
},
),
],
)
);
}
}
Por GlobalKey
la adquisición de State
objetos
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
//定义
static GlobalKey<ScaffoldState> _globalKey = GlobalKey();
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "获取State对象",
home: Scaffold(
key: _globalKey, //设置key
appBar: AppBar(
title: Text("获取State对象"),
),
body: Center(
child: Column(
children: <Widget>[
Builder(
builder: (context) {
return RaisedButton(
onPressed: () {
// 查找父级最近的Scaffold对应的ScaffoldState对象
_globalKey.currentState.openDrawer();
},
child: Text("点击显示SnackBar"),
);
},
),
],
)),
),
);
}
}