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

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被认为是非恒定的?

最佳答案

  • 实例化对象后,T是固定的。因此,您可以在类中的其他位置添加assert。它是可构造的,但无法使用。
  • 考虑改为使用 strict_raw_types 。加:

    analyzer:
      language:
        strict-raw-types: true
    

    到您的analysis_options.yaml文件,以禁止Foo(1)。 (请注意,仍然允许显式使用Foo<dynamic>(1)。)
  • 关于dart - 如何在Dart的const构造函数中断言类型参数不是 “dynamic”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62127976/

    10-15 07:05