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

Dart中如何定义返回自身类实例的empty()方法

问题根源

两个核心错误导致类型校验不通过:

  • 调用方式不匹配:你写的empty()是类的普通实例方法,必须通过类的实例才能调用,但你在catch块里是直接用类名ProceessedData.empty()调用,这是静态方法/工厂构造函数的调用语法
  • 返回值类型不匹配:createData()方法声明返回Future<ProceessedData>,你之前定义的empty()返回Future<String>,类型完全不符合要求;且就算类型改对,异步方法返回的Future也需要await之后才能作为结果返回。
正确实现

方案1:保留原有的4秒延迟逻辑

把empty()定义为静态异步方法,返回类型指定为Future<ProceessedData>,内部延迟结束后返回类的实例,同时修正catch块的调用,加上await:

import 'dart:io';

class ProceessedData {
  ProceessedData(this.data);

  final String data;

  // 静态异步方法,返回当前类实例包装的Future
  static Future<ProceessedData> empty() {
    return Future.delayed(
      const Duration(seconds: 4),
      () => ProceessedData(HttpException('http://www.google.com.').toString())
    );
  }
}

// 省略原有的_loadFromDisk、_fetchNetworkData方法,仅修正createData的catch块
Future<ProceessedData> createData() async {
  try {
    final id = await _loadFromDisk();
    final data = await _fetchNetworkData('4');
    return ProceessedData(data);
  } on HttpException catch (err) {
    print('Network error: $err');
    // 异步方法必须加await等待结果返回
    return await ProceessedData.empty();
  } finally {
    print('All done!');
  }
}

方案2:去掉不必要的延迟(更推荐)

如果empty()不需要刻意等待4秒,完全可以用工厂构造函数实现同步返回,代码更简洁,也不需要额外加await:

class ProceessedData {
  ProceessedData(this.data);

  final String data;

  // 工厂构造函数,直接返回错误状态的类实例
  factory ProceessedData.empty() {
    return ProceessedData(HttpException('http://www.google.com.').toString());
  }
}

这种写法下catch块不需要修改,直接return ProceessedData.empty();即可正常运行。

额外提示:你的类名ProceessedData存在拼写错误,正确拼写应为ProcessedData,不影响功能但不符合编码规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:27:34