flutter - 构造函数

构造函数

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));

参考资料

硅谷大佬-王叔不秃

------ 如果文章对你有用,感谢右上角 >>>点赞 | 收藏 <<<

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值