본문 바로가기
개발/flutter

호출 메소드와 응답 콜백이 분리돼 있을 때 호출 메소드를 통해 결과를 받는 방법

by hyperhand 2023. 9. 20.

Dart로 소켓 통신을 구현하는 과정에서 데이터를 전송하는 메소드를 통해 응답을 받고 싶지만 소켓 인스턴스가 별도의 콜백으로 응답을 주는 터라 그럴 수가 없었다. 방법이 있지 않을까 해서 찾아보니 Completer를 이용해서 가능했다.

 

 

 

 

class MyClass {
  Socket? socket;
  final Completer _completer = Completer();

  Future<void> connect(Sring host, int port) async {
    socket = await Socket.connect(host, port);
    socket?.listen(
      (data) {
        _completer.complete(data);	// 응답을 기다리고 있는 호출자에게 응답 데이터 전달
      },
      onError: (error) {
        _complete.completeError(error);
      }
    );
  }

  Future<dynamic> sendData(List<int> data) {
    socket?.add(data);	// 데이터 전송
    return _completer.future;	// 응답을 기다리도록 함
  }
}
int main() {
  test();
}

void test() async {
  MyClass myClass = MyClass();
  final result = await myClass.sendData([1,2,3,4,5]);
}

 

 

 

 

 

Completer를 몰랐던 기존에는 지저분하게 코드를 작성했었는데 이렇게 하니 깔끔하게 작성된다. 특히 데이터를 보낼 때 인자로 넘겼던 데이터를 응답받을 때에도 사용해야 하는 경우에는 이런 패턴이 굉장히 유용할 것 같다. 다른 언어들에서도 동일한 패턴으로 작성이 가능할 듯 하다.

반응형