제너레이터 함수에서는 값을 반환할 수 없어요

제너레이터 함수에서는 값을 반환할 수 없어요

return_in_generator 진단은 async*sync*로 만든 제너레이터(generator) 함수가 return으로 값을 돌려주려 할 때 알려주는 경고예요. 제너레이터에서는 값을 내보낼 때 yield를 써야 해요.

출처: Can't return a value from a generator function that uses the 'async*' or 'sync*' modifier

본문

Dart 분석기는 본문이 async* 또는 sync*로 표시된 제너레이터 함수가 두 가지 방식 중 하나로 값을 반환하려 할 때 이 진단을 만들어요.

  • return 문을 써서 값을 반환하는 경우
  • => 를 써서 값을 암시적으로 반환하는 경우

이런 경우에는 return 대신 yield를 사용해야 해요.

예시

아래 코드는 메서드 f가 제너레이터인데 return으로 값을 반환하려 해서 이 진단이 발생해요.

Iterable<int> f() sync* {
  return 3;
}

아래 코드는 함수 f가 제너레이터인데 값을 암시적으로 반환해서 이 진단이 발생해요.

Stream<int> f() async* => 3;

흔한 해결 방법

함수 본문에 =>를 쓰고 있다면, 블록 함수 본문으로 바꾸고 yield로 값을 내보내면 돼요.

Stream<int> f() async* {
  yield 3;
}

메서드가 제너레이터가 되길 원하는 거라면, yield로 값을 내보내면 돼요.

Iterable<int> f() sync* {
  yield 3;
}

메서드가 제너레이터가 되길 원하지 않는다면, 본문에서 제너레이터 수식어를 제거하면 돼요. Future를 반환하는 경우에는 async를 쓰면 되고요.

int f() {
  return 3;
}

더 알아보기