[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> krwMarket = <CoinPrice>[].obs;
  RxList<CoinPrice> btcMarket = <CoinPrice>[].obs;
  RxList<CoinPrice> usdtMarket = <CoinPrice>[].obs;

 

코인데이터들을 WebSocketChannel에 스트림하는 코드이다.

var response =
        await http.get(Uri.parse("https://api.upbit.com/v1/market/all"));
    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마켓으로 분류하여 각 마켓에 데이터를 갱신시킨다.