我有时会看到类似的东西:
widget.title
或 widget.(anything)
颤动;就像 AppBar
Widget 的 Text widget child中的示例一样:
class MyApp extends StatefulWidget{
// some declarations here
@override
_MyApp createState() => _MyApp();
}
class _MyApp extends State<MyApp>{
// some declaration here
@override
Widget build(BuildContext context){
return MaterialApp(
home: Scaffold(
appBar: AppBar(child: Text(widget.title),),
),
);
}
}
这实际上是什么?
widget.title
widget
引用是什么?它是什么?
MyApp
类扩展了StatefulWidget,这意味着该小部件存储可变状态。当 MyApp 小部件首次插入树中时,框架调用
createState()
函数来创建
_MyAppState
的新实例,以与树中的该位置关联。 (请注意,State 的子类通常以前导下划线命名,以表明它们是私有实现细节。)当此小部件的父级重建时,父级会创建
MyApp
的新实例,但框架会重用该
_MyAppState
实例,即已经在树中了,而不是再次调用 createState。要访问当前
MyApp
的属性,
_MyAppState
可以使用其
widget property
。如果父级重建并创建新的
MyApp
,则
_MyAppState
将使用新的小部件值进行重建。如果您希望在小部件属性更改时收到通知,请覆盖
didUpdateWidget()
函数,该函数作为 oldWidget 传递,以便您将旧小部件与当前小部件进行比较。现在按照文档:
小部件属性
该属性在调用之前由框架初始化 初始化状态。如果父级将树中的此位置更新为新的 具有与当前相同的runtimeType和Widget.key的小部件 配置时,框架将更新此属性以引用 新的小部件,然后调用 didUpdateWidget,传递旧的 配置作为参数。
abstract class State<T extends StatefulWidget> with Diagnosticable {
get widget => _widget!;
T? _widget;
}
在此上下文中,T表示 State 类的类型参数,它是您的自定义小部件类。因此,状态类中的小部件属性是自定义小部件类的实例。
让我们考虑 BiggerText 小部件的示例:
class BiggerText extends StatefulWidget {
final String text;
const BiggerText({Key? key, required this.text}) : super(key: key);
@override
State<BiggerText> createState() => _BiggerTextState();
}
class _BiggerTextState extends State<BiggerText> {
double _textSize = 16.0;
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(**widget.text**, style: TextStyle(fontSize: _textSize)),
],
);
}
}
基于上面的例子
State<BiggerText> createState() => _BiggerTextState();
将返回 _BiggerTextState 类的实例
其中实例使用 BiggerText 类作为类型参数扩展了 State 类当你再次看到State类时
abstract class State<**T** extends StatefulWidget> with Diagnosticable {
get widget => _widget!;
Q? _*widget*;
}
T(State类的类型参数)代表BiggerText类。因此,widget是BiggerText类的对象或实例,允许_BiggerTextState通过状态类中的widget属性访问BiggerText小部件的属性,状态类是BiggerText类本身的实例。