构造函数
flutter官方给的示例代码,没有对构造函数进行语法解释,记录一下详解。
class MyWidget extends StatefulWidget {
final String userName;
MyWidget({Key key, this.userName}) : super(key: key);
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
}
key
key 表示 widget 的标识符
. flutter 会为每一个 widget 自动指定 key 值,一旦对 不同的 widget 指定了相同的’key’属性, 那么在 widget 被渲染为 element 时就会被复用.
# 调用自己得构造函数
MyWidget();
# 调用父类构造函数,并传一个参数key。(将当前widget得默认的key值传给父类得key属性值).
super(key:key)
关于构造函数中这个大括号的意思解释:
- 1.调用自己得构造函数,并声明可选参数
- 2.通过大括号{}来申明可选参数,如果去掉大括号,就表示必选参数
- 3.调用 MyWidget 时,如果是可选参数,
示例:MyWidget 定义可选参数,RaisedButton 调用
// 申明一个可选参数 userName
class MyWidget extends StatefulWidget {
final String userName;
MyWidget({this.userName}) : super();
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
}
// 调用可选参数类:
RaisedButton(
child: Text('raiseButton'),
onPressed: () {
String str = "Ifredom";
Navigator.push(context, MaterialPageRoute(
builder: (BuildContext context) {
return new MyWidget(userName: str); // 注意写法
},
));
},
),
// 申明一个必选参数: userName
class MyWidget extends StatefulWidget {
final String userName;
MyWidget(this.userName) : super(); // 注意此处去掉了大括号
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
}
// 调用可选参数类:
RaisedButton(
child: Text('raiseButton'),
onPressed: () {
String str = "Ifredom";
Navigator.push(context, MaterialPageRoute(
builder: (BuildContext context) {
return new MyWidget(str); // 注意写法,因为参数是必选,所以可以直接根据参数位置推断,写法上就省略了username,
},
));
},
),
思考题:关于传参,如果想要传一个必选参数,和一个可选参数,应该如何写呢?
关于冒号:
的含义
冒号的作用就是初始化。 在执行构造函数体之前,初始化实例变量.
class MyWidget extends StatefulWidget {
// final String userName;
final String userName;
MyWidget() : userName = 'ifredom’s name!';
_MyWidgetState createState() => _MyWidgetState();
}
所以示例中的代码,我们使用的一个变种写法,调用 super()这个内置方法,去对父类进行初始化.
下面的示例中,MyWidget 继承自 StatefulWidget,而父类 StatefulWidget 构造函数中有一个属性叫做 key,没有属性叫做 userName.
class MyWidget extends StatefulWidget {
// final String userName;
final String userName;
MyWidget() : super(userName : 'ifredom’s name!'); // 此句代码错误,对比使用
// MyWidget() : super(key: key); // 此句正确
_MyWidgetState createState() => _MyWidgetState();
}
关于key
的使用场景
-
当使用 Stateless Widget 时,我们并不需要使用 key,
-
当使用 Stateful Widget 时,widget 内有数据移动和改变并且需要显示到界面时才需要 key,否则可以不写。
-
在具有相同父级的[Element]中,键必须是唯一的。[Key]的子类应该是[LocalKey]或[GlobalKey]的子类。
# Key表示类型,key表示为当前widget的标识符,是flutter自动送给你的值,所以不用像 userName 一样去声明一下.
> MyWidget({Key key, this.userName})
# 此语法表示 :在构造函数体执行之前进行变量的初始化,变量使用逗号分隔,该过程叫初始化列表
# 第一个`key`为父类定义的一个属性名,类似于userName(不可更改,默认名为key),第二个`key`为自己的`key`,由flutter隐式创造
> :super(key: key)
# 生成额外得key的方法
> : super(key: new ObjectKey(userName));
参考资料
------ 如果文章对你有用,感谢右上角 >>>点赞 | 收藏 <<<