如何在Dart的const构造函数中断言类型参数不是“动态的”?

时间:2020-06-01 08:07:24

标签: dart

假设我有一个非常基本的结构:

class Foo<T> {
  final T bar;

  const Foo(this.bar);
}

我想强制执行类型特殊化,例如,防止使用Foo(1)创建实例(应改用Foo<int>(1))。

一种方法是在构造函数初始化器列表中使用添加assert语句以确保T != dynamic

class Foo<T> {
  final T bar;

  const Foo(this.bar) : assert(T != dynamic, "Can't create a Foo of dynamic type");
}

不幸的是,它似乎与const构造函数不兼容,因为它会引发错误:Invalid constant valueT都出现dynamic

有没有解决方法,为什么dynamic被认为是非恒定的?

1 个答案:

答案 0 :(得分:2)

  1. 实例化对象后,T被修复。因此,您可以assert在班上其他任何地方。它是可构造的,但无法使用。

  2. 考虑改用strict_raw_types。添加:

    analyzer:
      language:
        strict-raw-types: true
    

    访问您的analysis_options.yaml文件以禁止Foo(1)。 (请注意,仍然可以明确使用Foo<dynamic>(1)。)