javascript - 使用 MST 的 React Navigation 5 身份验证流程,而不是“切换”
问题描述
所以,我刚刚将一个ignite-bowser项目升级到他们的5.0 模板,其中包括 React Navigation 5,这需要将使用SwitchNavigator在“Auth”和“App”StackNavigators 之间切换的传统推荐方法更改为新的声明式身份验证流程方法,使 SwitchNavigator 变得多余。
仅供参考,Ignite Bowser 项目本质上是 React Native 模板应用程序,由
React Native
React Navigation
MobX State Tree
TypeScript
Reactotron
And more!
true
所以这一切看起来很简单,但是当使用存储在其中一个应用商店中的布尔值并在身份验证方法中调用的操作中设置为时,我无法让实际的导航器进行切换。
根据服务器日志和 Reactotron 提要,身份验证工作正常。之后重新加载应用程序会呈现应用程序导航器,但会话实际上无效,因为内存已被清除。所有后续请求均失败,但应用程序不会切换到 Auth 导航器。
以下是相关的代码片段:
根导航器.tsx
const RootStack = () => {
const { pbidStore } = useStores()
return (
<Stack.Navigator
screenOptions={{
headerShown: false,
gestureEnabled: true,
stackPresentation: "modal",
}}
>
{pbidStore.isAuthenticated ? (
<Stack.Screen
name="pbidStack"
component={PbidNavigator}
options={{
headerShown: false,
}}
/>
) : (
<Stack.Screen
name="authStack"
component={AuthNavigator}
options={{
headerShown: false,
}}
/>
)}
</Stack.Navigator>
/**
* PbidStore Model
*/
export const PbidStoreModel = types.model("PbidStore").props({
....
isAuthenticated: types.optional(types.boolean, false),
})
.actions(self => ({
setStatus(value?: "idle" | "pending" | "done" | "error") {
self.status = value
},
setAuthToken(token: string) {
self.environment.pbidApi.setAuthToken(token)
},
setAuthenticated(value: boolean) {
self.isAuthenticated = value
},
...
}))
.actions(self => ({
authenticate: flow(function*(email: string, password: string, remember: boolean) {
self.setStatus("pending")
try {
const result = yield self.environment.pbidApi.authenticate(email, password)
if (result.kind === "ok") {
self.setAuthToken(result.token)
self.setStatus("done")
self.setAuthenticated(true)
self.loadUser()
if(remember)
yield self.storeCredentials(email, password)
} else {
self.setStatus("error")
self.setAuthenticated(false)
}
} catch {
self.setStatus("error")
self.setAuthenticated(false)
}
}),
...
解决方案
在我写出这个问题并开始选择 SO 标签并不得不决定使用mobx-react
vsmobx-react-lite
或两者之后,我想起了我在上次升级期间遇到的问题,在这两者之间切换,以及使用inject
and observer
.
所以我意识到也许我的导航器需要被观察到......
在下面导入mobx-react-lite
和包装 RootStack 为我修复了所有问题。
const RootStack = observer(() => {
希望这有助于避免其他人的头痛。
总而言之,我很高兴react-native
Hooks 和 . 的所有这些最近发生的变化FunctionalComponents
,以及它对关联库和最终我的代码库所做的事情,但是哇,不得不不断学习新的 API 和重新构建我的项目很累在他们完成之前!
推荐阅读
- scala - 根据条件复用 Akka 源/流
- jsonschema - oneOf 嵌套在数组中
- php - 如何检查令牌是否未过期?
- python - Gitbash 在命令参数中将前缀附加到绝对 posix 路径
- json - 在条件下添加到 JSON ($payload={})
- c - 即使连接被对等套接字终止,选择也会返回成功
- python - NumPy 的新手,如何对 ndarray 进行排序(不仅仅是整数)?
- kubernetes - 这两种类型的集群 api 端点之间有什么区别?
- javascript - 从 Webpack 加载器中获取原始文件路径
- c# - 错误非静态字段方法或属性“System.Windows.Forms.Control.Width.get”需要对象引用