嵌套反应导航深度链接与 expo react native

Nested react-navigation deep-linking with expo react native

我们正在尝试使用 Expo Linking 向我们的 Expo React 本机应用程序添加深层链接,该应用程序使用如下方式在应用程序中打开特定路径: myapp://home/items/order-details。但是,当尝试使用该深层链接时 url 我们只会被带到主屏幕。

但是,当我们使用 url: myapp://profile 时,它确实会打开个人资料屏幕而不是主屏幕。它似乎适用于顶级路线,但不适用于嵌套路线。有没有办法让深层链接 url 使用我们的导航直接进入订单详情屏幕?

我们的 App.js 看起来像这样:

import {createRootNavigator} from './router';

const RootNav = createRootNavigator();
const prefix = Expo.Linking.makeUrl('/');

export default class App extends React.Component {
    render() {
        return (
            <Root>
                <RootNav uriPrefix={prefix}/>
            </Root>
        )
    }

这是我们的router.js

export const MenuNav = createStackNavigator ({
    Menu: {screen: Menu, path: 'menu'},
    OrderDetails: {screen: OrderDetails, path: 'order-details'}
    }
);

export const UserCreate = createStackNavigator ({
    Profile: {screen: Profile}
});

export const Tabs = createBottomTabNavigator({
   'Home': {
        screen: Home,
        path: 'home-tab'
    },
    'Items': {
        screen: MenuNav,
        path: 'items'
    }
}, 
    {tabBarComponent: (props) => {
        return (
          <TabBar
            {...props}
          />
        );
      },
        tabBarPosition: 'bottom',
    },
);


export const createRootNavigator = () => {
  return createDrawerNavigator ({
    Home: {
        screen: Tabs,
        path: 'home'
    }, 
    Profiles: {
        screen: UserCreate,
        path: 'profile'
    },
});

因为导航器是如此嵌套,而不是在 App.js 上的 RootNav 中添加 uriPrefix,尝试将其添加到 tabBarComponent。因此,在您的 router.js 中,您应该将 uriPrefix = {prefix} 添加到 TabBar。此外,由于 order-details 嵌套在另一个堆栈中,因此可能需要为 OrderDetails 屏幕添加另一个堆栈,因为它已经是它自己的屏幕。 router.js 应该是这样的:

const prefix = Expo.Linking.makeUrl('/');
export const MenuNav = createStackNavigator ({
    Menu: {screen: Menu, path: 'menu'},
    OrderDetails: {screen: OrderDetails, path: 'order-details'}
    }
);

export const UserCreate = createStackNavigator ({
    Profile: {screen: Profile}
});

export const Tabs = createBottomTabNavigator({
   'Home': {
        screen: Home,
        path: 'home-tab'
    },
    'Items': {
        screen: MenuNav,
        path: 'items'
    }
}, 
    {tabBarComponent: (props) => {
        return (
          <TabBar
            {...props}
            uriPrefix={prefix}
          />
        );
      },
        tabBarPosition: 'bottom',
    },
);


export const createRootNavigator = () => {
  return createDrawerNavigator ({
    Home: {
        screen: Tabs,
        path: 'home'
    }, 
    Profiles: {
        screen: UserCreate,
        path: 'profile'
    },
    OrderDetails: {
        screen: OrderDetails,
        path: 'history/order/:orderId'
    }
});