android - 在两个堆栈之间传递参数 - React Native

标签 android react-native mobile-development

我的应用程序应该有一个登录屏幕,使用 Google,所以当登录后它会转到菜单屏幕。

为了在验证后进入菜单屏幕后,按下后​​退按钮时不返回登录屏幕。 我已经将堆栈分开,一个用于登录,一个用于其他屏幕

在 App.js 中:

const AuthStack = createStackNavigator({
  LoginSplashScreen: LoginSplashScreen 
});
const AppStack = createStackNavigator({ 
  MenuScreen:MenuScreen,
  DetailsScreen: DetailsScreen,
  PhotoScreen: PhotoScreen,
  DocumentScreen: DocumentScreen,
  AudioScreen: AudioScreen,
  ScheduleScreen: ScheduleScreen,
  SettingsScreen: SettingsScreen,
  FilesScreen: FilesScreen,
  GalleryScreen: GalleryScreen
   });


const Root= createAppContainer(createSwitchNavigator(
  {
    AuthStack:AuthStack,
    AppStack:AppStack
  },
  {
    initialRouteName: 'AuthStack',
  }
));

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

所以在 LoginSplashScreen 身份验证后,我使用此代码进行导航:

    this.props.navigation.navigate('AppStack', {
      signedIn: true,
      name: result.user.name,
      photoUrl: result.user.photoUrl
    });

导航效果很好,但是参数 'name','signedIn','photoUrl' 禁止通过 事实上,当警报

    Alert.alert('',JSON.stringify(this.props.navigation.state.params))

在菜单屏幕上(第二个堆栈),它是空的

我做错了什么?

为什么我的参数没有通过?因为我可能需要另一个抽屉导航。

有没有办法为应用程序中的所有屏幕设置全局参数?

是否有更好的方法来避免在菜单屏幕上按回键而无法进入登录屏幕?

编辑:

我设法通过设置全局参数解决了这个特定问题:

global.param= result.param;

但是,我仍然需要一个在 2 个分离的堆栈之间传递的答案

最佳答案

通过创建两个单独的堆栈,您已经分离了参数范围,您正在尝试做的是:使用不同的导航范围将参数发送到完全不同的导航范围,该导航范围实际上完全不知道前一个虽然活着在一个共同的 parent 中。

当您使用 LoginSplashScreen 中的 this.props.navigation 时,您实际上处于 AuthStack 的沙盒导航范围内,该范围仅限于它自己的导航器路线。现在,当您在单个导航器中将两个堆栈绑定(bind)为 SwitchNavigator 的 Routes 时,您将进入父导航器的范围,该范围提供其自己的导航 Prop ,因此如果您使用 navigation switch navigator 的 prop,那么你会在你的 AppStack 中获得参数,但是因为。

我建议的是以下三种正确执行此操作的方法:

  1. 使用登录屏幕作为 SwitchNavigator 的直接路由,从而删除用于登录的无用堆栈导航器,它正在分离路由。

代码应该是这样的:

const Root= createAppContainer(createSwitchNavigator({
   LoginSplashScreen: LoginSplashScreen 
   AppStack:AppStack
}, {
initialRouteName: 'LoginSplashScreen',
}));
  1. 使用 redux 将数据存储在一个通常可访问的存储中,并在其他答案中描述的不同组件上使用它,但这不是主要使用 redux 的原因。

  2. 在切换导航器中使用新组件代替 AppStack,同时将 LoginSplashScreen 作为 SwitchNavigator 的直接路由之一并在内部呈现 AppStack新组件并将收到的 params 作为 AppStack 中的 screenProps 传递,然后简单地在堆栈路由中使用 screenProps。

代码应该是这样的:

 const Root= createAppContainer(createSwitchNavigator({
   LoginSplashScreen: LoginSplashScreen, 
   MyMediatorScreen: MyFancyComponent
}, {
initialRouteName: 'AuthStack',
}));

例如。 FancyComponent 将如下所示:

class MyFancyComponent extends React.Component{
   constructor (props){
      super (props); 
   }

   render () {
     const {params} = this.props.navigation.state;
     return (
        <AppStack screenProps = {params} />
     )
   }
}

关于android - 在两个堆栈之间传递参数 - React Native,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53971138/

相关文章:

android - 将值(value)从一个 Activity 传递到另一个 Activity 的另一种方法

java - 获取资源编号 0x00000000 的值时没有包标识符

react-native - React Native – FlatList 滚动到底部,键盘向上

java - 如果我不想粘贴相同的代码,如何在不同的 Activity 中设置相同的工具栏?

database - 揭露假号码/防止假注册/假短信

android - 从可穿戴设备到手机的数据同步

android - 在应用程序中存储和保护私有(private) API key 的最佳实践

react-native - 如何从react-navigation标题中调用Screen/Component类的方法

firebase - react-native-fetch-blob 正在阻止 React Native 应用程序中的 Firebase 调用

flutter - 如何在文本字段上制作干净的非均匀侧边框