dart - 如何在初始化列表 dart lang 中运行自定义函数?

标签 dart

我研究 dart 语言,我想为带有值验证的 Uuid 编写一个值对象模型。

import 'package:uuid/uuid.dart' as uuidLibrary;

class Uuid {
  String value;
  Uuid (String value) : uuidLibrary.Uuid.isValidOrThrow(fromString: uuid), this.value = value;
}

但是我的静态代码分析器告诉我初始化程序列表是错误的:uuidLibrary.Uuid.isValidOrThrow(fromString: uuid)

静态方法isValidOrThrow已经实现了我需要的所有检查,我想在赋值之前进行此检查;

继续使用 isValidOrThrow 和 null 安全性,我该如何做到这一点?

最佳答案

初始化列表并不真正意味着执行任意代码。通常正确的做法是在构造函数主体中调用验证函数。这样做会在初始化成员(并执行所有基类构造函数)之后执行它,但是:

  • 初始化成员通常不会产生副作用,因此顺序并不重要。
  • 无效参数引发的异常通常是逻辑错误,无论如何都会导致程序崩溃。

但是,如果由于某种原因您确实必须在初始化成员之前调用验证函数,那么您可以作弊。由于初始值设定项列表可以包含 assert,因此您可以添加一个 assert 来执行您想要的任何函数:

bool myValidationFunction(int x) {
  return x >= 0;
}

class Foo {
  int x;

  Foo(int x)
    : assert(myValidationFunction(x)),
      x = x;
}

或者,如果您希望验证函数抛出异常而不是返回 bool:

void throwIfInvalid(int x) {
  if (x < 0) {
    throw ArgumentError('Invalid value: $x');
  }
}

class Foo {
  int x;

  Foo(int x)
    : assert(() { throwIfInvalid(x); return true; }),
      x = x;
}

当然,assert可能未启用。如果您希望无条件地调用验证函数,您可以在初始化现有成员的过程中调用一个函数:

int checkIfValid(int x) {
  if (x < 0) {
    throw ArgumentError('Invalid value: $x');
  }
  return x;
}

class Foo {
  int x;
  
  Foo(int x)
    : x = checkIfValid(x);
}

关于dart - 如何在初始化列表 dart lang 中运行自定义函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68912626/

相关文章:

dart - 如何在 Flutter 中更改状态栏颜色?

image - 如何在Dart三元运算符中检查空控件值以显示默认图像(如果为空)?

firebase - Flutter/Firebase getter 'length'在null上被调用

dart - 父级分离回调中的children.clear期间的附加回调

flutter - 添加新元素以循环映射

Flutter:不推荐使用列表?

flutter - 为什么不能在嵌套函数内设置动态属性?

unit-testing - 如何测试 DART 的 runApp() 函数

firebase - 如何从嵌套子集合中监听更改(或获取流)?

flutter - Flutter:从SliverGrid删除多余的空间