android - 带有 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 用户使用深层链接打开应用程序时,我应该怎么做才能让应用程序导航到内容页面,而该应用程序之前已被终止?
我还想保留当前的深层链接行为,当应用程序在后台时,深层链接可以工作。
这里也解释了这个问题,但没有一个建议的解决方案对我有用。
解决方案
您的导航器具有动态路由切换,因此您需要先处理所有切换逻辑,然后在应用程序准备好后渲染导航器。当前,您的导航器会忽略initialState
和动态切换覆盖呈现的路线。
尝试将加载状态移到导航器之外,或确定应用程序已准备好在effect
.
推荐阅读
- wxpython - 拖动期间无法使用 wxPython 正确绘制矩形
- c++ - 将 LPVOID 更改为 const u8*
- paypal - 如何为自定义电子邮件地址生成 PayPal 捐赠按钮?
- perl - Array::Heap 使用自定义比较函数
- c++ - 请帮我看看为什么我会出错?
- kubernetes - openshift 构建配置触发器
- javascript - 在我的程序中有一个我无法检测到的错误
- r - 如何使用网格的功能将 y 轴标题放在图形的左上角?
- python - 使用 mpegtsmux Gtsreamer 混合视频 H264 和数据
- java - 如何创建一个方法来比较不同实例对象的属性值与java