본문 바로가기

Languages/Dart & Flutter

Comleter를 잘 못 사용한 오류

상황

1. API 통신을 하여 위치(Location)에 해당하는 블루투스 기기의 mac address를 받아온다.

2. 기기로 주변의 블루투스 스캔를 스캔하여 "유도기"를 찾는다.

3. 찾은 "유도기"와 api 호출의 "mac address" 값이 일치하지 않아 음성이 출력되지 않는다.

4. 1과2를 동일하게 거쳐 3번이 성공하게 된다면 이미 실패했다고 생각한 음성들이 한 번에 모두 출력된다.

 


원인 파악

1번
2번

1번에서 2번의 함수를 호출한다.

2번 함수는 파라미터로 들어온 값과 블루투스에 스캔한 값이 동일하다면 connect 함수를 호출하는 함수이다.

그런데 일치하는 블루투스가 없기 때문에 connect 함수가 불리지 않아서 발생하는 문제이다.

connect 함수 안에는 1번 함수의 future를 complete 시켜주는 코드가 있는데 그 코드가 동작하지 않으니 await에 잡혀있게 되는 것이다.

 

그러다가 블루투스값이 일치하는 경우 connect 함수가 불리면서 이전에 await에 잡혀있던 로직이 돌아가면서 "성공했다"라는 음성이 출력되는 문제였다.


해결방법

위 문제를 해결하는 방법은 간단하였다.

 

2번 수정

2번의 코드를 수정한 것이다.

connect 안쪽에 숨겨져 있던 retryCompleter를 위쪽으로 뽑아주고 connect를 실패했을 때 completer에 error를 실어서 completer를 완료시켜주면 해결된다.