如何在React Native formSheet模式内创建一个嵌入式Stack导航器?

问题描述 投票:1回答:1

像这样。

enter image description here

我正在运行 react-navigation v4.

react-native react-navigation
1个回答
1
投票

首先,你必须按照教程来设置一个 react-navigation modal,这个modal有一个跳转动画,看起来不像原生的 formSheet。你必须设置一个堆栈导航器,你的根导航器是一个子节点,模态是另一个子节点。

enter image description here

而且它是可伸缩的,因为你可以有多个模态作为子代。

这方面的代码如下。

const RootNavigator = createStackNavigator(
  {
    index: { screen: AppNavigator },
    [NC.SCREEN_ROOM_INFO]: { screen: RoomInfoNavigator },
    [NC.SCREEN_CHAT_CREATE]: { screen: RoomCreateNavigator },
    [NC.SCREEN_CHAT_SEARCH]: { screen: ChatSearchNavigator },
    [NC.SCREEN_CHAT_GIF_PICKER]: { screen: GifPickerNavigator }
  },
  {
    mode: 'modal',
    headerMode: 'none',
    transitionConfig: () => ({
      transitionSpec: {
        duration: 0
      }
    }),
    transparentCard: true
  }
)

然后你需要实现这些,从我的例子来看,4个导航器将被显示为模态,就像这样。

// Here you'll specify the screens you'll navigate in this modal, starting from index.
const RoomInfoStack = createStackNavigator({
  index: { screen: NavigableRoomInfo },
  [NC.SCREEN_ROOM_ROSTER]: { screen: NavigableRoomRoster },
  [NC.SCREEN_ROOM_NOTIFICATION_PREFERENCES]: { screen: NavigableRoomNotificationPreferences },
  [NC.SCREEN_ROOM_EDIT]: { screen: NavigableRoomEdit }
})

type NavigationComponent<T = any> = {
  navigation?: NavigationScreenProp<NavigationState, T>
}

type Props = NavigationComponent

// THIS code is from the react-navigation tutorial on how to make a react-navigation modal:
// https://reactnavigation.org/docs/4.x/custom-navigators/#extending-navigators

class RoomInfoNavigator extends React.Component<Props> {
  static router = {
    ...RoomInfoStack.router,
    getStateForAction: (action, lastState) => {
      // check for custom actions and return a different navigation state.
      return RoomInfoStack.router.getStateForAction(action, lastState)
    }
  }

  constructor(props) {
    super(props)
    this.onClose = this.onClose.bind(this)
  }

  onClose() {
    this.props.navigation?.goBack()
  }

// And here is the trick, you'll render an always open RN formSheet
// and link its dismiss callbacks to the goBack action in react-navigation
// and render your stack as its children, redirecting the navigator var to it in props.

  render() {
    return (
      <Modal
        visible={true}
        animationType={'slide'}
        supportedOrientations={['portrait', 'landscape']}
        presentationStyle={'formSheet'}
        onRequestClose={() => this.onClose()}
        onDismiss={() => this.onClose()}
      >
        <RoomInfoStack {...this.props} />
      </Modal>
    )
  }
}

export { RoomInfoNavigator }

这个输出就是我们的根栈之前导入的东西。然后,你只需要渲染屏幕,我有一个模式,我做的是提取导航参数到道具,以防这个屏幕显示时没有导航。

const NavigableRoomInfo = (props: NavigationComponent<RoomInfoProps>) => {
  const roomInfo = props.navigation!.state!.params!.roomInfo
  const roomInfoFromStore = useRoomFromStore(roomInfo.id)

  // Here I update the navigation params so the navigation bar also updates.

  useEffect(() => {
    props.navigation?.setParams({
      roomInfo: roomInfoFromStore
    })
  }, [roomInfoFromStore])

  // You can even specify a different Status bar color in case it's seen through modal view:

  return (
    <>
      <StatusBar barStyle="default" />
      <RoomInfo roomInfo={roomInfoFromStore} navigation={props.navigation} />
    </>
  )
}

源:https:/reactnavigation.orgdocs4.xmodal。

https:/reactnavigation.orgdocs4.xcustom-navigators#extending-navigators。

© www.soinside.com 2019 - 2024. All rights reserved.