* 에러

Network error
..
at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:162:14 in _callReactNativeMicrotasksPass
at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:413:41 in callReactNativeMicrotasks
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:391:6 in __callReactNativeMicrotasks
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:133:6 in __guard$argument_0
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:368:10 in __guard
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:132:4 in flushedQueue

 

* 환경

react native expo + Django

 

* 해결

- backend에 settings.py 변경

  expo start를 했을 때 연결되는 expo ip주소를 넣어주면 된다.

ALLOWED_HOSTS = ['자신의 ip주소'] 
# ex) ALLOWED_HOSTS = ['192.168.0.12']

- backend 실행 시 코드

  자신의 ip:port 로 변경

python manage.py runserver 192.168.0.12:8080

- frontend axios 부분 코드

 button의 onPress 함수가 onPressLogin

const onPressLogin = async () => {
    if (id == "" || pw == "") {
      alert("아이디와 비밀번호를 입력해 주세요");
    } else {
      const data = {
        username: id,
        password: pw,
      };
      console.log(data);

      try {
        const response = await axios
          .post(`http://192.168.0.12:8080/api/v1/token`, data)
          .then(function async(response) {
            if (response.data["success"] == true) {
              setIdNum(response.data["id"]);
              alert("로그인되었습니다.");
              navigation.navigate("Home");
              setId("");
              setPw("");
            }
          })
          .catch(function (error) {
            alert("로그인 오류입니다.");
            //console.log(error.response.data);
            console.log(error);
            throw error;
          });
      } catch (error) {
        console.log(error);
        throw error;
      }
    }
  };

 

※ stackoverflow 참고

https://stackoverflow.com/questions/62031415/unhandled-promise-rejection-typeerror-network-request-failed-expo-node-backend

 

Unhandled promise rejection: TypeError: Network request failed expo node backend

I have a node backend that my expo app is querying. The node-express-mongo backend works just perfect which I can verify using GET Request from Postman but I get unhandled promise rejection Network

stackoverflow.com

 

728x90

 keyboardAvoidingView 를 사용하면 화면에 있는 TextInput을 키보드가 가리지 않도록 화면을 알아서 조정해준다.

그런데 화면 조정 때문에 오히려 만들어놓은 css를 해쳐서 keyboardAvoidingView가 작동되지 않게 하고 싶었다.

 

그런데 keyboardAvoidingView 를 적용하지 않아도 알아서 화면이 조정되었다. 알고보니 default가 keyboardAvoidingView 가 적용되는 것으로 바뀌었던 것이다.

 

expo의 app.json으로 가서 android 부분에 아래 코드를 넣으면 된다.

"softwareKeyboardLayoutMode": "pan"

 

즉, android 부분의 코드는 아래와 같다.

"android": {
      "adaptiveIcon": {
        "foregroundImage": "./assets/adaptive-icon.png",
        "backgroundColor": "#FFFFFF"
      },
      "softwareKeyboardLayoutMode": "pan"
    },

기본적으로 softwareKeyboardLayoutMode : resize 가 기본 값이며, pan 으로 바꿀 수 있다.

 

 

※ expo 공식 문서의 app.json 부분

 

 

 

 

https://docs.expo.dev/versions/latest/config/app/#softwarekeyboardlayoutmode

 

728x90

오랜 구글링 끝에 이 방법으로 위 오류를 해결할 수 있었다. 다른 해결 방법도 많이 시도해봤지만, 해결되는 것은 없었다.

wsl에 아래 명령어를 실행하고, npm install 후 npm start를 해서 다시 앱을 실행했다. 

 

만약 명령어를 실행했는데도 오류는 안 나지만 폰트가 적용되지 않는다면, style에 fontWeight을 정의했는지 봐야 한다. fontWeight을 지정하면 폰트가 적용되지 않는다. 제거해야 한다.

 

window

rm -rf $TMPDIR/react-* && rm -rf node_modules/ && rm -f package-lock.json && rm -f yarn.lock && npm cache verify && npm install && expo r -c

 

mac

watchman watch-del-all && rm -rf $TMPDIR/react-* && rm -rf node_modules/ && rm -f package-lock.json && rm -f yarn.lock && npm cache verify && npm install && expo r -c

 

 

※ 출처 및 참고

https://intrepidgeeks.com/tutorial/reactnative-error-fontfamily-error

 

 

728x90

개발을 얼마 하지도 않았는데 갑자기 react native expo Attempt to invoke virtual method 'boolean abi .facebook.. 라는 에러가 떴다.

 

구글링을 통해 찾아보니, 이 오류는 안드로이드 폰에서만 발생하는 문제이고, Expo 앱의 2.24.1 버전에서 발생한다는 것을 알았다. 따라서 Expo 앱을 2.23.2로 다운 그레이드 하는 것이 필요했다.

 

https://apkcombo.com/ko/expo/host.exp.exponent/ 이 사이트에 들어가서  Expo 앱의 2.23.2 버전 apk를 다운 받았다.

그리고 핸드폰에 있는 Expo를 삭제한 뒤, 설정 > 생체 인식 및 보안 > 출처를 알 수 없는 앱 설치 에 들어가 허용을 해주었다. 그 후, 다운 받은 apk를 실행했다.

 

왜 새로운 버전의 Expo에서 안드로이드만 오류가 나는지 모르겠다.

 


Expo 앱이 알아서 업데이트가 되는 바람에 다른 방법을 찾아야했다.

expo 버전을 45.0.1로 업데이트해서 문제를 해결했다.

expo upgrade
728x90

1. 완료한 것

- figma로 디자인

- notion 정리

- start page 완성

- start page에서 버튼 누르면 로그인 페이지로 이동

 

2. 코드

페이지에서 페이지간 이동을 하는 방법을 구글링을 통해 찾아봤었는데 class component로 쓰여진 글이 많아서 function component로 바꿔서 사용해보았다. (사실 function component가 훨씬 익숙하다,,)

StartPage.js에서 시작하기 버튼을 누르면 Login.js에서 넘어갈 수 있도록 구현했다.

 

① App.js

- 설치할 것

npm install @react-navigation/native

expo install react-native-gesture-handler react-native-reanimated react-native-screens react-native-safe-area-context @react-native-community/masked-view
/*App.js*/
import React, { Component } from "react";
import { NavigationContainer } from "@react-navigation/native";
import { createStackNavigator } from "@react-navigation/stack";
import StartScreen from "./src/StartPage";
import LoginScreen from "./src/Login";

const Stack = createStackNavigator();

export default function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen
        // header를 감춘다
          options={{ headerShown: false }}
          name="StartPage"
          component={StartScreen}
        />
        <Stack.Screen
          options={{ headerShown: false }}
          name="Login"
          component={LoginScreen}
        />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

코드의 순서에 따라 달라진다. 위에 있는 page가 가장 먼저 실행된다.

 

② StartPage.js

import { StatusBar } from "expo-status-bar";
import {
  StyleSheet,
  Text,
  View,
  TouchableOpacity,
  Dimensions,
} from "react-native";
import { Image } from "react-native";

const { width: SCREEN_WIDTH } = Dimensions.get("window");

export default function StartPage({ navigation }) {
  return (
    <View>
      <Text>CHERISH PET!</Text>
      <StatusBar style="auto" />
      <View>
        <TouchableOpacity onPress={() => navigation.navigate("Login")}>
          <Text>시작하기</Text>
        </TouchableOpacity>
      </View>
    </View>
  );
}

간소화한 코드로, 오늘 완성한 코드와는 다르다. TouchableOpacity의 onPress 속성으로 눌렀을 때 "Login" 페이지로 넘어가도록 했다.

 

③ Login.js

import { StatusBar } from "expo-status-bar";
import {
  StyleSheet,
  Text,
  View,
  TouchableOpacity,
  Dimensions,
} from "react-native";
import { Image } from "react-native";

const { width: SCREEN_WIDTH } = Dimensions.get("window");

export default function Login({ navigation }) {
  return (
    <View>
      <StatusBar style="auto" />
      <View>
        <Text>CHERISH PET!</Text>
    </View>
  );
}

 

※ 참고한 사이트

https://dlee0129.tistory.com/15

 

 

728x90

#1, #2 Weather App

2021 동계 모각코 1월 17일 결과2021 동계 모각코 1월 19일 결과 를 이어서 정리한다.

 

* ScrollView
  내부에 컴포넌트와 뷰들을 자식으로 담을 수 있는, 화면의 스크롤을 사용할 때 쓰는 컴포넌트
- 스크롤 방향은 horizontal을 통해 가로 또는 세로로 변경
- contentContainerStyle={{styles.변수}}
- pagingEnabled 속성으로 페이지처럼 만들 수 있음
- showsHorizontalScrollIndicator={false} 로 스크롤 바를 없앨 수 있음.
- indicatorStyle="white"으로 스크롤바의 색상을 변경할 수 있음(ios에서만 작용)

- 참고 사이트 : https://reactnative.dev/docs/scrollview

 

* Dimension
  화면 크기를 얻는 API

 

* Location
- expo install expo-location 입력
- Location.requestForegroundPermissionAsync()으로 유저에게 위치 접근 권한 동의 알림창 보여줌
- Location.getCurrrentPositionAsync()으로 user의 위도와 경도를 알아냄.
- Location.reverseGeocodeAsync()으로 위도와 경도를 이용해 주소를 가져옴.
- openweatherorg의 api를 이용해 날씨를 가져옴

 

* toFixed()
ex) (12.12).toFixed(1) -> 12.1

 

* expo/vector-icons
- icons.expo.fyi 사이트에 가면 아이콘 확인 가능

 

 

※ 코드는 https://github.com/leecr1215/Nomad_Weather에서 확인할 수 있습니다


#3, #4 Todo App (Work Hard Travel Hard App)

* react native에만 있는 속성
- paddingVertical
- paddingHorizontal

 

* button 관련 컴포넌트
① TouchableOpacity
- 누르는 이벤트를 들을 준비가 된 View
- 터치하면 래핑된 View의 opacity가 감소하여 흐리게 표시됨
- View가 터치에 적절하게 반응하도록 하는 래퍼

 

② TouchableHighlight
- 클릭한 요소의 배경색이 바뀌도록 함
- underlayColor

  원하는 배경색을 설정할 수 있는 속성
- onPress

  유저가 Touchable을 눌렀을 때 실행되는 이벤트

  onPress={이벤트명}
- onLongPress

  유저가 Touchable을 길게 눌렀을 때 실행되는 이벤트

 

③ TouchableWithoutFeedback
- Touchable 컴포넌트이고 화면의 가장 위에서 일어나는 탭 이벤트를 듣는 컴포넌트
- UI 변화를 보여주지 않음

 

④ Pressable
- disable 속성 있음
- hitSlope 속성 : 요소 바깥 어디까지 탭을 누르는 것을 감지할 것인지 정할 수 있음

 

* text input 관련 속성
- placeholder
- onFocus
  화면을 터치하면 쓸 준비가 된 상태
- onChangeText : 입력한 Text를 받을 수 있음
- keyboardType 종류 :  number-pad, email-address 등
- returnKeyType 종류 :   send, next, done, go 등
  -> 키보드의 return 버튼 상태를 변경할 수 있음
- returnKeyLabel(안드로이드만) : return 버튼에 쓸 text를 마음대로 정할 수 있음
- secureTextEntry : 글씨가 안보이고 ●으로 보임
- multiline : 한 줄 이상 쓰는 경우에 사용
- autoCapitalize: 대문자를 지정
- sentences: 첫 글자가 대문자로 입력됨
- words: 다 대문자로 입력됨
- onSubmitEditing : 완료 버튼 눌렀을 때 발생하는 이벤트(함수)

 

* object assign
: object를 가져다가 다른 object와 합쳐주고 새로운 object를 리턴

 

* Object로 map 쓰는 법
- Object.keys(object 이름) => key들을 array로 반환
- 즉 Object.keys(object 이름).map()으로 사용

 

* AsyncStorage
- 다운
expo install @react-native-async-storage/async-storage
- 사용
await AsyncStorage.setItem(key, value)
이때 value는 string 형태

- 참고 사이트 : https://docs.expo.dev/versions/v44.0.0/sdk/async-storage/

 

* Alert.alert()
- 확인 알림창
- 사용자에게 물어볼 때 사용
- text 및 버튼 넣는 것 가능
- 버튼을 눌렀을 때 실행할 함수 적용 가능

 

* publish app
- QR코드 스캔으로 앱 확인 가능

 

* asserts 폴더
- 앱이 로딩될 때 보여주는 아이콘 설정
- 앱을 나타내는 아이콘 설정

 

* build 하는 법

방법 1. https://docs.expo.dev/classic/building-standalone-apps/
- expo build:android or expo build:ios 입력
   -> 엔터 계속 누르기
- 그 후 나오는 링크로 들어가서 build 현황 확인
- expo build:web 으로 웹 빌드

 

방법 2. React Native for Windows + macOS
React Native로 네이티브 Windows, macOS 앱을 빌드할 수 있다.
https://microsoft.github.io/react-native-windows/

 

방법 3. viroReact
ViroReact는 React Native를 사용하여 AR/VR 애플리케이션을 빠르게 구축하기 위한 오픈 소스 개발자 플랫폼

AR 및 VR 앱은 single code를 기반으로 함

https://viromedia.com/viroreact

 

* expo의 문제점
- 앱 설정에 관해서 많은 설정을 할 수 없음
   -> 기초적인 파일들에 접근이 불가능함
- js와 json이 아닌 다른 파일에 접근해야할 때 불편함
- npm run eject를 하면 expo에서 꺼내짐

 

* 앱 아이콘

 

 

 

 

 

 

 

 

ppt로 직접 그렸습니다. 필요하신분은 사용하셔도 됩니다.

 

 

 

※ 코드는 https://github.com/leecr1215/WorkHardTravelHardApp에서 확인할 수 있습니다

728x90

+ Recent posts