Flutter:@required关键字

时间:2019-01-14 12:46:42

标签: dart flutter required

我不太了解@required的工作方式。例如,我看过以下代码:

class Test{
  final String x;
  Test({
    @required this.x
  });

  factory Test.initial(){
    return Test(x: "");
  }

}

但是@required在这里应该做什么?似乎使可选参数成为非可选参数。

5 个答案:

答案 0 :(得分:10)

默认情况下需要的参数

默认情况下,需要类构造函数或函数的参数。

class Test {
  final String x;
  Test(this.x);
}

您不允许这样做:

final value = Test(); 
// 1 positional argument(s) expected, but 0 found.

您必须执行以下操作:

final value = Test('hello');

可选的命名参数

但是,如果用大括号将参数括起来,则除了成为命名参数之外,它也变为可选参数。

class Test {
  final String x;
  Test({this.x});
}

没关系:

final value = Test(); 

这是

final value = Test(x: 'hello'); 

对于前者,value.xnull

必需的命名参数

有时开发人员不想允许参数为null,因此他们向其中添加了@required注释。

class Test {
  final String x;
  Test({@required this.x});
}

这不再可行:

final value = Test(); 
// The parameter 'x' is required.

这只是一个警告,但它提醒人们需要添加缺少的参数。

创建自己所需的参数

如果您正在使用Flutter,则已经可以访问@required批注,并且可以在编写自己的类和函数时使用它。

如果您正在Dart中处理非Flutter项目,则需要从Dart团队导入meta程序包。

pubspec.yaml

dependencies:
  meta: ^1.2.2

飞镖代码

import 'package:meta/meta.dart';

class Test {
  final String x;
  Test({@required this.x});
}

更新

从2020年11月开始,Flutter / Dart beta通道中的安全性为null,其中包括required关键字,该关键字替换了@required注释。这将很快进入稳定的渠道。

答案 1 :(得分:2)

如果您具有多个命名参数,并且您希望某些参数是强制性的,则可以使用

@required,并使用@required对其进行注释。

示例

class Test {
  final String a; // say a is mandatory
  final String b;
  final String c;
  final String d;

  Test({
    @required this.a, // annotate it using required
    this.b,
    this.c,
    this.d,
  });
}

答案 2 :(得分:1)

@required是一个注释,它将为您创建一个警告,以提醒您记住命名参数对于类按预期工作是必需的。 至少就我所知,它不会产生编译错误。

答案 3 :(得分:1)

@required限制您在创建Class对象时传递@required标记的参数。例如,在显示对话框时,您将根据需要标记上下文,因为没有有效的上下文就无法显示对话框。但是,您不应过度使用它。

答案 4 :(得分:0)

简短回答:默认情况下,Dart 中的命名参数是可选的。我们更喜欢它们而不是位置参数以方便使用。在这种情况下,从初始化本身开始,命名参数也可能始终保持某些值(不可为空)。因此,加倍努力。

如果值是编译时常量,他可以使用参数的默认值初始化而不是“必需”,而这里似乎不是这种情况。

位置参数可以是必需的,也可以是可选的,我们在调用时按顺序传递。以下是所需位置参数的使用示例:

class Object{
  String name;
  int value;
  
  Object(this.name, this.value=100); //auto type inference
}

final one = Object("Name here", 50); // All parameters are needed to call.

命名参数是另一种类型的可选参数。 Flutter API 使用命名参数,在我们的 UI 代码中,首选使用命名参数而不是位置参数。原因是阅读代码或稍后在代码的几个部分调用构造函数时的可读性和清晰度。您会看到所有小部件、样式都是这种情况。因为如果它是位置性的,那么在使用大量使用的方法时很难跟踪它们,而且动态类型推断也可能起作用。

void display({required String name, int value1, int value2=100}) {...;} //named params

display(value1: 50, name: "Calculated name");

注意: 如果存在,则必须首先出现所需的位置参数。 命名或可选的位置参数都可以跟在后面(不是两个)。

String say(String from, String msg, [String? device]) { //req. pos params and opt pos params.
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}

assert(say('Bob', 'Howdy') == 'Bob says Howdy');