Реагировать на собственную ошибку навигации: действие перемещалось с полезной нагрузкой {"name": 192.168.100.189:19000 "," params ": {}} не было обработано ни одним навигатором - PullRequest
0 голосов
/ 13 апреля 2020

Я использую реагирующую навигацию с моим приложением React Native.

Я продолжаю получать сообщение об ошибке, которое предположительно предназначено только для разработки и не отображается в рабочей среде.

Как исправить ошибку ниже ??

console.error: "Действие 'NAVIGATE' с полезной нагрузкой {" name ":" 192.168.100.189:19000 "," params ": {}} не обрабатывался никаким навигатором.

У вас есть экран с именем '192.168.100.189:19000'?

Если вы пытаетесь перейти к экрану во вложенном навигаторе, см. https://reactnavigation.org/docs/nesting-navigators#navigating -to-a-screen-in-a-nestd-navigator .

Это предупреждение только для разработки и не будет отображаться в рабочей среде. "

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Здесь могут произойти две вещи:

В МОЕМ СЛУЧАЕ: У меня были разные функции, возвращавшие отдельные стековые навигаторы, как в коде ниже, я хотел, чтобы SettingsScreen отображал В самый первый раз пользователь использует приложение, чтобы задать настройки, и в следующий раз, когда он снова откроет приложение, он сначала увидит HomeScreen (тот же поток с аутентификацией) :

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');

};

ПРИМЕЧАНИЕ: часть, где я использовал this.props.navigation.replace('Home'); внутри SettingsScreen . Это бы хорошо работало, НО Home route , который вызывался, был из этой функции function SettingsStack() {...}, а не из функции function MainStack() {...}.

Таким образом, все переходы с Домашнего маршрута на вершине стека могут вызвать такую ​​ошибку, поскольку мой активный стек имеет только два маршрута, Настройки маршрута и Домашний маршрут .

Позже я понял, что заставлял мое приложение искать маршруты, находящиеся в другом стеке, поэтому я переписал 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>
  );
}

Обратите внимание на строку <Stack.Screen name="MainStack" component={MainStack} options={{ title: '', headerTransparent: true }} />, где MainStack был теперь подключен к стеку настроек.

IN BRIEF: Убедитесь, что маршрут, который вы вызвали находится в том же стеке, что и вызывающий маршрут, ИЛИ просто убедитесь, что вы как-то соединили свои маршруты, например, поместив функцию Stack в функцию Drawer Navigators. По крайней мере, должны быть отношения или присоединение.

0 голосов
/ 13 апреля 2020

Реактивная навигация позволяет приложению изменять компоненты, которые отображаются пользователю. Вы звоните navigation.navigate('192.168.100.189:19000') где-нибудь в вашем коде? Это не цель React Navigation. Аргумент для навигации должен быть отображаемым именем: в частности, имя, которое вы указываете компоненту Navigator.Screen:

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

navigation.navigate('Your Camera') будет перемещать приложение к компоненту Camera.

Если вы хотите, чтобы пользователь открыл URL в своем браузере, вам следует использовать Linking library, Linking.openURL('192.168.100.189:19000').

PS: объект params является необязательным. Если вы собираетесь пропустить пустой объект, он не обязательно должен быть там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...