React native 如何通过堆栈导航将数据传递到本机选项卡上的特定屏幕?

React native 如何通过堆栈导航将数据传递到本机选项卡上的特定屏幕?,react-native,React Native,我正在react native中创建一个底部选项卡,它将有两个屏幕Home和News。 但首先,用户需要登录,用户数据将从登录屏幕传递到主屏幕。如何传递这些数据。利用 navigation.navigate('Home', {Name: Name}); 如果我只使用两个屏幕(在堆栈中登录和主屏幕),我可以成功地在主屏幕中检索数据。但是,当我更改为导航到选项卡(包括主页和新闻)时,它无法处理错误“Undefined不是对象”(评估“route.params.Name”)。 你们能告诉我我错过了哪

我正在react native中创建一个底部选项卡,它将有两个屏幕Home和News。 但首先,用户需要登录,用户数据将从登录屏幕传递到主屏幕。如何传递这些数据。利用

navigation.navigate('Home', {Name: Name});
如果我只使用两个屏幕(在堆栈中登录和主屏幕),我可以成功地在主屏幕中检索数据。但是,当我更改为导航到选项卡(包括主页和新闻)时,它无法处理错误“Undefined不是对象”(评估“route.params.Name”)。 你们能告诉我我错过了哪个部分吗

下面是app.js代码

import { StatusBar } from 'expo-status-bar';
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import HomeScreen from './homescreen';
import NewsScreen from './newsscreen';
import LoginScreen from './loginscreen';
import { NavigationContainer } from '@react-navigation/native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { createStackNavigator } from '@react-navigation/stack';

const Tab = createBottomTabNavigator();
function MyTabs() {
  return (
    <Tab.Navigator>
      <Tab.Screen name="Home" component={HomeScreen} />
      <Tab.Screen name="News" component={NewsScreen} />
    </Tab.Navigator>
  );
}

const LoginStack = createStackNavigator();
function App() {
    return (
      <NavigationContainer>
        <LoginStack.Navigator screenOptions={{headerShown: false}}
        initialRouteName="Login">
          <LoginStack.Screen name="Login"component={LoginScreen}/>
          <LoginStack.Screen name="MyTabs" component={MyTabs} />
        </LoginStack.Navigator>
      </NavigationContainer>
    );
}
export default App;

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});

从“世博会状态栏”导入{StatusBar};
从“React”导入React;
从“react native”导入{样式表、文本、视图};
从“./主屏幕”导入主屏幕;
从“./新闻屏幕”导入新闻屏幕;
从“/LoginScreen”导入LoginScreen;
从'@react-navigation/native'导入{NavigationContainer};
从“@react navigation/bottom tabs”导入{createBottomTabNavigator};
从'@react navigation/stack'导入{createStackNavigator};
const Tab=createBottomTabNavigator();
函数MyTabs(){
返回(
);
}
const LoginStack=createStackNavigator();
函数App(){
返回(
);
}
导出默认应用程序;
const styles=StyleSheet.create({
容器:{
弹性:1,
背景颜色:“#fff”,
对齐项目:“居中”,
为内容辩护:“中心”,
},
});
以下是主屏幕代码:

import { StatusBar } from 'expo-status-bar';
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';

export default function HomeScreen({route, navigation}) {
    var Name = route.params.Name;
    
    return (
    <View style={styles.container}>
      <Text>{Name}</Text>
      <StatusBar style="auto" />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});

从“世博会状态栏”导入{StatusBar};
从“React”导入React;
从“react native”导入{样式表、文本、视图};
导出默认功能主屏幕({路由,导航}){
var Name=route.params.Name;
返回(
{Name}
);
}
const styles=StyleSheet.create({
容器:{
弹性:1,
背景颜色:“#fff”,
对齐项目:“居中”,
为内容辩护:“中心”,
},
});
最后是登录代码:

import { StatusBar } from 'expo-status-bar';
import React from 'react';
import { StyleSheet, Text, View, TouchableOpacity } from 'react-native';

export default function LoginScreen({navigation}) {
    const Name = 'Boy';
    const login = () => {
         navigation.navigate('MyTabs', {Name: 'Boy'});}

  return (
    <View style={styles.container}>
      <Text>LoginScreen</Text>
      <TouchableOpacity 
                    onPress={login}
                    ><Text
                        >LOGIN</Text>
                    </TouchableOpacity>
      <StatusBar style="auto" />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
})

从“世博会状态栏”导入{StatusBar};
从“React”导入React;
从“react native”导入{样式表、文本、视图、TouchableOpacity};
导出默认函数LoginScreen({navigation}){
const Name=‘Boy’;
常量登录=()=>{
导航('MyTabs',{Name:'Boy'});}
返回(
登录屏幕
登录
);
}
const styles=StyleSheet.create({
容器:{
弹性:1,
背景颜色:“#fff”,
对齐项目:“居中”,
为内容辩护:“中心”,
},
})

我正在尝试学习如何将数据从一个屏幕传递到另一个屏幕,屏幕位于选项卡堆栈中。我希望你们能够理解这个问题,并向我提供您的意见和解决方案。谢谢。

输出:

它只需要在
MyTabs
组件中做一点修改:

function MyTabs({ navigation, route }) {
  const { name } = route.params;
  console.log(name);
  return (
    <Tab.Navigator>
      <Tab.Screen
        name="Home"
        component={() => <HomeScreen name={route.params.name} />}
      />
      <Tab.Screen name="News" component={NewsScreen} />
    </Tab.Navigator>
  );
}
功能MyTabs({导航,路由}){
const{name}=route.params;
console.log(名称);
返回(
}
/>
);
}
以下是工作解决方案:

App.js

import*as React from'React';
从'@react-navigation/native'导入{NavigationContainer};
从'@react navigation/stack'导入{createStackNavigator};
从“@react navigation/bottom tabs”导入{createBottomTabNavigator};
从“react native”导入{Text,View,StyleSheet};
从“expo常量”导入常量;
从“./home”导入主屏幕;
从“./newscreen”导入新闻屏幕;
从“/login”导入登录筛选;
//可以从本地文件导入
const Tab=createBottomTabNavigator();
函数MyTabs({导航,路由}){
const{name}=route.params;
console.log(名称);
返回(
}
/>
);
}
const LoginStack=createStackNavigator();
函数App(){
返回(
);
}
导出默认应用程序;
登录筛选

从'react native'导入{文本、视图、样式表、TouchableOpacity};
从“React”导入React;
导出默认函数LoginScreen({navigation}){
const Name='登录屏幕的名称';
常量登录=()=>{
控制台日志(“hi”);
navigation.navigate('MyTabs',{name:name});
}
返回(
登录
);
}
Home.js

从'react native'导入{Text,View,StyleSheet};
从“React”导入React;
导出默认功能主屏幕({路线、导航、名称}){
console.log(“***”,名称)
返回(
{name}
);
}

工作示例。

输出:

它只需要在
MyTabs
组件中做一点修改:

function MyTabs({ navigation, route }) {
  const { name } = route.params;
  console.log(name);
  return (
    <Tab.Navigator>
      <Tab.Screen
        name="Home"
        component={() => <HomeScreen name={route.params.name} />}
      />
      <Tab.Screen name="News" component={NewsScreen} />
    </Tab.Navigator>
  );
}
功能MyTabs({导航,路由}){
const{name}=route.params;
console.log(名称);
返回(
}
/>
);
}
以下是工作解决方案:

App.js

import*as React from'React';
从'@react-navigation/native'导入{NavigationContainer};
从'@react navigation/stack'导入{createStackNavigator};
从“@react navigation/bottom tabs”导入{createBottomTabNavigator};
从“react native”导入{Text,View,StyleSheet};
从“expo常量”导入常量;
从“./home”导入主屏幕;
从“./newscreen”导入新闻屏幕;
从“/login”导入登录筛选;
//可以从本地文件导入
const Tab=createBottomTabNavigator();
函数MyTabs({导航,路由}){
const{name}=route.params;
console.log(名称);
返回(
}
/>
);
}
const LoginStack=createStackNavigator();
函数App(){
返回(
);
}
导出默认应用程序;
登录筛选

import{文本、视图、样式表、Touchabl