【问题标题】:React native: "only the original thread that created a view hierarchy can touch its views"React Native:“只有创建视图层次结构的原始线程才能触摸它的视图”
【发布时间】:2019-03-15 14:39:05
【问题描述】:

按下按钮以获取 svg 的 base64 字符串 ...产生以下错误: - 只有创建视图层次结构的原始线程才能接触其视图

render() {
    return (
      <ScrollView contentContainerStyle={styles.container}>
        <Svg
          ref={c => (this.svg = c)}
          height="50%"
          width="50%"
          viewBox="0 0 100 100"
        >
          <Circle
            cx="50"
            cy="50"
            r="45"
            stroke="blue"
            strokeWidth="2.5"
            fill="green"
          />
        </Svg>

        <TouchableOpacity
          onPress={() => {
            this.svg.toDataURL(data => {
              console.log("data", data);
            });
          }}
        >
          <Text>Get Data</Text>
        </TouchableOpacity>
      </ScrollView>
    );
  }

有什么帮助吗?

【问题讨论】:

  • 哪个线程在调用这个render()
  • 在一个非常简单的应用程序中...在 app.js 中
  • minimal reproducible example 并请发布整个堆栈跟踪,以便人们可以帮助您。粘贴一种方法和大屏幕截图对任何人都没有帮助。从您到目前为止发布的内容来看,我猜您正在尝试从非 UI(非主)线程创建视图,这在 android 中是一个问题。

标签: android react-native react-native-svg


【解决方案1】:

我终于想通了……

这是 npm (v 6.4.1) 的问题,因为当我删除 node-modules 文件夹和 package-lock.json 并尝试使用 yarn 重新安装它时,它就像以前一样工作。

我安装了一个新版本的 react-native-svg,它对我不起作用,当我尝试使用 npm 降级到旧版本时,由于某种原因它无法识别它,并且 package-lock.json 保留使用我卸载的较新版本创建!

【讨论】:

    【解决方案2】:

    就我而言,我通过在主线程上运行我的块来解决它:

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            // My block, doing stuff on the view
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 2015-05-22
      • 2018-04-12
      • 1970-01-01
      相关资源
      最近更新 更多