gpt4 book ai didi

react-native - JS Root View 从其父 View 中删除后是否总是从 native 接收事件?

转载 作者:行者123 更新时间:2023-12-04 04:57:19 27 4
gpt4 key购买 nike

我的(高度简化的)代码如下所示:

// objc
self.currentSwipeUpView = [[RCTRootView alloc]
initWithBridge:_bridge moduleName:@"PhotoSwipeUpView"
initialProperties:nil
];
// elsewhere...
[self.currentSwipeUpView removeFromSuperview];
self.currentSwipeUpView = nil;

// js
function PhotoSwipedUpView() {
return <TextInput style={{flex: 1}} onChangeText={console.warn} />
}
AppRegistry.registerComponent('PhotoSwipeUpView', () => PhotoSwipeUpView)
self.currentSwipeUpView从其父 View 中删除并取消引用。发生这种情况时,JS 线程是否有可能收不到待处理的 onChangeText 事件?会不会导致 console.warn与新文本在一起?

我正在想象这样一种情况,在 RCTRootView 从其 super View 中删除并取消引用后,该事件将被发送到 JS 线程。

此外,我很好奇是否可以在从 JS 端从其父 View 中删除 RCTRootView 时收到通知。

我正在使用 ARC 并且我没有持有对 self.currentSwipeUpView 的任何其他引用.

编辑:我有两个 RCTRootViews。只有其中一个将被卸载,另一个将在应用程序的整个状态中持续存在。它们使用相同的桥接器,因此使用相同的包和 JS 环境。

最佳答案

加载/卸载 JS 包

您加载的 js 包与根 View 相关联,并且除该 View 外不持久。
从其父 View 中删除根 View 后,捆绑包也将被卸载。如果根 View 被删除和取消引用,文本更改监听器也应该被删除并且不应触发。

捆绑包中的 JSX 用于最终设置原生元素及其监听器。 JSX 基本上就是脚本。带有 RN 的 JSX TextInput基本上导致本地 UITextField .如果 JSX 指定了一个监听器,则用于文本更改的 native 监听器将添加到 native 元素实例中。

即使您加载了两个根 View ,它们也会相互独立运行。如果卸载了一个根 View ,则与屏幕上的 TextInput 关联的监听器不应再接收事件。您的第二个根 View 应该不受影响,因为它会为 TextInput 设置单独的监听器。

事件/时间问题

我认为完美时机的可能性很小,并且取决于调用 removeFromSuperview 的位置,js 可以在 View 完全删除和取消引用之前接收事件,但是如果这有可能影响您的应用程序的功能,我建议使用另一种模式与您的数据进行交互并删除屏幕。

可能的解决方案

在不知道您要做什么的情况下很难说,但是例如,您可以使用 RCTEventEmitter 发布关闭 React Native View 的通知。/NativeEventEmitter ,然后让 React Native 屏幕使用 native 函数关闭自身,该函数只是将其从 super View 中删除。这种类型的模式也可以回答您的第二个问题(在某种意义上),因为您在 RN 屏幕应该关闭之前有效地告诉它,允许它在被删除之前采取任何必要的操作。

关于react-native - JS Root View 从其父 View 中删除后是否总是从 native 接收事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51275112/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com