Dart异步函数重构疑问:async是否影响接口及私有方法设置
Dart重构相关问题解答
一、重构后setAppKeyClickEnabled的返回值签名
必须用Future<void>作为返回类型,不能用void。
原函数是异步函数,重构后它内部调用的通用set方法必然也是异步逻辑(否则原函数没必要设计成异步)。如果返回void,调用者无法通过await等待操作完成,会导致异步逻辑还没执行完毕就继续走后续代码,极易引发bug。
至于async,它属于实现细节,并非对外接口的一部分。函数的返回类型(Future<void>)才是对外的契约,决定了调用者如何使用这个方法。举两种合法写法:
- 不用
async,直接返回Future:
Future<void> setAppKeyClickEnabled(bool enabled) { return _genericSetMethod('appKeyClick', enabled); }
- 用
async+await简化异步逻辑:
Future<void> setAppKeyClickEnabled(bool enabled) async { await _genericSetMethod('appKeyClick', enabled); }
两种写法对外的签名一致,调用者都需要用await等待完成。async只是Dart的语法糖,帮你自动处理Future的包装,不需要暴露给调用者。
二、如何让通用set方法变为私有
Dart里实现方法私有非常简单:给方法名前缀加下划线_即可。比如把通用set方法命名为_genericSetMethod,这样它就只能在当前库(同一个.dart文件或同一个package的库内部)被访问,外部代码无法调用该方法。
内容的提问来源于stack exchange,提问作者tpdi
相关产品推荐
相关产品推荐

