首页 > 解决方案 > 带有 React Navigation 5 的 Android 深度链接

问题描述

我正在尝试将 React Navigation 5 中的深度链接实现到我的 React Native 0.61 项目中,该项目是通过 react-native init 创建的。

当应用程序在后台时,深层链接有效。在我的 Android 设备上,我可以单击https://myproject.com/content/5,应用程序会正确导航到内容部分并显示 id 为 5 的内容。

但是,如果我终止应用程序(或在不打开它的情况下安装它)并单击相同的链接,我将被带到主页而不是导航到相应的内容页面。

我的 AndroidManifest.xml 中的活动:

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:launchMode="singleTask">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="http" />
        <data android:scheme="https" />
        <data android:host="myproject.com"/>
    </intent-filter>
</activity>

App.js 的肉和土豆:

const config = {
  Content: {
    path: "content/:id",
    parse: {
      id: Number
    }
  }
};


const App = () => {
  const {state} = useContext(Context);
  const ref = React.useRef();

  const { getInitialState } = useLinking(ref, {
    prefixes: ['http://myproject.com'],
    config
  });

  const [isReady, setIsReady] = React.useState(false);
  const [initialState, setInitialState] = React.useState();

  useEffect(() => {
    Promise.race([
      getInitialState(),
      new Promise(resolve => setTimeout(resolve, 150)),
    ])
    .catch(e => {
      console.error(e);
    })
    .then(state => {
      if (state !== undefined) {
      setInitialState(state);
    }

    setIsReady(true);
    });
  }, [getInitialState]);

  return (
    <NavigationContainer initialState={initialState} ref={ref} >
      {state.isLoading || !isReady ? 
      (
        <Stack.Navigator screenOptions={{headerShown: false}}>
          <Stack.Screen name="Loading" component={LoadingScreen} />
        </Stack.Navigator>
      )
      :
      <MainStack />
      }
    </NavigationContainer>
  );
};

当 Android 用户使用深层链接打开应用程序时,我应该怎么做才能让应用程序导航到内容页面,而该应用程序之前已被终止?

我还想保留当前的深层链接行为,当应用程序在后台时,深层链接可以工作。

这里也解释了这个问题,但没有一个建议的解决方案对我有用。

标签: androidreact-nativereact-navigationdeep-linking

解决方案


您的导航器具有动态路由切换,因此您需要先处理所有切换逻辑,然后在应用程序准备好后渲染导航器。当前,您的导航器会忽略initialState和动态切换覆盖呈现的路线。

尝试将加载状态移到导航器之外,或确定应用程序已准备好在effect.


推荐阅读