[Flutter] Getx 컨트롤러를 활용한 코인데이터 빌드
2024. 4. 7. 19:43ㆍ프로그래밍(Frontend)/Flutter
플러터에서 Getx는 많이 사용되는 상태관리 라이브러리이다.
거래소 api를 이용하여 거래소를 구현하기 위해서 수많은 데이터의 관리가 필요하기 떄문에 Getx를 사용하였다.
Dependency
web_socket_channel: ^2.4.0
get: ^4.6.6
http: ^1.1.2
선언부
late IOWebSocketChannel channel =
IOWebSocketChannel.connect(Uri.parse("wss://api.upbit.com/websocket/v1"));
RxList<CoinPrice> btcMarket = <CoinPrice>[].obs;
RxList<CoinPrice> usdtMarket = <CoinPrice>[].obs;
코인데이터들을 WebSocketChannel에 스트림하는 코드이다.
var response =
List<CoinList> coinList = coinListFromJson(response.body);
coins.value =
coinList.map((coin) => "\"${coin.market.toString()}\"").join(",");
마켓의 코인 리스트정보를 불러와 CoinList에 저장한다.
channel.sink.add(
"[{\"ticket\": \"test example\"},{\"type\": \"ticker\",\"codes\": [$coins]},{\"format\": \"DEFAULT\"}]");
channel.stream.listen((message) {
if (!_isPaused) {
Map<String, dynamic> jsonData = json.decode(
"{\"korean_name\":\"koreanName\",\"english_name\":\"englishName\",${String.fromCharCodes(message).substring(1)}");
CoinPrice coinPrice = CoinPrice.fromJson(jsonData);
for (var coinInfo in coinList) {
if (coinInfo.market == coinPrice.code) {
coinPrice.koreanName = coinInfo.koreanName;
coinPrice.englishName = coinInfo.englishName;
}
}
List<CoinPrice> marketToUpdate;
if (coinPrice.code.contains("KRW-")) {
marketToUpdate = krwMarket;
} else if (coinPrice.code.contains("BTC-")) {
marketToUpdate = btcMarket;
} else {
marketToUpdate = usdtMarket;
}
if (!marketToUpdate.any((cp) => cp.code == coinPrice.code) &&
!isSearch.value) {
marketToUpdate.add(coinPrice);
} else {
for (int i = 0; i < marketToUpdate.length; i++) {
if (marketToUpdate[i].code == coinPrice.code) {
marketToUpdate[i].tradePrice = coinPrice.tradePrice;
marketToUpdate[i].changeRate = coinPrice.changeRate;
marketToUpdate[i].signedChangeRate = coinPrice.signedChangeRate;
marketToUpdate[i].accTradePrice24H = coinPrice.accTradePrice24H;
marketToUpdate[i].askBid = coinPrice.askBid;
marketToUpdate[i].change = coinPrice.change;
break;
}
}
}
selectMarket();
}
});
CoinPrice는 코인의 가격정보, 거래량정보등을 담고있는 모델이고 CoinPrice의 code를 통해 KRW마켓, BTC마켓, USDT마켓으로 분류하여 각 마켓에 데이터를 갱신시킨다.