pre*_*ton 13 javascript android reactjs react-native react-navigation
我在 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."
Run Code Online (Sandbox Code Playgroud)
    Ish*_*nha 18
正如我的情况一样,如果您尝试导航到嵌套导航器中的屏幕(如错误中所述),您确实需要检查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>
  );
}
Run Code Online (Sandbox Code Playgroud)
在这里,您可能想
Root从Home组件导航到堆栈:
navigation.navigate('Root');
Run Code Online (Sandbox Code Playgroud)
Root它可以工作,并显示组件内的初始屏幕,即Profile。但有时您可能想要控制导航时应显示的屏幕。要实现它,您可以在参数中传递屏幕的名称:
navigation.navigate('Root', { screen: 'Settings' });
Run Code Online (Sandbox Code Playgroud)
现在,
Settings屏幕将被渲染,而不是Profile在导航时渲染。这可能看起来与以前用于嵌套屏幕的导航方式非常不同。不同之处在于,在以前的版本中,所有配置都是静态的,因此 React Navigation 可以通过递归到嵌套配置来静态找到所有导航器及其屏幕的列表。但通过动态配置,React Navigation 不知道哪些屏幕可用以及在哪里,直到包含屏幕的导航器呈现。通常,在您导航到屏幕之前,屏幕不会呈现其内容,因此尚未呈现的导航器的配置尚不可用。这使得有必要指定您要导航到的层次结构。这也是为什么您应该尽可能少地嵌套导航器以使代码更简单。
Tad*_*she 10
这里可能会发生两件事:
在我的情况下:我有不同的函数返回单独的堆栈导航器,如下面的代码所示,我希望在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>
  );
}
Run Code Online (Sandbox Code Playgroud)
设置屏幕:在用户提供所需详细信息后的设置屏幕内,我使用以下功能重定向到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');
};
Run Code Online (Sandbox Code Playgroud)
注意:我this.props.navigation.replace('Home');在SettingsScreen 中使用的部分。这可以正常工作,但是被调用的Home 路由来自该function SettingsStack() {...}函数而不是该function MainStack() {...}函数。
因此,来自堆栈顶部的Home Route 的所有导航都会给我这样一个错误,因为我的活动堆栈只有两条路线,Settings Route和Home Route。
后来我意识到我正在强迫我的应用程序查找位于不同堆栈中的路由,因此我重新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>
  );
}
Run Code Online (Sandbox Code Playgroud)
记下<Stack.Screen name="MainStack" component={MainStack} options={{ title: '', headerTransparent: true }}
      />MainStack 现在连接到 SettingsStack 的那一行。
简而言之:确保您调用的路由与调用路由位于同一堆栈中,或者只需确保您以某种方式连接了路由,例如将堆栈函数放在抽屉导航器函数中。至少必须有关系或加入。
小智 7
我遇到了同样的问题,谷歌搜索将我带到了这个页面。然后,我不小心将“name”道具命名为与组件相同的名称,错误消失了,我的导航器开始正常工作。我将名称更改为其他名称,然后返回错误。因此,名称 prop 似乎必须与组件的名称相同。就像这样:
<Stack.Screen
        name="SettingsScreen"
        component={SettingsScreen}
        options={{
          title: 'SMS Recipient Number',
          headerShown: true,
          headerTitleAlign: 'center',
        }} />
Run Code Online (Sandbox Code Playgroud)
        React 导航允许应用程序更改向用户显示的组件。navigation.navigate('192.168.100.189:19000')您在代码中的某个地方调用吗?这不是 React Navigation 的目的。导航的参数应该是屏幕名称:具体来说,是您提供给 Navigator.Screen 组件的名称:
<Stack.Screen name="Your Camera" component={Camera} />
Run Code Online (Sandbox Code Playgroud)
navigation.navigate('Your Camera')会将应用程序导航到相机组件。
如果您希望用户在浏览器中打开 URL,那么您应该使用Linking library, Linking.openURL('192.168.100.189:19000')。
PS:params 对象是可选的。如果您要传递一个空对象,则它不需要在那里。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           38244 次  |  
        
|   最近记录:  |