java - 如何在react native 的fabric 组件新架构中为android 和iOS 做事件处理?

标签 java android ios react-native objective-c++

我正在尝试创建一个 Fabric零件。我大部分时间都在使用它。我面临的唯一问题是我无法让点击监听器为 fabric 工作组件。

我创建了一个规范文件

import type {HostComponent, ViewProps} from 'react-native';
import type {DirectEventHandler} from 'react-native/Libraries/Types/CodegenTypes';
import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';

type Event = Readonly<{
  value: string;
}>;

interface NativeProps extends ViewProps {
  text: string;
   onClickHandler?: BubblingEventHandler<Event>; ////Event name should start with on
}

export default codegenNativeComponent<NativeProps>(
  'MyButtonView',
) as HostComponent<NativeProps>;

对于 android我的fabric组件如下所示

public class MyButtonView extends androidx.appcompat.widget.AppCompatButton {

    public MyButtonView(Context context) {
        super(context);
        configureViews();
    }

    private void configureViews(){
        setBackgroundColor(Color.YELLOW);
        setOnClickListener(view -> {
            onReceiveNativeEvent();
        });
    }

    public void onReceiveNativeEvent() {
        WritableMap event = Arguments.createMap();
        event.putString("message", "MyMessage");
        ReactContext reactContext = (ReactContext)getContext();
        reactContext.getJSModule(RCTModernEventEmitter.class)
                .receiveEvent(getId(),getId(),"onClickHandler",true,0,event,1);

    }
}

不确定要传递什么 first param as int , canCoalesceEvent , customCoalesceKeycategoryreceiveEvent

ViewManager我也添加了以下代码

@Nullable
@Override
public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
    Log.i("here55","999999");
    return MapBuilder.of("onClickHandler",
            MapBuilder.of("registrationName", "onClickHandler")
    );
}

对于 android我没有收到 callback来自 native androidjs侧面

我正在关注 https://reactnative.dev/docs/native-components-android但它适用于旧架构,我认为不适用于 fabric组件

iOS 相同https://reactnative.dev/docs/native-components-ios , 文档对新架构帮助不大

对于 iOS , 我创建了 headerobjective-c++文件

通常,如果我们想添加属性,我们会这样做

RCT_EXPORT_VIEW_PROPERTY(text, NSString)

不确定如何为事件处理程序做这件事

最佳答案

苹果

假设您发布的 native 规范是正确的(我不太熟悉 TypeScript + Codegen duo),当您在 ios/ 目录中运行 pod install 命令时,codegen 应该在 React-Codegen pod 中生成 EventEmitters cpp 文件(+ header)(您可以在下面看到如何在 XCode 中找到它)

link to the screenshot with Pods structure

然后您可以在 Objective-C++ 代码中使用这些类来发出事件:

if (_eventEmitter != nullptr) {
    std::dynamic_pointer_cast<const facebook::react::$$NAME OF YOUR EVENT EMITTER TYPE$$>(_eventEmitter)
        ->onEvent(facebook::react::$$NAME OF YOUR EVENT EMITTER TYPE::OnEvent{.value = $$VALUE$$});
}

请参阅下面的链接以了解它是如何在 react-native-screens 中完成的

  1. Native component spec in Flow
  2. Event emission in Obj-C++ code
  3. Event exposure in screen manager - 我不太确定这条线是否有必要,还没有测试过。

安卓

  1. 要触发代码生成,只需运行 native 构建即可。
  2. 将 native 事件类定义为 done here
  3. 在这里查看 how to dispatch event
  4. Export your event types

关于java - 如何在react native 的fabric 组件新架构中为android 和iOS 做事件处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72981626/

相关文章:

ios - GetDescriptor() 空值/128 位 UUID 描述符?

ios - NSPredicate OR 字符串和整数搜索

java - 使用 Java 7 Update 45,不再从 JNLP 标记 "Property"设置系统属性

java - 从父级 JPA 获取所有子级和子级

java - Android中SQLite的可变错误

尽管匹配但未找到 Java 命名的捕获组

android - A/libc : Fatal signal 11 (SIGSEGV), 代码 2 (SEGV_ACCERR),tid 22188 中的故障地址 0x708d31bd64

java - 从Firebase数据库获取数据时如何准确知道未能转换其值的属性

android - 通过将路径点传递到 GoogleMaps android 来创建电路路线

ios - 无法更改状态栏样式