【问题标题】:React Native Navigation Error: The action navigate with payload {"name": 192.168.100.189:19000", "params":{}} was not handled by any navigatorReact Native Navigation 错误:使用有效负载 {"name": 192.168.100.189:19000", "params":{}} 导航的操作未由任何导航器处理
【发布时间】:2020-07-25 20:23:16
【问题描述】:

我在我的 React Native 应用程序中使用 react-navigation。

我不断收到一个错误,据说这是一个仅限开发的警告,不会在生产中显示。

如何解决以下错误?

console.error: "The action 'NAVIGATE' with payload
{"name":"192.168.100.189:19000","params":{}} was not handled by any
navigator.

Do you have a screen named '192.168.100.189:19000'?

If you'r trying to navigate to a screen in a nested navigator, see
https://reactnavigation.org/docs/nesting-navigators#navigating-to-a-screen-in-a-nestd-navigator.

This is a development-only warning and won't be shown in production."

【问题讨论】:

    标签: javascript android reactjs react-native react-navigation


    【解决方案1】:

    这里可能发生两件事:

    在我的情况下:我有不同的函数返回单独的堆栈导航器,如下面的代码所示,我希望SettingsScreen 在用户第一次使用该应用程序时出现,以便他们设置配置,下次他们再次打开应用程序时,他们会首先看到主屏幕(与身份验证相同的流程):

    function SettingsStack() {
      return (
        <Stack.Navigator initialRouteName='Settings'>
          <Stack.Screen
            name="Settings"
            component={SettingsScreen}
            options={{
              title: 'SMS Recipient Number',
              headerShown: true,
              headerTitleAlign: 'center',
            }}
          />
          <Stack.Screen name="Home" component={HomeScreen} options={{ title: '', headerTransparent: true }}
          />
        </Stack.Navigator>
      );
    }
    
    function MainStack() {
      return (
        <Stack.Navigator initialRouteName='Home'>
          <Stack.Screen
            name="Update"
            component={UpdateScreen}
            options={{
              title: 'Update Recipient Phone',
              headerTitleAlign: 'center',
              headerShown: true
            }}
          />
          <Stack.Screen
            name="Security"
            component={PinScreen}
            options={{
              title: 'Provide PIN',
              headerTitleAlign: 'center',
              headerShown: true
            }}
          />
          <Stack.Screen
            name="Home"
            headerMode="screen"
            component={HomeScreen}
            options={({ navigation }) => ({
              headerTitle: '',
              headerTransparent: true,
              headerRight: () => (
                <Button
                  icon={
                    <Icon
                      name='settings'
                      type='feather'
                      color='grey'
                      onPress={() => navigation.navigate('Update')}
                      onLongPress={() => navigation.navigate('Update')}
                    />
                  }
                  type="clear"
                  buttonStyle={{ marginRight: 10 }}
                />
              ),
            })}
          />
        </Stack.Navigator>
      );
    }
    

    设置屏幕:在用户提供所需详细信息后的设置屏幕中,我使用以下功能重定向到HomeScreen:

    transactEntry = async () => {
        const { phone_number } = this.state;
    
        if ((this.state.phone_number.trim() == "") || (this.state.phone_number.trim().length == 0)) {
            Alert.alert('Error:', 'Please enter valid phone number.');
            return
        }
    
        try {
            await AsyncStorage.setItem('@recipient_number', phone_number);
        } catch (error) {
            Alert.alert('Error:', 'Error setting recipient phone number!');
        }
    
        Keyboard.dismiss();
    
        let successToast = Toast.show('Recipient phone number set successfully.', {
            duration: Toast.durations.LONG,
            position: Toast.positions.TOP,
            shadow: true,
            animation: true,
            backgroundColor: 'black',
            hideOnPress: true,
            delay: 0,
            onShow: () => { },
            onShown: () => { },
            onHide: () => { },
            onHidden: () => { }
        });
    
        setTimeout(function () {
            Toast.hide(successToast);
        }, 3000);
    
        successToast;
        this.props.navigation.replace('Home');
    
    };
    

    注意: 我在 SettingsScreen 中使用 this.props.navigation.replace('Home'); 的部分。这可以正常工作,但被调用的 Home route 来自 function SettingsStack() {...} 函数,而不是 function MainStack() {...} 函数。

    因此,来自堆栈顶部的 Home Route 的所有导航都会给我这样的错误,因为 我的活动堆栈 只有两个路由,Settings路线和回家路线。

    后来我意识到我是在强迫我的应用查找位于不同堆栈中的路由,因此我重新连接了 function MainStack() {...} 并将其与 function SettingsStack() {...} 函数链接,如下所示。

    function SettingsStack() {
      return (
        <Stack.Navigator initialRouteName='Settings'>
          <Stack.Screen
            name="Settings"
            component={SettingsScreen}
            options={{
              title: 'SMS Recipient Number',
              headerShown: true,
              headerTitleAlign: 'center',
            }}
          />
          <Stack.Screen name="MainStack" component={MainStack} options={{ title: '', headerTransparent: true }}
          />
        </Stack.Navigator>
      );
    }
    
    function MainStack() {
      return (
        <Stack.Navigator initialRouteName='Home'>
          <Stack.Screen
            name="Update"
            component={UpdateScreen}
            options={{
              title: 'Update Recipient Phone',
              headerTitleAlign: 'center',
              headerShown: true
            }}
          />
          <Stack.Screen
            name="Security"
            component={PinScreen}
            options={{
              title: 'Provide PIN',
              headerTitleAlign: 'center',
              headerShown: true
            }}
          />
          <Stack.Screen
            name="Home"
            headerMode="screen"
            component={HomeScreen}
            options={({ navigation }) => ({
              headerTitle: '',
              headerTransparent: true,
              headerRight: () => (
                <Button
                  icon={
                    <Icon
                      name='settings'
                      type='feather'
                      color='grey'
                      onPress={() => navigation.navigate('Update')}
                      onLongPress={() => navigation.navigate('Update')}
                    />
                  }
                  type="clear"
                  buttonStyle={{ marginRight: 10 }}
                />
              ),
            })}
          />
        </Stack.Navigator>
      );
    }
    

    记下 MainStack 现在连接到 SettingsStack 的 <Stack.Screen name="MainStack" component={MainStack} options={{ title: '', headerTransparent: true }} /> 行。

    简而言之:确保您调用的路由与调用路由位于同一堆栈中,或者只需确保您以某种方式连接了您的路由,例如将堆栈函数放入抽屉中导航器功能。至少必须有关系或加入。

    【讨论】:

    • 考虑用几个关键行来回答,而不是按原样粘贴大块代码。
    • 在您的回答中,我看到了“options={({ navigation })”。您是否通过导航获得了正确的导航对象?我总是不确定
    • 是的,我是,你能确保你注意到括号或括号。
    【解决方案2】:

    我的问题终于通过删除 Stack.Screen 名称中的空格来解决。

    【讨论】:

    • 我觉得名字里有半个空格什么的,看不到。只是重新输入名称并得到解决
    • 我遇到了同样的错误,因为我的 Stack.Screen 名称是“item”,然后尝试推送“Item”
    【解决方案3】:

    与我的问题一样,如果您正在尝试导航到嵌套导航器中的屏幕(如错误中所述),您确实需要查看https://reactnavigation.org/docs/nesting-navigators#navigating-to-a-screen-in-a-nestd-navigator 的文档(同样,在错误中提到):

    考虑以下示例:

    function Root() {
      return (
        <Stack.Navigator>
          <Stack.Screen name="Profile" component={Profile} />
          <Stack.Screen name="Settings" component={Settings} />
        </Stack.Navigator>
      );
    }
    
    function App() {
      return (
        <NavigationContainer>
          <Drawer.Navigator>
            <Drawer.Screen name="Home" component={Home} />
            <Drawer.Screen name="Root" component={Root} />
          </Drawer.Navigator>
        </NavigationContainer>
      );
    }
    

    在这里,您可能希望从 Home 组件导航到 Root 堆栈:

    navigation.navigate('Root');
    

    它起作用了,并且显示了Root 组件内的初始屏幕,即Profile。但有时您可能想要控制导航时应显示的屏幕。要实现它,您可以在 params 中传递屏幕的名称:

    navigation.navigate('Root', { screen: 'Settings' });
    

    现在,导航时将呈现 Settings 屏幕而不是 Profile。

    这可能看起来与以前使用嵌套屏幕的导航方式非常不同。不同之处在于,在之前的版本中,所有配置都是静态的,因此 React Navigation 可以通过递归嵌套配置来静态找到所有导航器及其屏幕的列表。但是使用动态配置,React Navigation 不知道哪些屏幕可用以及在哪里,直到包含屏幕的导航器呈现。通常,屏幕在您导航到它之前不会呈现其内容,因此尚未呈现的导航器的配置尚不可用。这使得有必要指定您要导航到的层次结构。这也是为什么您应该尽可能少地嵌套导航器以使您的代码更简单。

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,Google 搜索将我带到了这个页面。然后我不小心将“名称”道具命名为与组件相同,错误消失了,我的导航器开始正常工作。我将名称更改为其他名称并返回错误。 因此,名称 prop 似乎必须与组件名称相同。 像这样:

      <Stack.Screen
              name="SettingsScreen"
              component={SettingsScreen}
              options={{
                title: 'SMS Recipient Number',
                headerShown: true,
                headerTitleAlign: 'center',
              }} />
      

      【讨论】:

        【解决方案5】:

        React 导航允许应用更改向用户显示的组件。您是否在代码中的某处调用navigation.navigate('192.168.100.189:19000')?这不是 React Navigation 的目的。导航的参数应该是一个屏幕名称:具体来说,您提供给 Navigator.Screen 组件的名称:

        <Stack.Screen name="Your Camera" component={Camera} />
        

        navigation.navigate('Your Camera') 会将应用导航到相机组件。

        如果您希望用户在浏览器中打开一个 URL,那么您应该使用Linking library、Linking.openURL('192.168.100.189:19000')。

        PS:params 对象是可选的。如果您要传递一个空对象,则它不需要存在。

        【讨论】:

        • 我没有任何代码调用 navigation.navigate('192.168.100.189:19000')....那么可能是什么原因造成的?
        • 您可能在navigation.navigate() 中使用了错误的变量(同名,从错误的文件中导入)。你的navigation.navigate 电话的论点是什么?
        【解决方案6】:

        确保屏幕名称与操作按钮和堆栈屏幕上的名称匹配

        <SwitchStack.Screen name="PickUpLocation" component ={PickUpLocation} />
        

        【讨论】:

          【解决方案7】:

          当我移除嵌套的导航容器时,我的问题已修复。

          现在我有一个导航容器和三个导航器。像这样的:

          <NavContainer>
           <Stack>
            <Tab>
             <Drawer>
              <Screen3 />
              <Screen4 />
             </Drawer>
             <Screen2 />
            </Tab>
            <Screen1 />
           </Stack>
          </NavContainer>
          

          【讨论】:

            【解决方案8】:

            在我的情况下,这是由于条件渲染props.user ? &lt;RootStack.Screen name='Main' component={WelcomeScreen} /&gt;

            【讨论】:

              【解决方案9】:

              在我的情况下,我没有正确处理嵌套,我还有一个 AuthStack、一个 HomeStack 和 DrawerTabs。 最初我正在处理 AuthStack 和 HomeStack。我工作得很好。 但是当我添加 DrawerTabs 时,我用它替换了 HomeStack。并且发生了这个错误。

              现在我将 HomeStack 作为初始堆栈(用于授权用户),然后我 在 HomeStack 中初始化 DrawerTabs。

              这解决了我的错误。

              【讨论】:

              【解决方案10】:

              我遇到了同样的问题,我找到了一个适用于我的解决方案,我有一个 bottomStackNavigator 和一个堆栈导航器:您需要在 name="Settings" component={SettingPage} --> name 中提供相同的字符串="SettingPage" 组件={SettingPage}

                  const ProfilStack = createStackNavigator();
              export const ProfilStackScreen = () => {
                return (
                  <ProfilStack.Navigator   >
                    <ProfilStack.Screen name="Profil" component={UserProfil} options={{ headerShown: false }} />
                    <ProfilStack.Screen name="SettingPage" component={SettingPage} options={{ headerShown: false }} />
                    <ProfilStack.Screen name="modifier mon compte" component={UserModificationPage} options={{ headerShown: false }} />
              
                    <ProfilStack.Screen name="Mes Tags" component={MyTags} options={{ headerShown: false }} />
                    <ProfilStack.Screen name="modifier centre interets" component={CategoriesTags} options={{ headerShown: false }} />
                    <ProfilStack.Screen name="change tes tags" component={ChooseTags} options={{ headerShown: false }} />
                  </ProfilStack.Navigator>
                );
              }
              
              
              const Tab = createBottomTabNavigator();
              
              export default function Navigator() {
                // render() {
              
                return (
                  <Tab.Navigator
                    initialRouteName="Feed"
                    tabBarOptions={{
                      activeTintColor: '#e91e63',
                      activeBackgroundColor: CAMPOO.secondary,
                    }}
              
              
              
                  >
                    <Tab.Screen
                      name="accueil"
                      component={HomeStackScreen}
                      options={{
              
                        tabBarLabel: () => { return null },
              
              
                        tabBarIcon: () => {
                          return (
                            <HomeIcon />
              
              
                          );
                        },
                      }}
                    />
                    <Tab.Screen
                      name="Evenement"
                      component={EventStackScreen}
                      options={{
                        tabBarLabel: () => { return null },
                        tabBarIcon: () => {
                          return (
                            <EventIcon />
              
              
                          );
                        },
                      }}
              
                    />
              
                    <Tab.Screen
                      name="mon profil"
                      component={ProfilStackScreen}
                      options={{
              
              
              
                        tabBarLabel: () => { return null },
              
                        tabBarIcon: () => {
                          return (
                            <ProfileIcon />
              
              
                          );
                        },
                      }}
              
                    />
                  </Tab.Navigator>
                );
                // }
              }
              

              【讨论】:

                猜你喜欢
                • 2021-12-02
                • 1970-01-01
                • 2021-12-10
                • 1970-01-01
                • 2020-08-17
                • 1970-01-01
                • 1970-01-01
                • 2022-11-23
                • 1970-01-01
                相关资源
                最近更新 更多