Fabric component: codegen drops optional state for component properties and in events properties
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- C++
- Star
- 127k
- Fork
- 25.3k
- Merge trung bình
- 1 ngày 23 giờ
- Pull request đã merge (30 ngày)
- 4
Mô tả
Description
When adding optional values to the specs for a Fabric component, these optionals are always bridged with a default value and as a result are always defined and no longer optional.
Example spec:
type Prop1 = Readonly<{
propContent: string;
propOptionalContent1?: string;
propOptionalContent2?: string;
}>;
type Prop2 = Readonly<{
propContent: string;
propOptionalContent1?: string;
propOptionalContent2?: string;
}>;
export type NativeEvent1 = Readonly<{
nativeEventContent: string;
nativeEventOptionalContent1?: string;
nativeEventOptionalContent2?: string;
}>;
export type NativeEvent2 = Readonly<{
nativeEventContent: string;
nativeEventOptionalContent1?: string;
nativeEventOptionalContent2?: string;
}>;
export interface NewArchViewProps extends ViewProps {
prop1: Prop1;
prop2: Prop2;
onNativeEvent1: DirectEventHandler<NativeEvent1>;
onNativeEvent2: DirectEventHandler<NativeEvent2>;
}
Codegen creates:
struct NewArchViewProp1Struct {
std::string propContent{};
std::string propOptionalContent1{};
std::string propOptionalContent2{};
};
struct NewArchViewProp2Struct {
std::string propContent{};
std::string propOptionalContent1{};
std::string propOptionalContent2{};
};
struct OnNativeEvent1 {
std::string nativeEventContent;
std::string nativeEventOptionalContent1;
std::string nativeEventOptionalContent2;
};
struct OnNativeEvent2 {
std::string nativeEventContent;
std::string nativeEventOptionalContent1;
std::string nativeEventOptionalContent2;
};
Every time an optional value is left out on 1 side of the bridge, the other side receives a default value (e.g optional string is filled in with empty string ""). Setting a default using WithDefault<> gives control over this default, but still does not respect the optional status of the properties.
As a result the old architecture versus the new architecture result in completely different objects being bridged. One has optional data where the other is always prop complete but with defaults.
Steps to reproduce
Add the above specs to a new arch enabled project and check the generated props.h and EventEmmiter.h for the generated code.
The linked reproducer has these in place.
React Native Version
0.76.7
Affected Platforms
Runtime - iOS
Areas
Codegen
Output of npx @react-native-community/cli info
System:
OS: macOS 15.0.1
CPU: (8) arm64 Apple M1 Pro
Memory: 298.75 MB / 32.00 GB
Shell:
version: "5.9"
path: /bin/zsh
Binaries:
Node:
version: 22.11.0
path: ~/.nvm/versions/node/v22.11.0/bin/node
Yarn:
version: 1.22.22
path: ~/.nvm/versions/node/v22.11.0/bin/yarn
npm:
version: 10.9.0
path: ~/.nvm/versions/node/v22.11.0/bin/npm
Watchman:
version: 2024.08.19.00
path: /opt/homebrew/bin/watchman
Managers:
CocoaPods:
version: 1.16.2
path: /opt/homebrew/bin/pod
SDKs:
iOS SDK:
Platforms:
- DriverKit 24.2
- iOS 18.2
- macOS 15.2
- tvOS 18.2
- visionOS 2.2
- watchOS 11.2
Android SDK: Not Found
IDEs:
Android Studio: 2024.1 AI-241.18034.62.2411.12169540
Xcode:
version: 16.2/16C5032a
path: /usr/bin/xcodebuild
Languages:
Java:
version: 17.0.14
path: /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/bin/javac
Ruby:
version: 3.3.5
path: /opt/homebrew/opt/ruby/bin/ruby
npmPackages:
"@react-native-community/cli":
installed: 15.0.1
wanted: 15.0.1
react:
installed: 18.3.1
wanted: 18.3.1
react-native:
installed: 0.76.5
wanted: 0.76.5
react-native-macos: Not Found
npmGlobalPackages:
"*react-native*": Not Found
Android:
hermesEnabled: true
newArchEnabled: true
iOS:
hermesEnabled: true
newArchEnabled: true
Stacktrace or Logs
Example logs from the reproducer (reproducer/no-optionals branch) showing empty strings being bridged instead of remaining optional:
'nativeEvent1 optionalContent1 received:', '76BF877F-B476-4DB6-B961-C0DDA76B91E1'
'nativeEvent1 optionalContent2 received:', '24E3266D-7451-40E4-8A38-B5931A9ACDD1'
'nativeEvent2 optionalContent1 received:', ''
'nativeEvent2 optionalContent2 received:', ''
propOptionalContent1: optional1
propOptionalContent2: optional2
propOptionalContent1:
propOptionalContent2:
Reproducer
https://github.com/wvanhaevre/NewArchReproducer/tree/reproducer/no-optionals
Screenshots and Videos
No response
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu với các đặc tả component và event bằng TypeScript từ issue, sau đó tái tạo output trong props.h và EventEmmiter.h được sinh ra bằng branch reproducer/no-optionals của reproducer được liên kết. Theo dõi cách codegen xử lý các thuộc tính tùy chọn và so sánh props cùng các event được sinh ra với ví dụ. Được xem là hoàn tất khi các giá trị tùy chọn bị bỏ qua vẫn là tùy chọn thay vì trở thành các giá trị được khởi tạo mặc định ở phía bên kia của bridge.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- cpp, react-native, typescript
- Lĩnh vực
- mobile, tooling
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Ít trao đổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 48/100