Zenn
Open4

Expo UI (@expo/ui) について

kazutoyo@TellerNovelkazutoyo@TellerNovel

SwiftUI/Jetpack Composeで作られた、完全にネイティブなUIコンポーネント群。
2025/03/14現在はアルファ版として登場した。
https://docs.expo.dev/versions/unversioned/sdk/ui/

@expo/ui パッケージとしてインストールが可能。

npx expo install @expo/ui

2025/03/14現在、次のUIコンポーネントが用意されている。(現在Androidには対応していないコンポーネントがありそう?🍎がiOSであるもの、🤖がAndroidで用意されているものとして確認)

  • Button 🍎 🤖
  • PickerView 🍎 🤖
  • SectionView 🍎
  • ContextMenu 🍎 🤖
  • ColorPickerView 🍎
  • DateTimePickerView 🍎 🤖
  • TextInputView 🍎
  • ProgressView 🍎 🤖
  • GuageView 🍎

https://github.com/expo/expo/blob/2a5a1f016d88af8cdc6b48db8eb26ae691b42e2b/packages/expo-ui/ios/ExpoUIModule.swift#L9-L19

https://github.com/expo/expo/blob/main/packages/expo-ui/android/src/main/java/expo/modules/ui/ExpoUIModule.kt#L12-L42

kazutoyo@TellerNovelkazutoyo@TellerNovel

早速試してみようと思ったが、SDK 52でiOSのビルドしようとしたがエラー(Xcode 16.2.0)

❌  (node_modules/@expo/ui/ios/SwitchView.swift:16:55)

  14 | struct SwitchView: ExpoSwiftUI.View {
  15 |   @EnvironmentObject var props: SwitchProps
> 16 |   @EnvironmentObject var shadowNodeProxy: ExpoSwiftUI.ShadowNodeProxy
     |                                                       ^ 'ShadowNodeProxy' is not a member type of struct 'ExpoModulesCore.ExpoSwiftUI'
  17 |   @State var checked: Bool = false
  18 |
  19 |   var body: some View {

確かに ExpoSwiftUI.ShadowNodeProxy なんて定義されていない気がする… 🤔
https://github.com/expo/expo/blob/main/packages/expo-modules-core/ios/Core/Views/SwiftUI/ExpoSwiftUI.swift

kazutoyo@TellerNovelkazutoyo@TellerNovel

expoを53.0.0-canary、@expo/uiも1.0.0canaryを指定したら動いた

  "dependencies": {
    "@expo/ui": "^1.0.0-canary-20250320-7a205d3",
    "expo": "53.0.0-canary-20250320-7a205d3",
    "expo-status-bar": "~2.0.1",
    "react": "19.0.0",
    "react-native": "0.79.0-rc.2"
  }

ログインするとコメントできます