[Flutter/Decoding Flutter] Tear-offs

작성 날짜:

최근 업데이트 날짜:

Decoding Flutter 유튜브 영상


이번 Decoding Flutter의 주제는 Tear-off이다.

지금까지 Decoding Flutter 시리즈들은 전부 제목을 보면 어떤 내용일지 예상이 갔다. 하지만 이번 영상은 무슨 내용인지 전혀 예상이 되질 않았다.

Tear-off란?

Tear-off가 무엇일까?

아래와 같은 코드를 작성했다고 가정해보자.

onTap: () {
  myHandler();
},

만약, Linter를 사용 중이며 unnecessary_lambdas 룰을 설정했다면 위 코드에서는 다음과 같은 메시지가 보일 것이다.

DON'T create a lambda when a tear-off will do.

해석해보면, Tear-off가 가능할 때 Lambda를 사용하지 말라는 뜻이다. 여기서 Lambda는 (){}를 의미한다.

Lambda를 사용하지 않고 Tear-off로 변경하면 코드는 다음과 같아진다.

onTap: myHandler,

이렇게 onTap 파라미터에 함수를 직접 반환하는 것이 Tear-off이다. 이렇게 Tear-off를 사용하면 불필요한 코드를 없앨 수 있다.

Tear-off의 기존 한계

Tear-off에는 한계가 있다. 이에 대해 알아보자.

아래는 .fromJson 이라는 factory 생성자를 갖는 MyClass 클래스이다.

class MyClass {
  factory MyClass.fromJson(
    Map<String, dynamic> json,
  ) =>
    MyClass(...);
}

그리고 이 MyClass 클래스의 빌더를 받는 StateManager 클래스도 있다고 해보자.

class StateManager {
  const StateManager(this.builder);

  final MyClass Function(Map<String, dynamic>) builder;
}

그렇다면 StateManager 클래스 인스턴스를 생성할 때 다음과 같은 코드를 사용하면 어떻게 될까?

StateManager(MyClass.fromJson);

아쉽게도 이 코드는 작동하지 않는다. 따라서 다음과 같이 작성해야한다.

StateManager(
  (Map<String, dynamic> json) =>
    MyClass.fromJson(json),
)

여기서 우리는 생성자는 Tear-off로 사용할 수 없는 메소드라는 것을 알 수 있다.

Tear-off의 한계 해결!

다행히 Dart 2.15부터 이 문제가 해결되었다고 한다. 생성자도 Tear-off로 사용할 수 있게 되었다.

이제 다음과 같이 사용해도 정상적으로 작동할 것이다.

StateManager(MyClass.fromJson);

댓글남기기