微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – react-native:android.view.WindowManager $BadTokenException

我有一个错误,我不知道从哪里开始.试图更新react-native版本 – 但它没有做到这一点..

环境

react-native-cli: 2.0.1
react-native: 0.54.2

生产建设

该应用程序是构建并发布到谷歌游戏商店.所以这是编译后的生产版本.认为这可能是模块的一个问题..但不太确定..

这是我在主要组件中的导入

import React, { Component } from 'react'
import { View, Modal, Text, TextInput, StyleSheet } from 'react-native'
import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'

全栈

java.lang.RuntimeException: 

  at com.facebook.react.bridge.ReactContext.handleException (ReactContext.java:313)

  at com.facebook.react.bridge.GuardedRunnable.run (GuardedRunnable.java:23)

  at android.os.Handler.handleCallback (Handler.java:739)

  at android.os.Handler.dispatchMessage (Handler.java:95)

  at android.os.Looper.loop (Looper.java:158)

  at android.app.ActivityThread.main (ActivityThread.java:7225)

  at java.lang.reflect.Method.invoke (Native Method)

  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1230)

  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120)
Caused by: android.view.WindowManager$BadTokenException: 

  at android.view.ViewRootImpl.setView (ViewRootImpl.java:849)

  at android.view.WindowManagerGlobal.addView (WindowManagerGlobal.java:337)

  at android.view.WindowManagerImpl.addView (WindowManagerImpl.java:91)

  at android.app.Dialog.show (Dialog.java:350)

  at com.facebook.react.views.modal.ReactModalHostView.showOrUpdate (ReactModalHostView.java:256)

  at com.facebook.react.views.modal.ReactModalHostManager.onAfterUpdateTransaction (ReactModalHostManager.java:107)

  at com.facebook.react.views.modal.ReactModalHostManager.onAfterUpdateTransaction (ReactModalHostManager.java:28)

  at com.facebook.react.uimanager.ViewManager.updateProperties (ViewManager.java:35)

  at com.facebook.react.uimanager.NativeViewHierarchyManager.createView (NativeViewHierarchyManager.java:233)

  at com.facebook.react.uimanager.UIViewOperationQueue$CreateViewOperation.execute (UIViewOperationQueue.java:153)

  at com.facebook.react.uimanager.UIViewOperationQueue$1.run (UIViewOperationQueue.java:816)

  at com.facebook.react.uimanager.UIViewOperationQueue.flushPendingBatches (UIViewOperationQueue.java:929)

  at com.facebook.react.uimanager.UIViewOperationQueue.access$2100 (UIViewOperationQueue.java:47)

  at com.facebook.react.uimanager.UIViewOperationQueue$2.runGuarded (UIViewOperationQueue.java:887)

  at com.facebook.react.bridge.GuardedRunnable.run (GuardedRunnable.java:21)

UPDATE

我使用模态3个不同的地方.

const Credits = ({ display, toggle }) => (
  <View>
    <TouchableOpacity
      style={[styles.button, styles.info]}
      onPress={() => toggle()}
    >
      <Icon name="question" size={30} color="#000" />
    </TouchableOpacity>

    {display && (
      <Modal
        animationType="slide"
        transparent={true}
        onRequestClose={() => toggle()}
      >
        <View style={styles.card}>
          <ScrollView>
            { ... code ...  }
          </ScrollView>
          <TouchableOpacity
            style={[styles.button, styles.close]}
            onPress={() => toggle()}
          >
            <Icon name="close" size={30} color="#000" />
          </TouchableOpacity>
        </View>
      </Modal>
    )}
  </View>
)

不知道是不是因为我使用{display&& <模态... /> }逻辑而不是使用prop visible = {display} ???

任何帮助将非常感谢!

解决方法:

因为React本机工作异步;从React本机获取结果并在更新任何UI之前,检查activity.isFinishing()以及活动是否完成后不更改UI

一个解决方案是在某些实例变量中保存onResume()和onPause()中的活动状态,然后在从React获取结果时检查活动状态,如果活动已恢复,则只显示结果,但如果您的活动暂停,则保存React的结果并显示活动的onResume()方法中的结果.
另外,不要忘记检查上面的生命周期,以显示从React到用户的任何错误.来自react的任何Android UI更新都应考虑Android活动生命周期.

void onResume(){
    super.onResume();
    activityResumed = true;
    if(showResultsOnResume){
        showResultsOnResume = false;
       //you have saved results from react waiting to show, show it here
     }
}
void onPause(){
       super.onPause();
       activityResumed = false;
}

// use this method to update any UI from React
void onReactResult(/*Results or Errors from React*/){ 
       if(activityResumed){
           // show the result
       }else{
           showResultsOnResume = true;
           // save result
       }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐