繁体   English   中英

如何在 react-native expo 中深度链接到特定屏幕

[英]How to deep link to specific screen in react-native expo

我正在使用以下代码创建链接 URL:

Linking.makeUrl('lobby/', {
  roomId: params.roomId
})

输出以下内容: exp://192.168.0.31:19000/--/lobby/?roomId=1585512451

这在本地工作正常,但似乎只能打开我的应用程序的主页。

我已经在我的 app.js 中定义了屏幕

const Stack = createStackNavigator();

function App() {  
  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen 
          name="Home" 
          component={HomeScreen} 
        />
        <Stack.Screen 
          name="Lobby"
          component={LobbyScreen} 
        />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

我是否需要使用某种偶数侦听器重定向到大厅屏幕,还是应该将传入makeUrl的路径映射到屏幕?

是的,您需要监听 url 事件。 请参阅 Expo 文档中有关深层链接的部分。 https://docs.expo.io/versions/latest/workflow/linking/#handling-links-into-your-app

请注意,博览会配置中还需要其他配置选项,以便在不同设备上工作。 有关这方面的所有说明,请参阅他们的文档。

引用自提供的链接

Handling links into your app
There are two ways to handle URLs that open your app.

1. If the app is already open, the app is foregrounded and a Linking event is fired
You can handle these events with Linking.addEventListener('url', callback).

2. If the app is not already open, it is opened and the url is passed in as the initialURL
You can handle these events with Linking.getInitialURL -- it returns a Promise that resolves to the url, if there is one.

从他们的示例代码:

let redirectUrl = Linking.makeUrl('path/into/app', { hello: 'world', goodbye: 'now' });

然后您需要使用事件处理程序处理 URL

_handleUrl = url => {
  this.setState({ url });
  let { path, queryParams } = Linking.parse(url);
  alert(`Linked to app with path: ${path} and data: ${JSON.stringify(queryParams)}`);
};

由于打开应用程序并单击链接与关闭应用程序时的行为不同,因此您需要 2 个不同的入口点来处理链接。

HomeScreen组件中,您可以放置​​如下内容:

    componentDidMount() {
        // handle an initial url on app opening
        Linking.getInitialURL().then(urlRedirect)
    }

在你的应用程序的某个地方,也许在app.js为应用程序内部的新 url 放置一个处理程序。

function urlRedirect(url) {
    if(!url) return;
    // parse and redirect to new url
    let { path, queryParams } = Linking.parse(url);
    console.log(`Linked to app with path: ${path} and data: ${JSON.stringify(queryParams)}`);
    this.navigation.replace(path, queryParams);
}

// listen for new url events coming from Expo
Linking.addEventListener('url', event => {
    urlRedirect(event.url);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM