react-native android | 本机视图可见性回调

CAM*_*BAP 5 android react-native

介绍

我有一个简单的例子,它使用了一些我在 javascript 代码中使用的本机视图,如下所示:

import React, { useState, useEffect } from 'react';
import { Text, Button, View } from 'react-native';

const TestApp = () => {
  const [isShowingNativeView, setIsShowingNativeView] = useState(true);

  // ... some state logic

  let contentView;
  if (isShowingNativeView) {
    contentView = <MyNativeView />;
  } else {
    contentView = <Text>Text component</Text>;
  }

  return (
    <View style={{ width: '100%', heinght: '100%' }}>
      {contentView}
    </View>
  );
}

export default TestApp;
Run Code Online (Sandbox Code Playgroud)

这是ViewManager实现的样子:

class MyNativeViewManager(private val reactContext: ReactApplicationContext) : SimpleViewManager<MyNativeView>() {

    companion object {
        private val TAG = MyNativeViewManager::class.java.simpleName
        private val REACT_CLASS = MyNativeView::class.java.simpleName
    }

    override fun getName(): String = REACT_CLASS

    override fun createViewInstance(reactContext: ThemedReactContext): MyNativeView {
        return MyNativeView(reactContext)
    }

    override fun onDropViewInstance(view: MyNativeView) {
        Log.d(TAG, "onDropViewInstance")
        super.onDropViewInstance(view)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是MyNativeView实现:

class MyNativeView(context: Context) : GLSurfaceView(context) {

    private val TAG = MyNativeView::class.java.simpleName as String

    override fun onAttachedToWindow() {
        super.onAttachedToWindow()
        Log.d(TAG, "onAttachedToWindow")
    }

    override fun onDetachedFromWindow() {
        super.onDetachedFromWindow()
        Log.d(TAG, "onDetachedFromWindow")
    }

    override fun onWindowVisibilityChanged(visibility: Int) {
        super.onWindowVisibilityChanged(visibility)
        Log.d(TAG, "onWindowVisibilityChanged $visibility")
    }

    override fun onDisplayHint(hint: Int) {
        super.onDisplayHint(hint)
        Log.d(TAG, "onDisplayHint $hint")
    }
}
Run Code Online (Sandbox Code Playgroud)

当我的视图可见或不可见时,如何在本机代码中获得可见性回调?我试过了:

  • ViewManager.onDropViewInstance
  • ViewManager.onDetachedFromWindow
  • View.onWindowVisibilityChanged
  • View.onDisplayHint
  • View.onVisibilityChanged
  • View.onVisibilityAggregated
  • View.onStartTemporaryDetach

但这些都不起作用。

这可以按照我预期的方式实现吗?我应该尝试另一种方法吗?

更新

这个项目https://github.com/ShaMan123/react-native-visibility-tracker使用我尝试过的相同方法,看起来它有效,所以可能与 GLSurfaceView 本身有关