yield 문은 생성기(generator) 함수 안에서만 쓸 수 있어요
yield 문은 생성기(generator) 함수 안에서만 쓸 수 있어요
yield는 값을 하나씩 내놓는 특별한 키워드인데요, 이게 어디서나 쓰일 수 있는 건 아니에요. 생성기 함수 안에서만 쓸 수 있고, 생성기 함수는 async*나 sync* 한정자(modifier)로 표시해요. 만약 그 한정자가 빠진 함수에서 yield 또는 yield*를 쓰면 분석기(analyzer)가 이 진단을 내보내요.
본문
분석기는 yield나 yield* 문이, 본문이 async*나 sync* 한정자로 표시되지 않은 함수 안에 나타날 때 이 진단을 만들어요.
예시
아래 코드는 yield를 한정자가 없는 함수 본문에서 쓰고 있어서 이 진단이 발생해요.
Iterable<int> get digits {
yield* [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
}
아래 코드는 yield*를 async*가 아니라 async 한정자를 가진 함수 본문에서 쓰고 있어서 이 진단이 발생해요.
Stream<int> get digits async {
yield* [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
}
흔한 해결 방법
한정자를 추가하거나, 기존 한정자를 async*나 sync*로 바꿔 주면 돼요.
Iterable<int> get digits sync* {
yield* [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
}
더 알아보기
yield/yield*: Dart 언어 투어 — 생성기(Generators)async*/sync*한정자와 스트림: Dart 언어 투어 — 스트림(Streams)- 관련 진단: yield_of_invalid_type