Dart 重构异步函数

问题描述 投票:0回答:1

Dart 新手,抱歉。

给定原始函数:

  Future<void> setAppKeyClickEnabled(bool value) async {
    await _sharedPreferences.setBool(_appKeyClickEnabledKey, value);
    notifyListeners();
  }

我想将其重构为:

  Future<void> set(String key, bool value) async {
    await _sharedPreferences.setBool(key, value);
    notifyListeners();
  }

  Future<void> setAppKeyClickEnabled(bool value) async {
    set(_appKeyClickEnabledKey, value);
  }

setAppKeyClickEnabled
的签名现在应该是:

 Future<void> setAppKeyClickEnabled(bool value) async

void setAppKeyClickEnabled(bool value) 

或者换句话说,

async
关键字改变了接口,还是实现细节?

额外问题(这是我第一次看 Dart),有没有办法让

set
私有?

dart async-await
1个回答
0
投票

setAppKeyClickEnabled
的签名现在应该是:

Future<void> setAppKeyClickEnabled(bool value) async

void setAppKeyClickEnabled(bool value) 

如果您想保留原始语义,您的

setAppKeyClickEnabled
实现是不正确的,因为调用者将无法再等待操作完成。

您的选择应该是

await
Future
返回的
set
:

Future<void> setAppKeyClickEnabled(bool value) async {
  await set(_appKeyClickEnabledKey, value);
}

或直接返回

Future

Future<void> setAppKeyClickEnabled(bool value) {
  return set(_appKeyClickEnabledKey, value);
}

(第二个版本也可以使用箭头符号(

=>
)来编写,但我故意使用明确的
return
语句来使与第一个版本的区别更清楚。)

或者换句话说,

async
关键字改变了接口,还是实现细节?

async
是实现细节,而不是接口的一部分。返回
Future
的函数是异步的。
async
关键字仅允许在函数中使用
await
作为关键字,并自动将返回值包装在
Future
中。

© www.soinside.com 2019 - 2024. All rights reserved.