Nud*_*dge 8 java android react-native rctbridge
我正在尝试创建一个fabric组件android,特别是我想使用onClickHandler按钮组件并react-native通过 传递回调到 side RCTModernEventEmitter。它工作正常,iOS但对于 android,RCTModernEventEmitter每次我单击时都会发出两次button
这是我的规格
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<{
text?: string;
}>;
interface NativeProps extends ViewProps {
text: string;
onClickHandler?: DirectEventHandler<Event>; ////Event name should start with on
}
export default codegenNativeComponent<NativeProps>(
'MyButtonView',
) as HostComponent<NativeProps>;
Run Code Online (Sandbox Code Playgroud)
On native side I have created following files
public class MyButtonViewManager extends SimpleViewManager<MyButtonView> {
public static final String NAME = "MyButtonView";
ReactApplicationContext mCallerContext;
public MyButtonViewManager(ReactApplicationContext reactContext) {
mCallerContext = reactContext;
}
@NonNull
@Override
public String getName() {
return NAME;
}
@NonNull
@Override
protected MyButtonView createViewInstance(@NonNull ThemedReactContext reactContext) {
return new MyButtonView(reactContext);
}
@ReactProp(name = "text")
public void setQrCodeText(MyButtonView view, String text) {
view.setText(text);
}
@Nullable
@Override
public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
return MapBuilder.of("topOnClickHandler",
MapBuilder.of("registrationName", "onClickHandler")
);
}
}
public class MyButtonClickEvent extends Event<MyButtonClickEvent> {
public MyButtonClickEvent(int viewId) {
super(viewId);
}
@Override
public String getEventName() {
return "topOnClickHandler";
}
// @Override
// public void dispatch(RCTEventEmitter rctEventEmitter) {
// super.dispatch(rctEventEmitter);
// rctEventEmitter.receiveEvent(getViewTag(), getEventName(), Arguments.createMap());
// }
@Override
public void dispatchModern(RCTModernEventEmitter rctEventEmitter) {
super.dispatchModern(rctEventEmitter);
rctEventEmitter.receiveEvent(-1,
getViewTag(),getEventName(),
Arguments.createMap()
);
}
@Nullable
@Override
protected WritableMap getEventData() {
WritableMap event = Arguments.createMap();
event.putString("message", "MyMessage");
return event;
}
}
public class MyButtonView extends androidx.appcompat.widget.AppCompatButton {
public MyButtonView(Context context) {
super(context);
configureViews();
}
private void configureViews(){
setBackgroundColor(Color.YELLOW);
setOnClickListener(view -> {
ReactContext reactContext = (ReactContext)getContext();
EventDispatcher eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(
reactContext ,getId()
);
eventDispatcher.dispatchEvent(new MyButtonClickEvent(getId()));
});
}
}
Run Code Online (Sandbox Code Playgroud)
On JS side
<MyButtonView
style={{height: 100, width: 100, margin: 20}}
onClickHandler={(value: any) => {
console.log('Hello ok bye', value.nativeEvent);
}}
text="Hello"
/>
Run Code Online (Sandbox Code Playgroud)
I get value in onClickHandler of MyButtonView twice even though I press the button once
Fullrepo is here https://github.com/PritishSawant/ReactNativeFabricEventListenerExample
Edit:
I have updated my code to 0.71.1 and you can find it here
| 归档时间: |
|
| 查看次数: |
566 次 |
| 最近记录: |