dart2 (flutter)에서 async 함수가 Future를 반환한다는 곳의 사양 확인 메모




It is a compile-time error if the declared return type of a function marked async is not a supertype of Future for some type T.

It is a compile-time error if the declared return type of a function marked sync* is not a supertype of Iterable for some type T.

It is a compile-time error if the declared return type of a function marked async* is not a supertype of Stream for some type T.

async로 표시된 함수의 선언된 리턴 값 유형이 특정 유형 T에 대한 Future 수퍼타입이 아닌 경우 컴파일 시간 오류가 발생합니다.

sync*로 표시된 함수의 선언된 반환 값 유형이 특정 유형 T에 대해 반복 가능한 수퍼타입이 아닌 경우 컴파일 시간 오류가 발생합니다.

async*로 표시된 함수의 선언된 리턴 값의 유형이 일부 유형 T에 대해 Stream의 수퍼타입이 아닌 경우 컴파일 시간 오류가 발생합니다.

컴파일 에러가 되기 때문에 그런 일로.
void main() async {
  final ft1 = timeAfter1();
  print("ft1=$ft1");
  ft1.then((t1) {
    print("t1=$t1");
  });

  final ft2 = timeAfter2a();
  print("ft2=$ft2");
  ft2.then((t2) {
    print("t2=$t2");
  });

  final fft3 = timeAfter3b();
  print("fft3=$fft3");
  fft3.then((ft) {
    print("ft=$ft");
    ft.then((t) {
      print("t=$t");
    });
  });
}

Future<String> timeAfter1() {
  Future<String> ft = Future.delayed(Duration(seconds: 1), () {
    return DateTime.now().toIso8601String();
  });
  return ft;
}

Future<String> timeAfter2a() async {
  String t = DateTime.now().toIso8601String();
  return t; // 返り値の型はFuture<String>だけどreturnしている型はString。自動でFuture<T>にラップされる。
}

/*
Future<String> timeAfter2b() {
  String t = DateTime.now().toIso8601String();
  return t; // asyncつけないともちろんだめ
}
*/

/*
Future<Future<String>> timeAfter3a() async {
  Future<String> ft = Future.delayed(Duration(seconds: 1), () {
    return DateTime.now().toIso8601String();
  });

  return ft; // Future<String> -> Future<Future<String>> のようにラップされることはない。
}
*/

Future<Future<String>> timeAfter3b() async {
  Future<Future<String>> fft = Future.delayed(Duration(seconds: 1), () {
    Future<String> ft = Future.delayed(Duration(seconds: 1), () {
      return DateTime.now().toIso8601String();
    });
    return ft;
  });

  return fft;
}
% dart dart_async.dart
ft1=Instance of 'Future<String>'
ft2=Instance of 'Future<String>'
fft3=Instance of 'Future<Future<String>>'
t2=2020-12-17T09:03:22.237512
t1=2020-12-17T09:03:23.243016
ft=Instance of 'Future<String>'
t=2020-12-17T09:03:24.256934

좋은 웹페이지 즐겨찾기