版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_31057219/article/details/90214576
参考:
构造方法的三种表示形式:
import 'package:flutter/material.dart';
class MyState extends State {
@override
Widget build(BuildContext context) {
// return MyData1("data1");
// return MyData2(dataStr: "data2");
return MyData3(dataStr: "data3");
}
}
//------------------------------------------------
class MyData1 extends StatelessWidget {
var dataStr;
MyData1(this.dataStr);
@override
Widget build(BuildContext context) {
return Text(dataStr);
}
}
class MyData2 extends StatelessWidget {
var dataStr;
//super(key: key) :第一个key为父类的key,第二个key为自己的key
MyData2({Key key, this.dataStr}) : super(key: key);
@override
Widget build(BuildContext context) {
return Text(dataStr);
}
}
class MyData3 extends StatelessWidget {
var dataStr;
MyData3({Key key, this.dataStr}) : super(key: new ObjectKey(dataStr));
@override
Widget build(BuildContext context) {
return Text(dataStr);
}
}
当使用Stateless Widget时,我们并不需要使用key,
当使用Stateful Widget时,集合内有数据移动和改变并且需要展示到界面时才需要key。
当组件在组件树中移动时使用Key可以保持组件之前的状态,比如在用户滑动时或者集合改变时。
Key
[Key]是[Widget],[Element]和[SemanticsNode]的标识符。
如果新窗口小部件的键与与该元素关联的当前窗口小部件的键相同,
则新窗口小部件将仅用于更新现有元素。
在具有相同父级的[Element]中,键必须是唯一的。
[Key]的子类应该是[LocalKey]或[GlobalKey]的子类。
abstract class Key {}
LocalKey
不是[GlobalKey]的密钥。
在具有相同父级的[Element]中,键必须是唯一的。
相比之下,[GlobalKey]在整个应用程序中必须是唯一的。
abstract class LocalKey extends Key {}
ValueKey
使用特定类型的值来标识自身的密钥。
[ValueKey ]等于另一个[ValueKey ],如果且仅当它们的值为[operator ==]时。
可以对此类进行子类化以创建值键,这些键值将不等于碰巧使用相同值的其他值键。
如果子类是私有的,则会导致值键类型不能与来自其他源的键冲突,这可能很有用,
例如,如果将键用作与另一个窗口小部件提供的键在同一范围内的回退。
class ValueKey<T> extends LocalKey {
}
ObjectKey:
从用作其值的对象获取其标识的键。
用于将窗口小部件的标识绑定到用于生成该窗口小部件的对象的标识。
class ObjectKey extends LocalKey {
}