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”
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.
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?
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.
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
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
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}});
Dragoon
Deve ser a versão que está usando ! é um problema oculto difícil a gente saber
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.
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',},});