abdurrahmanekr / bana-istedigini-sor

Yeni paylaştığım yazılardan haberdar olmak için bloguma abone olun:
https://avarekodcu.com
12 stars 1 forks source link

beni çıldırtan hata #67

Closed krmslmz closed 5 years ago

krmslmz commented 5 years ago

react native ile uygulama geliştirme konusunda çabalıyorum lakin verdiği hatalar beni o duruma getiriyor ki pc yi yumruklayıp kırmamak için kendimi zor tutuyorum

HATA: invariant violation: Maximum update depth exceeded. This can happen when a component repeactedly calls setState inside componentWillUpdate or ComponentDidUpdate. React limits the number of nested updates to prevent infinite loops.

abdurrahmanekr commented 5 years ago

Açıklamada componentWillUpdate ve ComponentDidUpdate methodları içerisinde setState methodu çağrılmasından kaynaklandığını söylüyor. Bu methodlar içinde bir şekilde setState çağrılıyorsa bu sonsuza kadar süreceği için bu hatayı alıyor olmalısınız.

krmslmz commented 5 years ago

methodları kullanmıyorum fonksiyonun render bölümünde direkt veya fonksiyon çalıştırdığımda içinde setstate varsa bu şekilde hata veriyor

abdurrahmanekr commented 5 years ago

render üzerinde çağırdığınız methodlar direkt olarak setState çağırıyorsa bu olay her türlü yaşanacaktır. Neden onu kullanmak istiyorsunuz? Kullanmadan bir şekilde yapılabilir. Asıl yapmak isteğiniz sistemi anlatırsanız yardımcı olabilirim

krmslmz commented 5 years ago

instagram ile ilgili bir eklenti uygulaması yapmaya çalışıyorum iki tür sorunum var birisinde home sayfam açıılınca birden çok render yapıyor bunun için state bağlayıp gelen sonuca göre sonuç varsa açıyorum ikinci sebebi de stateden verinin içine bakıyorum bazen token düşüyor token düştüğünde uygulama login sayfasına dönsün istiyorum gösterebilirim mail veya skypeden

krmslmz commented 5 years ago

import React , {Component}from 'react'; import * as firebase from 'firebase'; import { ImageBackground,StyleSheet, Text, View,Dimensions,TextInput,TouchableOpacity,FlatList,ScrollView,Image } from 'react-native'; import { NavigationActions } from 'react-navigation'; import FallingDrawer from 'react-native-falling-drawer'; const {width, height } = Dimensions.get('window');

export default class Home extends React.Component {

state={ sayac:0, baskan:JSON.stringify(null), ready2:JSON.stringify(false), ready:JSON.stringify(false), user:JSON.stringify(null), info:{}, instaInfo:JSON.stringify(null), tokennumarasi:'', bilgiler:JSON.stringify(null) }

selam() {

const {navigation} = this.props;

this.setState({tokennumarasi : navigation.getParam('tknkod','NO-ID')}) fetch('https://api.instagram.com/v1/users/self?access_token=' + this.state.tokennumarasi) .then(response => response.json()) .then(data =>{data.data; this.setState({instaInfo : data.data, bilgiler : data.data.counts, ready : JSON.stringify(true), sayac : 0 })}) .catch((error) => { this.state.sayac=2; });

  }

goDetay(item)

{ this.props.navigation.navigate('Detay',{tknkod:item,islogin:this.state.tokennumarasi,uyeid:this.state.instaInfo.id});

} async cikisyapcnm(item) {

this.props.navigation.navigate('Login',{islogin2:'sak'});

} kodvar() {

 this.setState({sayac:this.state.sayac++});

} render() { this.selam(); if(this.state.ready===JSON.stringify(false)){

if(this.state.sayac >= 2){
 this.cikisyapcnm('s');

}

console.log('selam3'); return (<View style={{alignItems:'center',borderBottomColor:'green',backgroundColor:'#169E86',height:500,left:0,borderBottomWidth:1,borderBottomColor:'black'}}> <Text style={{color:'white',fontSize:20,marginTop:250,alignItems:'center',padding:15}}> Yükleniyor..

</View>)
this.componentDidMount();

} else { console.log('selam2'); return (

abdurrahmanekr commented 5 years ago

render methodu üzerinden kontrollerinizi yapabilirsiniz fakat state'i güncellememelisiniz (render çalıştığı anda çalışan methodlardan bahsediyorum, mesela selam). Sayfaları yönlendirecek yeri bir View üzerinden yapabilirsiniz. token kontorünü de render methodu üzerinden yapabilirsiniz ancak setState methodunu çalıştırdığınızda henüz this.state değişkeni değimemiş durumda oluyor. Bu yüzden setState methodunu çalıştırmadan statedeki değişkeni kendiniz de değiştirebilirsiniz. ör:

this.state.tokennumarasi = 'token-numarası';
this.setState({
    tokennumarasi: this.state.tokennumarasi
})

React ile birkaç todo uygulamasına bakarak aslı sistemi çözebilirsiniz. Buradan da faydalanabilirsiniz: http://turkcekaynaklar.com/#react

Bu arada kodları paylaşmak istediğinizde markdown'un özelliklerini kullanabilirsiniz. ör. bir kod bloğunu yazmak için şu karakterler arasına yazabilirsiniz: image

krmslmz commented 5 years ago

setstate yerine ne kullanabilirim

krmslmz commented 5 years ago

ya da nasıl bir kodlama yapsam önce bu jsonu parse eder düzgünce

krmslmz commented 5 years ago

sorunu çözdüm navigate den gelen parametre ilk sefer null geliyormuş if else ile onu kontrol ettirdim bütün bu saçma setstateler ortadan kalktı