커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
답변 완료
팁 찜하기 userUniqueId null
[왕초보] 나만의 수익성 앱, 앱개발 종합반
4주차
북마크
윤*옥
댓글
8
추천
0
조회수
14
조회수
14
답변 완료

4-8 강의 수강 중인데 실행 후 파이어베이스 들어가보니 userUniqueId가 null로 뜹니다


import React, { useState, useEffect } from 'react';


import { StyleSheet, Text, View, Image, ScrollView,TouchableOpacity, Alert, Share, Platform } from 'react-native';


import * as Linking from 'expo-linking';


import { firebase_db } from '../firebaseConfig';


import * as Application from 'expo-application';


const isIOS = Platform.OS === 'ios'; //삼항연산자




export default function DetailPage({navigation,route}) {




  //초기 컴포넌트의 상태값을 설정


  //state, setState 뿐 아니라 이름을 마음대로 지정할 수 있음!


  const [tip,setTip] = useState({


    "idx":9,


    "category":"재테크",


    "title":"렌탈 서비스 금액 비교해보기",


    "image": "https://storage.googleapis.com/sparta-image.appspot.com/lecture/money1.png",


    "desc":"요즘은 정수기, 공기 청정기, 자동차나 장난감 등 다양한 대여서비스가 활발합니다. 사는 것보다 경제적이라고 생각해 렌탈 서비스를 이용하는 분들이 늘어나고 있는데요. 다만, 이런 렌탈 서비스 이용이 하나둘 늘어나다 보면 그 금액은 겉잡을 수 없이 불어나게 됩니다. 특히, 렌탈 서비스는 빌려주는 물건의 관리비용까지 포함된 것이기에 생각만큼 저렴하지 않습니다. 직접 관리하며 사용할 수 있는 물건이 있는지 살펴보고, 렌탈 서비스 항목에서 제외해보세요. 렌탈 비용과 구매 비용, 관리 비용을 여러모로 비교해보고 고민해보는 것이 좋습니다. ",


    "date":"2020.09.09"


  })


  //초기 데이터 설정으로 에러 방지




  useEffect(()=>{


    //Card.js에서 navigation.navigate 함수를 쓸때 두번째 인자로 content를 넘겨줬죠?


    //content는 딕셔너리 그 자체였으므로 route.params에 고대~로 남겨옵니다.


    //즉, route.params 는 content죠!




    navigation.setOptions({


      //setOptions로 페이지 타이틀도 지정 가능하고


      title:route.params.title,


      //StackNavigator에서 작성했던 옵션을 다시 수정할 수도 있습니다.


      headerStyle: {


        backgroundColor: '#000',


        shadowColor: "#000",


      },


      headerTintColor: "#fff",


    })




    // setTip(route.params)


    const { idx } = route.params;


    firebase_db.ref('/tip/'+idx).once('value').then((snapshot) => {


      let tip = snapshot.val();


      setTip(tip)


    });


  },[])






  const like = async () => {


    // like 방 안에


    // 특정 사용자 방안에


    // 특정 찜 데이터 아이디 방안에


    // 특정 찜 데이터 몽땅 저장!


    // 찜 데이터 방 > 사용자 방 > 어떤 찜인지 아이디


    let userUniqueId;


    if(isIOS){


      let iosId = await Application.getIosIdForVendorAsync();


      userUniqueId = iosId


    }else{


      userUniqueId = await Application.androidId


    }




    console.log(userUniqueId)


      firebase_db.ref('/like/'+userUniqueId+'/'+ tip.idx).set(tip,function(error){


      //찜한 팁을 위한 방 만들기


      console.log(error)


       Alert.alert("찜 완료!")


     });


  }




  const share = () => {


    // 팁 공유하기 기능


    // import { Share } from 'react-native'


    Share.share({


      message:`${tip.title}\n\n${tip.desc}\n\n${tip.image}`,


    });


  }




  const link = () => {


    // 외부 사이트 열기


    // import * as Linking from 'expo-linking';


    //공식 문서 참고해보자


    Linking.openURL("https://spartacodingclub.kr")


  }




  return (


    // ScrollView에서의 flex 숫자는 의미가 없습니다. 정확히 보여지는 화면을 몇등분 하지 않고


    // 화면에 넣은 컨텐츠를 모두 보여주려 스크롤 기능이 존재하기 때문입니다.


    // 여기선 내부의 컨텐츠들 영역을 결정짓기 위해서 height 값과 margin,padding 값을 적절히 잘 이용해야 합니다.


    <ScrollView style={styles.container}>


      <Image style={styles.image} source={{uri:tip.image}}/>


      <View style={styles.textContainer}>


        <Text style={styles.title}>{tip.title}</Text>


        <Text style={styles.desc}>{tip.desc}</Text>


        <View style={styles.buttonGroup}>


          <TouchableOpacity style={styles.button} onPress={()=>like()}><Text style={styles.buttonText}>팁 찜하기</Text></TouchableOpacity>


          <TouchableOpacity style={styles.button} onPress={()=>share()}><Text style={styles.buttonText}>팁 공유하기</Text></TouchableOpacity>


          <TouchableOpacity style={styles.button} onPress={()=>link()}><Text style={styles.buttonText}>외부 링크</Text></TouchableOpacity>




        </View>       


      </View>


    </ScrollView>


  


  )


}




const styles = StyleSheet.create({


  container:{


    backgroundColor:"#000"


  },


  image:{


    height:400,


    margin:10,


    marginTop:40,


    borderRadius:20


  },


  textContainer:{


    padding:20,


    justifyContent:'center',


    alignItems:'center'


  },


  title: {


    fontSize:20,


    fontWeight:'700',


    color:"#eee"


  },


  desc:{


    marginTop:10,


    color:"#eee"


  },


  buttonGroup: {


    flexDirection:"row",


  },


  button:{


    width:100,


    marginTop:20,


    marginRight:10,


    marginLeft:10,


    padding:10,


    borderWidth:1,


    borderColor:'deeppink',


    borderRadius:7


  },


  buttonText:{


    color:'#fff',


    textAlign:'center'


  }


})




DetailPage.js 코드입니다

취소
 공유
취소
댓글 0
댓글 알림
나의얼굴