Fabric component: codegen drops optional state for component properties and in events properties
还没有人认领这个 Issue。
- 主要语言
- C++
- 星标
- 127k
- 派生
- 25.3k
- 平均合并
- 1 天 23 小时
- 30 天内合并 PR
- 4
描述
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
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 issue 中的 TypeScript 组件和事件规格开始,然后使用所链接 reproducer 的 reproducer/no-optionals 分支,在生成的 props.h 和 EventEmmiter.h 中复现输出。跟踪 codegen 对可选属性的处理,并将生成的 props 和事件与示例进行比较。当被省略的可选值仍保持可选,而不是在 bridge 的另一侧变成默认初始化的值时,即表示完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- cpp, react-native, typescript
- 领域
- mobile, tooling
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 冷清
- 描述清晰度
- 基本清楚
- 新手友好度
- 48/100