You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中const创建Timing静态常量报错,求优雅分组方案

问题原因

你定义p1时触发的错误,根源是Timing.fromDuration的断言约束:要求lower > Duration.zero,但你传入的lower是Duration(milliseconds: 0),等于零,直接触发断言失败,导致常量表达式初始化抛出异常。

优雅解决方案(避免零散变量)

我们可以在Communicator类内用常量分组定义的方式,把p1对应的上下限Duration先定义为类内的static const成员,再组合成Timing,同时满足Timing的断言要求:

final class Timing {
  final Duration lower;
  final Duration upper;

  const Timing.fromDuration(this.lower, this.upper)
      : assert(lower > Duration.zero),
        assert(upper > Duration.zero),
        assert(lower < upper);
}

class Communicator {
  // 分组定义p1对应的上下限常量,避免零散变量
  static const _p1Lower = Duration(milliseconds: 1);
  static const _p1Upper = Duration(milliseconds: 20);

  // 用分组的常量初始化Timing,满足断言约束
  static const Timing p1 = Timing.fromDuration(_p1Lower, _p1Upper);

  void sendMessage(String message, {Duration timeout = _p1Lower});
}

如果业务上允许lower等于Duration.zero,也可以调整Timing的断言逻辑,把lower > Duration.zero改为lower >= Duration.zero,这样原有的0值就合法了,同时保持分组定义:

final class Timing {
  final Duration lower;
  final Duration upper;

  const Timing.fromDuration(this.lower, this.upper)
      : assert(lower >= Duration.zero), // 放宽断言允许等于零
        assert(upper > Duration.zero),
        assert(lower < upper);
}

class Communicator {
  static const _p1Lower = Duration(milliseconds: 0);
  static const _p1Upper = Duration(milliseconds: 20);

  static const Timing p1 = Timing.fromDuration(_p1Lower, _p1Upper);

  void sendMessage(String message, {Duration timeout = _p1Lower});
}
额外优化:给Timing添加便捷构造(可选)

如果需要更简洁的初始化方式,可以给Timing添加一个接收毫秒数的命名构造,进一步简化分组代码:

final class Timing {
  final Duration lower;
  final Duration upper;

  const Timing.fromDuration(this.lower, this.upper)
      : assert(lower > Duration.zero),
        assert(upper > Duration.zero),
        assert(lower < upper);

  // 新增便捷构造,直接接收毫秒数
  const Timing.fromMillis(int lowerMillis, int upperMillis)
      : this.fromDuration(
          Duration(milliseconds: lowerMillis),
          Duration(milliseconds: upperMillis),
        );
}

class Communicator {
  static const Timing p1 = Timing.fromMillis(1, 20);

  void sendMessage(String message, {Duration timeout = const Duration(milliseconds: 1)});
}

这种方式既保持了常量的合法性,又避免了零散的单个值变量,把相关的时间范围逻辑集中在一起。

内容的提问来源于stack exchange,提问作者bobaxix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 07:35:40