React Native:警告:在现有状态转换期间无法更新

时间:2019-05-13 14:32:08

标签: android reactjs react-native navigation react-navigation

我正在获取数据,然后将其保存在移动设备上的sqlite文件中。调用此屏幕时,抓取代码开始由componentDidMount()函数调用。提取结束后,会执行setState()并因此调用componenDidUpdate()函数(先将数据保存在sqlite中,然后再保存setState= 'isLoadingDataProgramadas: false'),所以我希望应用程序过渡到'ActProgramadas'屏幕使用React-Navigation V3。下面的解决方案有效,但警告我:

  

警告:无法在现有状态(例如在   '渲染')。渲染方法应该是props和   状态。

我该如何解决?

componentDidMount() {
    this.doFetch();
 }

componentDidUpdate(){
    this.openBD();
    this.insertSQLITE();
}
 componentWillUnmount() {
    this.closeDatabase();
 }

 render() {
    if(this.state.isLoadingDataProgramadas)
      return (
          <View style={stylesLoading.container}>
              <View>
                  <ActivityIndicator size="large" color="lightblue"/>
              </View>

              <View>
                  <Text style={stylesLoading.texto}>
                  Descargando datos... 
                  </Text>
              </View>
          </View>
      );
    else
      return( 
         <View>
           {this.props.navigation.navigate('ActProgramadas')}
         </View>

      );
  }

2 个答案:

答案 0 :(得分:0)

  1. 它看起来像是您的if else语句中的错字。
  2. 并尝试像这样绑定您的导航事件处理程序,或在构造函数中进行操作。

尝试一下:

render() {
    if(this.state.isLoadingDataProgramadas) {
      return (
          <View style={stylesLoading.container}>
              <View>
                  <ActivityIndicator size="large" color="lightblue"/>
              </View>

              <View>
                  <Text style={stylesLoading.texto}>
                  Descargando datos... 
                  </Text>
              </View>
          </View>
      );
      } else {
      return( 
         <View>
           {() => this.props.navigation.navigate('ActProgramadas')}
         </View>

      );
      }
  }

答案 1 :(得分:0)

可能是navigation.navigate在内部使用了setState函数。我的建议是制作一个将导航封装到这样的setTimeout函数中的函数

navigate = () => {
    const { navigation } = this.props
    setTimeout(() => {
        navigation.navigate('ActProgramadas')
    }, 1000);
}

...

<View>
    {this.navigate()}
</View>