无法在Dart中了解此构造函数语法

时间:2019-08-04 07:19:13

标签: flutter dart

我正在从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,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

2 个答案:

答案 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等。