Skip to content

Commit a62a685

Browse files
makovkastarfacebook-github-bot
authored andcommitted
Add setNativeSelectedPosition command to ReactPickerManager
Summary: Fabric doesn't support setNativeProps, so we have to use commands instead to set the value of the native component. Changelog: [Android] [Added] - Add setNativeSelectedPosition command to ReactPickerManager Reviewed By: mdvacca Differential Revision: D18007791 fbshipit-source-id: dfa26792205189a336ab43b1c51f43f8f57c8e72
1 parent 60e91fa commit a62a685

File tree

4 files changed

+58
-8
lines changed

4 files changed

+58
-8
lines changed

Libraries/Components/Picker/AndroidDialogPickerNativeComponent.js

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010

1111
'use strict';
1212

13+
import * as React from 'react';
14+
15+
import codegenNativeCommands from 'react-native/Libraries/Utilities/codegenNativeCommands';
1316
import {requireNativeComponent} from 'react-native';
1417

1518
import type {
@@ -46,8 +49,19 @@ type NativeProps = $ReadOnly<{|
4649
onSelect?: DirectEventHandler<PickerItemSelectEvent>,
4750
|}>;
4851

49-
const AndroidDialogPickerNativeComponent: HostComponent<NativeProps> = requireNativeComponent<NativeProps>(
50-
'AndroidDialogPicker',
51-
);
52+
type NativeType = HostComponent<NativeProps>;
53+
54+
interface NativeCommands {
55+
+setNativeSelectedPosition: (
56+
viewRef: React.ElementRef<NativeType>,
57+
index: number,
58+
) => void;
59+
}
5260

53-
module.exports = AndroidDialogPickerNativeComponent;
61+
export const Commands: NativeCommands = codegenNativeCommands<NativeCommands>({
62+
supportedCommands: ['setNativeSelectedPosition'],
63+
});
64+
65+
export default (requireNativeComponent<NativeProps>(
66+
'AndroidDialogPicker',
67+
): NativeType);

Libraries/Components/Picker/AndroidDropdownPickerNativeComponent.js

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010

1111
'use strict';
1212

13+
import * as React from 'react';
14+
15+
import codegenNativeCommands from 'react-native/Libraries/Utilities/codegenNativeCommands';
1316
import {requireNativeComponent} from 'react-native';
1417

1518
import type {
@@ -46,8 +49,19 @@ type NativeProps = $ReadOnly<{|
4649
onSelect?: DirectEventHandler<PickerItemSelectEvent>,
4750
|}>;
4851

49-
const AndroidDropdownPickerNativeComponent: HostComponent<NativeProps> = requireNativeComponent<NativeProps>(
50-
'AndroidDropdownPicker',
51-
);
52+
type NativeType = HostComponent<NativeProps>;
53+
54+
interface NativeCommands {
55+
+setNativeSelectedPosition: (
56+
viewRef: React.ElementRef<NativeType>,
57+
index: number,
58+
) => void;
59+
}
5260

53-
module.exports = AndroidDropdownPickerNativeComponent;
61+
export const Commands: NativeCommands = codegenNativeCommands<NativeCommands>({
62+
supportedCommands: ['setNativeSelectedPosition'],
63+
});
64+
65+
export default (requireNativeComponent<NativeProps>(
66+
'AndroidDropdownPicker',
67+
): NativeType);

ReactAndroid/src/main/java/com/facebook/react/views/picker/ReactPicker.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,15 @@ public OnSelectListener getOnSelectListener() {
123123
mStagedSelection = selection;
124124
}
125125

126+
/** Will set the "selection" value immediately as opposed to {@link #setStagedSelection(int)} */
127+
/* package */ void setImmediateSelection(int selection) {
128+
if (selection != getSelectedItemPosition()) {
129+
setOnItemSelectedListener(null);
130+
setSelection(selection, false);
131+
setOnItemSelectedListener(mItemSelectedListener);
132+
}
133+
}
134+
126135
/* package */ void setStagedPrimaryTextColor(@Nullable Integer primaryColor) {
127136
mStagedPrimaryTextColor = primaryColor;
128137
}

ReactAndroid/src/main/java/com/facebook/react/views/picker/ReactPickerManager.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package com.facebook.react.views.picker;
99

1010
import android.widget.Spinner;
11+
import androidx.annotation.NonNull;
1112
import androidx.annotation.Nullable;
1213
import com.facebook.react.bridge.ReadableArray;
1314
import com.facebook.react.uimanager.SimpleViewManager;
@@ -66,6 +67,18 @@ protected void addEventEmitters(final ThemedReactContext reactContext, final Rea
6667
picker, reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher()));
6768
}
6869

70+
@Override
71+
public void receiveCommand(
72+
@NonNull ReactPicker view, String commandId, @Nullable ReadableArray args) {
73+
switch (commandId) {
74+
case "setNativeSelectedPosition":
75+
if (args != null) {
76+
view.setImmediateSelection(args.getInt(0));
77+
break;
78+
}
79+
}
80+
}
81+
6982
private static class PickerEventEmitter implements ReactPicker.OnSelectListener {
7083

7184
private final ReactPicker mReactPicker;

0 commit comments

Comments
 (0)