React Navigation 5 嵌套屏幕无法返回主屏幕

Mar*_*ope 3 react-native react-navigation-v5

我无法找出嵌套导航器。我有一个带有这些按钮的bottomTabNavigator:

Home
Stations
  -> StationDetail (StationScreen)
Shows
  -> ShowDetail (ShowScreen)
Run Code Online (Sandbox Code Playgroud)

在我的主页选项卡上,我有与电台页面相同的电台的水平滚动。

问题:当我使用此代码从主页导航到电台详细信息页面以导航到嵌套导航器时,我无法导航回主/根 StationsScreen 选项卡

navigation.navigate('Stations', {
      screen: 'Station',
      station: props.station,
    });
Run Code Online (Sandbox Code Playgroud)

但是,如果我先导航到“电台”选项卡,然后返回主页,然后单击一个电台,它就会按预期工作。我该如何解决这个问题?我见过“重置”之类的东西,但我不确定该把它放在哪里。这是我的代码的简化摘录:

应用程序堆栈.js:

import React from 'react';
import {createBottomTabNavigator} from '@react-navigation/bottom-tabs';

import HomeStack from './HomeStack';
import StationStack from './StationStack';
import ShowStack from './ShowStack';

const Tab = createBottomTabNavigator();

const AppStack = () => {
  return (
    <Tab.Navigator>
      <Tab.Screen name="Home" component={HomeStack} />
      <Tab.Screen name="Stations" component={StationStack} />
      <Tab.Screen name="Shows" component={ShowStack} />
    </Tab.Navigator>
  );
};

export default AppStack;

Run Code Online (Sandbox Code Playgroud)

HomeStack.js

import React from 'react';
import {View} from 'react-native';
import {createStackNavigator} from '@react-navigation/stack';
import TopBarRight from '../components/TopBarRight';
import HomeScreen from '../screens/HomeScreen';
import StationScreen from '../screens/StationScreen';
import {useNavigation} from '@react-navigation/native';

const Top = createStackNavigator();

const HomeStack = () => {
  const navigation = useNavigation();
  return (
    <Top.Navigator>
      <Top.Screen name="Welcome" component={HomeScreen} />
    </Top.Navigator>
  );
};

export default HomeStack;
Run Code Online (Sandbox Code Playgroud)

HomeScreen.js(相关部分)

<SafeAreaView styles={styles.container}>
  <StatusBar barStyle="light-content" />
  <ScrollView>
     <StationScroll />
  </ScrollView>
</SafeAreaView>
Run Code Online (Sandbox Code Playgroud)

StationScroll 仅加载车站徽章列表 StationBadge.js

const StationBadge = (props: StationProps) => {
  const navigation = useNavigation();

  const onPress = () => {
    navigation.navigate('Stations', {
      screen: 'Station',
      station: props.station,
    });
    console.log(`station pressed: ${props.station.location}`);
  };

  return (
    <TouchableOpacity onPress={onPress}>
      <View style={styles.container}>
        <Image
          style={styles.image}
          source={{
            uri: `https://example.com/img/station-logos/${props.station.callsign}.png`,
          }}
        />
        <Text numberOfLines={1} style={styles.text}>
          {props.station.location}
        </Text>
      </View>
    </TouchableOpacity>
  );
};

export default StationBadge;

Run Code Online (Sandbox Code Playgroud)

这也是 StationStack.js

import React from 'react';
import {View} from 'react-native';
import {createStackNavigator} from '@react-navigation/stack';
import StationsScreen from '../screens/StationsScreen';
import StationScreen from '../screens/StationScreen';
import {StackActions, useNavigation} from '@react-navigation/native';

const SS = createStackNavigator();

const StationStack = () => {
  const navigation = useNavigation();

  return (
    <SS.Navigator>
      <SS.Screen name="Stations" component={StationsScreen}/>
      <SS.Screen name="Station"  component={StationScreen} />
    </SS.Navigator>
  );
};

export default StationStack;
Run Code Online (Sandbox Code Playgroud)

Mar*_*ope 7

我应该继续阅读文档

渲染导航器中定义的初始路线

默认情况下,当您在嵌套导航器中导航屏幕时,指定的屏幕将用作初始屏幕,并且导航器上的初始路由属性将被忽略。此行为与 React Navigation 4 不同。

如果需要渲染导航器中指定的初始路由,可以通过设置initial: false来禁用使用指定屏幕作为初始屏幕的行为:

navigation.navigate('Stations', {
  screen: 'Station',
 initial: false,
});
Run Code Online (Sandbox Code Playgroud)