我正在从Udacity上学习Flutter的课程。 对于某些任务,我正在学习如何创建小部件。 来自C ++ / Python,我根本无法理解此类的构造函数语法。
因此,我的main.dart在Center Widget内包含一个Category Widget(我正在构建的Widget)。我要从main.dart文件传递3个参数,但我不明白
const Category({...}):...;
部分正在做。
这是我的category.dart的样子:
import 'package:flutter/material.dart';
class Category extends StatelessWidget {
final String name;
final ColorSwatch color;
final IconData iconLocation;
const Category({
Key key,
@required this.name,
@required this.color,
@required this.iconLocation,
}) : assert(name != null),
assert(color != null),
assert(iconLocation != null),
super(key: key);
@override
Widget build(BuildContext context) {
return Container(
height: 100.0,
padding: EdgeInsets.all(8.0),
child: InkWell(
borderRadius: BorderRadius.circular(25.0),
splashColor: color,
onTap: () {
print('i am cool');
},
child: Row(
children: <Widget>[
Padding(
padding: EdgeInsets.all(16.0),
child: Icon(
iconLocation,
size: 60.0,
),
),
Text(
'Length',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 24.0,
),
),
],
),
),
);
}
}
答案 0 :(得分:1)
在C ++,Python或Java中没有几种Dart特定的语言功能。您可以在Dart documentation中详细了解所有这些内容。
在Python中,每个参数都可以命名。在Dart中,只有用大括号括起来的参数可以在构造函数调用中通过名称来引用。因此,在参数周围加上大括号可以使我们在调用方方面看起来很漂亮:
Category(
something: ...
somethingElse: ...
)
初始化器列表位于构造函数签名和主体之间。 它在身体之前运行。在这里,您可以初始化实例变量,声明事物并调用super。
您可能会问,为什么我们不能仅在构造函数主体中执行这些操作? 看看下一个功能:
如果构造函数满足几个要求(例如,它没有构造函数主体且该类仅具有final字段),则可以将其标记为常量。这些附加要求允许将对构造函数的调用标记为const
,从而使构造函数在编译时而不是在运行时运行。
如果您经常重复使用特定实例(例如EdgeInsets.all(16)
),则所有实例将共享相同的内存位置。因此,标有const
的构造函数允许在编译时将类直接嵌入到结果程序的内存中。
答案 1 :(得分:0)
我从未编码过飞镖。 但这看起来与Java构造函数非常相似。
observer: [[12.4097 54.8388 8.570500000000001 12.977599999999999] [79.53490000000001 184.9396 45.81 41.13] [66.716624 5.586496 56.914624 -58.9] [66.83239999999999 28.129599999999996 122.56060899999999 -90.190609]]
构造函数通常用于初始化类属性(除其他外)。这需要三个参数,我假设dart自动将具有匹配名称的构造函数参数分配给相应的类属性。它还具有一些验证规则,例如名称!= null等。