Aprendi a usar o setState para renderizar novamente a classe herdeira de Component, a principal, mas usando Expo, numa função async, se digito, nomeDaFunçãoPrincipal(), nada acontece.
Como chamar a função principal para que ela renderize com dados atualizados?
Ficamos sem entender, mas, se tiver como criar um exemplo minimo de código e explicar o que precisa fazer acho que podemos ajudar, mas, assim é tipo “eu não entendi nada”
L
LeandroCGMS
Quando crio um projeto sem usar Expo, uma classe que estende de Component, tem a função render() e se crio outra classe que extende de Component, para depois incluir na classe principal apenas usando <OutraClasse/>, consigo chamar uma função assíncrona chamada no começo desta outra classe, no método construtor, passando como parâmetro para a função async o this e lá dentro da função async, quando ela puxar dados de um site, ela vai usar o this, mas chamada de classe, então classe.setState({dados: retorno do fetch}).
Tudo isto faz renderizar a classe **<OutraClasse>** dentro da classe principal.
No Expo, temos uma função principal exportada e carregada no carregamento do App, chamada de App(), mas se chamo ela de dentro da função async, nada acontece.
D
Dragoon
Parece que você está desenvolvendo em React Native?
Se for pode postar essas duas classes e o problema encontrado com a tela de erro?
L
LeandroCGMS
O problema que enfrento não é um erro em tempo de execução, mas a dúvida sobre como chamar a função principal para ela renderizar a tela com novos dados trazidos de uma função assíncrona, tendo em vista que ao usar o nome dela, App(), nada acontece diferente do setState que usamos em desenvolvimento sem Expo.
D
Dragoon
Se você não exemplificar e mostrar algo não tem como ajudar …
Quer fazer talvez algo que não funcione, eu acho que funciona
L
LeandroCGMS
Na linha 33, quando App(), nada acontece e sem usar Expo, bastaria, fazer classe.setState({chave: valor}), logo renderizava novamente:
node_modules/react-native/Libraries/Renderer/oss/ReactNativeRenderer-dev.js:9473:27 in renderWithHooks
node_modules/react-native/Libraries/Renderer/oss/ReactNativeRenderer-dev.js:11994:6 in mountIndeterminateComponent
… 18 more stack frames from framework internals
L
LeandroCGMS
Eu modifiquei para o código abaixo e colocando um console.log dentro da função App(), percebi que ela é chamada novamente, entretanto não atualiza o return com a variável nome.
importReactfrom'react';import{StyleSheet,Text,View}from'react-native';letnome='vazio'letchamouFuncao=falseexportdefaultfunctionApp(){console.log('Dentro da função App e a variável nome é '+nome)if(!chamouFuncao){esperarsegundos()}chamouFuncao=true/*const[message,setMessage]=useState('');const[list,setList]=useState([]);constinputMessage=useRef();functionhandlerMessageChange(event){const{value}=event.target;setMessage(value);}functionhandlerButtonSend(){socket.emit('chat message',message);setMessage('');handleInputMessageFocus();}*/asyncfunctionesperarsegundos(){letantes=Date.now()setTimeout(()=>{styles.green={color:'black',fontSize:100}styles.green={color:'black'}nome='umapessoaqualquer'styles.green={color:'green',fontSize:30}console.log(styles.green,nome)App()},3000)//App()console.log('A função async durou '+(Date.now()-antes)+' milissegundos.')}return(<Viewstyle={styles.container}><Textstyle={styles.green}>Verde</Text><Textstyle={styles.bigblue}>Azul</Text><Textstyle={[styles.bigblue,styles.green]}>Azul,depoisverde</Text><Textstyle={[styles.green,styles.bigblue]}>Verde,depoisazul</Text><Text>{nome?nome:'false'}</Text></View>);}conststyles=StyleSheet.create({container:{flex:1,backgroundColor:'#fff',alignItems:'center',justifyContent:'center',},bigblue:{color:'blue',fontWeight:'bold',fontSize:50},green:{color:'green',fontSize:30}});
D
Dragoon
Deve ser a versão que está usando ! é um problema oculto difícil a gente saber
L
LeandroCGMS
Quanto àquele erro acima, era só colocar , { useState } from ‘react’. Sei que não percebeu isso . Sinceramente, estou em um tipo diferente de raciocínio para entender este novo tipo de código por esses poucos dias que se sucederão.
L
LeandroCGMS
Consegui da forma abaixo, mas algo intrigante é que ontem tentei o mesmo código, mas quando chegava na linha do fetch, a função não passava a mais nenhuma linha e um console.log abaixo do fetch não executava. De um dia para o outro, isso pára de acontecer. Já é a segunda vez que me acontece isso.
importReact,{Component}from'react';import{StyleSheet,Text,View}from'react-native';classDadosextendsComponent{constructor(props){super(props)this.state={dados:<Text>Maria</Text>}pegarDados('http://swapi.co/api/films/2',this)}render(){return(<View>{this.state.dados}</View>)}}asyncfunctionpegarDados(url,elementoComSetState){try{//console.log('entrou no try')letresposta=awaitfetch(url)letrespostaJson=awaitresposta.json()letentradasResposta=Object.entries(respostaJson)letvaloresResposta=Object.values(Response)letchavesResposta=Object.keys(respostaJson)letresultado=[]console.log(chavesResposta)for(leti=0;i<chavesResposta.length;i++){resultado.push(<Text>{chavesResposta[i]}</Text>)resultado.push(<Text>{valoresResposta[i]}</Text>)}elementoComSetState.setState({dados:resultado})}catch(erro){//console.log(erro)}}exportdefaultfunctionApp(){return(<Viewstyle={styles.container}><Dados/></View>);}conststyles=StyleSheet.create({container:{flex:1,backgroundColor:'#fff',alignItems:'center',justifyContent:'center',},});