반응형
Udemy 플러터 강의 6주차
ㄴ Section 14. Bitcoin Ticker
https://www.udemy.com/course/flutter-bootcamp-with-dart/
이번 강의에서는 coin API를 호출하여 코인 가격 정보를 가져온 뒤, 각 나라의 화폐 단위로 출력해주는 앱을 구축하는 과정을 설명한다.
강의내용요약
Flutter
- DropdownButton
- iOS-style Cupertino
Dart
- Loops
소스코드
coin_data.dart
- coin api 호출
- map 형태로 각 코인에 대한 가격 정보 가져오는 변수
- response json 데이터에 rate 값에 필요한 정보가 있음
import 'dart:convert'; // json 파싱
import 'package:http/http.dart' as http; // api 호출
const List<String> currenciesList = [
'AUD',
'BRL',
'CAD',
'CNY',
'EUR',
'GBP',
'HKD',
'IDR',
'ILS',
'INR',
'JPY',
'MXN',
'NOK',
'NZD',
'PLN',
'RON',
'RUB',
'SEK',
'SGD',
'USD',
'ZAR'
];
const List<String> cryptoList = [
'BTC',
'ETH',
'LTC',
];
const apiURL = "https://rest.coinapi.io/v1/exchangerate";
const apiKey = "567BF55E-7227-4F35-AAA6-F8F8CEF90069";
class CoinData {
Future getCoinData(String selectedCurrency) async {
Map<String, String> cryptoPrices = {};
for (String crypto in cryptoList) {
String requestURL = "$apiURL/$crypto/$selectedCurrency?apiKey=$apiKey";
http.Response response = await http.get(Uri.parse(requestURL));
if (response.statusCode == 200) {
var decodedData = jsonDecode(response.body);
double lastPrice = decodedData['rate'];
print(lastPrice);
cryptoPrices[crypto] = lastPrice.toStringAsFixed(0);
} else {
print(response.statusCode);
throw 'Problem with the get request';
}
}
return cryptoPrices;
}
}
price_screen.dart
- android device를 위한 dropdown
- ios device를 위한 cupertino picker
- Platform 클래스에 각 디바이스의 os를 확인하는 변수가 있음
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'coin_data.dart';
import 'dart:io' show Platform; // platform class만 이용
class PriceScreen extends StatefulWidget {
@override
_PriceScreenState createState() => _PriceScreenState();
}
class _PriceScreenState extends State<PriceScreen> {
String selectedCurrency = 'AUD';
// Android를 위한 드랍다운
DropdownButton<String> androidDropdown() {
List<DropdownMenuItem<String>> dropdownItems = [];
for (String currency in currenciesList) {
var newItem = DropdownMenuItem(
child: Text(currency),
value: currency,
);
dropdownItems.add(newItem);
}
return DropdownButton<String>(
value: selectedCurrency,
items: dropdownItems,
onChanged: (value) {
setState(() {
selectedCurrency = value!;
getData();
});
},
);
}
// iOS를 위한 CupertinoPicker
CupertinoPicker iOSPicker() {
List<Text> pickerItems = [];
for (String currency in currenciesList) {
pickerItems.add(Text(currency));
}
return CupertinoPicker(
backgroundColor: Colors.lightBlue,
itemExtent: 32.0,
onSelectedItemChanged: (selectedIndex) {
selectedCurrency = currenciesList[selectedIndex];
getData();
},
children: pickerItems,
);
}
Map<String, String> coinValues = {};
bool isWaiting = false; // 값 받아온지 체크하는 변수
void getData() async {
isWaiting = true;
try {
var data = await CoinData().getCoinData(selectedCurrency);
print(data);
isWaiting = false;
setState(() {
coinValues = data;
});
} catch (e) {
print(e);
}
}
@override
void initState() {
super.initState();
getData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('🤑 Coin Ticker'),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
CryptoCard(
cryptoCurrency: 'BTC',
value: isWaiting ? '?' : coinValues['BTC'],
selectedCurrency: selectedCurrency,
),
CryptoCard(
cryptoCurrency: 'ETH',
value: isWaiting ? '?' : coinValues['ETH'],
selectedCurrency: selectedCurrency,
),
CryptoCard(
cryptoCurrency: 'LTC',
value: isWaiting ? '?' : coinValues['LTC'],
selectedCurrency: selectedCurrency,
),
],
),
Container(
height: 150.0,
alignment: Alignment.center,
padding: EdgeInsets.only(bottom: 30.0),
color: Colors.lightBlue,
child: Platform.isIOS ? iOSPicker() : androidDropdown(),
),
],
),
);
}
}
class CryptoCard extends StatelessWidget {
const CryptoCard({
this.value,
this.selectedCurrency,
this.cryptoCurrency,
});
final String? value;
final String? selectedCurrency;
final String? cryptoCurrency;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.fromLTRB(18.0, 18.0, 18.0, 0),
child: Card(
color: Colors.lightBlueAccent,
elevation: 5.0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
child: Padding(
padding: EdgeInsets.symmetric(vertical: 15.0, horizontal: 28.0),
child: Text(
'1 $cryptoCurrency = $value $selectedCurrency',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 20.0,
color: Colors.white,
),
),
),
),
);
}
}
반응형
'Programming > Flutter' 카테고리의 다른 글
플러터(Flutter) 스터디 5주차 (0) | 2021.11.07 |
---|---|
플러터 스터디 3주차 (0) | 2021.10.30 |
플러터(Flutter) 스터디 2주차 (0) | 2021.10.23 |
플러터(Flutter) 스터디 1주차 (0) | 2021.10.04 |