flutter dart构造函数中的SummerizeAssert

epfja78i  于 2023-05-19  发布在  Flutter
关注(0)|答案(2)|浏览(157)

我在同一个类中有多个构造函数,它们有许多Assert函数,这些函数对所有构造函数都是一样的。例如,一个类Foo有两个构造函数:

Foo({...some params}):assert(conditionA),assert(conditionB),assert(conditionC);
Foo.fromForm({...some params}):assert(conditionA),assert(conditionB),assert(conditionC);

有没有什么方法可以将assert分组并共享给两个构造函数?

ulmd4ohb

ulmd4ohb1#

您可以通过使命名构造函数调用未命名构造函数来共享Assert。
假设我定义了我的类Foo如下:

class Foo {
  final int? paramA;
  final bool? paramB;

  Foo({
    this.paramA,
    this.paramB,
  })  : assert(
          (paramA == null && paramB != null) ||
              (paramA != null && paramB == null),
          'You cannot use both paramA and paramB',
        ),
        assert(
          paramA == null || paramA > 0,
          'When specified paramA must be superior to 0',
        );
}

在执行以下操作时,我可能会出现Assert错误:

Foo(paramA: -1); // Assertion failed: "When specified paramA must be superior to 0"

Foo(paramA: 1, paramB: false); // Assertion failed: "You cannot use both paramA and paramB"

现在,如果我声明我的二级构造函数如下:

class Foo {
  // ...
  
  Foo.fromForm(int param) : this(paramA: param);
}

当使用this()时,我定义了我的Foo.fromForm构造函数将调用我的基未命名的Foo构造函数,并将受益于它的assert
这也可以通过使用抽象类来实现:

abstract class BaseFoo {
  BaseFoo({
    required int? paramA,
    required bool? paramB,
  }) : assert(
          (paramA == null && paramB != null) ||
              (paramA != null && paramB == null),
          'You cannot use both paramA and paramB',
        ),
        assert(
          paramA == null || paramA > 0,
          'When specified paramA must be superior to 0',
        );
}

class Foo extends BaseFoo {
  final int? paramA;
  final bool? paramB;

  Foo({
    this.paramA,
    this.paramB,
  }) : super(paramA: paramA, paramB: paramB);

  // You can also call this()
  Foo.fromForm(int param)
      : paramA = param,
        paramB = null,
        super(paramA: param, paramB: null);
}
disbfnqx

disbfnqx2#

你可以用两种方法来成功;
1-你可以在构造函数中调用assert,如;

class Name{
  Name(){
    assert(condition, "Text");
  }
}

2-可以使用super关键字;

class Name {
  Name(): 
    assert(condition, "Text"),
    super() {}
}

相关问题