import { StatusBar } from 'expo-status-bar';
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
export default function App() {
return (
<View style={styles.container}>
<View style={styles.yellowView}>
</View>
<View style={styles.blueView}>
</View>
<StatusBar style="auto" />
</View>
);
}
const styles = StyleSheet.create({
container: { //부모 컨테이너에서 스크린의 모든 공간을 사용한다는 flex: 1을 해줘야 한다.
flex: 1
},
yellowView: { //자식들의 flex값의 비율에따라 달라진다.
flex: 1,
backgroundColor: "yellow"
},
blueView: {
flex: 5,
backgroundColor: "blue"
}
});
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
export default function Loading(){
return (
<View style={styles.container}>
<Text style={styles.text}>Getting the fucking weather</Text>
</View>
);
}
const styles=StyleSheet.create({
container: {
flex: 1,
justifyContent: "flex-end",
paddingHorizontal: 30, // 30px라 쓰려면 "30px"로 해주어야 한다.
paddingVertical: 100,
backgroundColor: "#FEF6AA"
},
text: {
color: "#2C2C2C",
fontSize: 30
}
});
expo install expo-location
import React from 'react';
import Loading from './Loading';
import * as Location from 'expo-location';
export default class extends React.Component {
getLocation= async () =>{
const location = await Location.getCurrentPositionAsync();
}//getCurrentPositionAsync()는 permission을 구해야 한다.
componentDidMount(){
this.getLocation();
}
render (){
return <Loading/>;
}
}
import React from 'react';
import Loading from './Loading';
import {Alert} from 'react-native';
import * as Location from 'expo-location';
export default class extends React.Component {
state= {
isLoading: true
}
getLocation= async () =>{
try {
await Location.requestForegroundPermissionsAsync();
const {coords : {latitude, longitude}} = await Location.getCurrentPositionAsync();
this.setState({isLoading: false});
} catch (error) {
Alert.alert("Can't find you","so sad...");
}//alert사용을 위해 react-native에서 import해와야 한다.
}
componentDidMount(){
this.getLocation();
}
render (){
const {isLoading} = this.state;
return isLoading ? <Loading/> : null;
}
}
https://openweathermap.org/ 에서 api를 받기 위해 회원가입을 한다.
자신의 api_key를 받아 저장해둔다.
-해당 사이트의 api reference를 보고 사용법에 따라 작성한다.
axios의 사용법은 ReactJS 4일차에 있다.
여기서 api_key를 적고 github에 push하게되면 api_key가 노출된다.
- api_key를 숨기기 위해 environment.js를 만들어 안에 api_key를 넣고 .gitignore에 environment.js를 추가해준다.
import React from 'react';
import Loading from './Loading';
import {Alert} from 'react-native';
import * as Location from 'expo-location';
import axios from 'axios';
import environment from './environment';
const API_KEY = environment.REACT_APP_WEATHER_API_KEY;
export default class extends React.Component {
state= {
isLoading: true
}
getWeather = async (latitude,longitude) =>{
const {data} = await axios.get(`http://api.openweathermap.org/data/2.5/weather?lat=${latitude}&lon=${longitude}&appid=${API_KEY}
`);//http://를 붙이지 않으면 Network error가 발생한다.
console.log(data);
}
getLocation = async () =>{
try {
await Location.requestForegroundPermissionsAsync();
const {coords : {latitude, longitude}} = await Location.getCurrentPositionAsync();
this.getWeather(latitude,longitude);
this.setState({isLoading: false});
} catch (error) {
Alert.alert("Can't find you","so sad...");
}
}
componentDidMount(){
this.getLocation();
}
render (){
const {isLoading} = this.state;
return isLoading ? <Loading/> : null;
}
}