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
相关产品推荐
相关产品推荐

