Можно обновить только смонтированный или смонтированный компонент. При использовании NavigationActions.Reset

Сейчас я работаю над экраном редактирования. Поток следующий: есть TabNavigator, где на одной из вкладок есть MapView с множеством включенных маркеров. Затем пользователь может выбрать маркер для просмотра информации о маркере. После нажатия маркера пользователь может затем изменить местоположение маркера, а затем, как только они изменили местоположение маркера и обновили местоположение в API, я хотел бы вернуть их к просмотру карты со всеми маркерами. . В настоящее время опция «Назад» приводит их к случаю, когда они могут снова изменить местоположение маркера.

Моя настройка для моей навигации выглядит следующим образом:

StackNavigator:
  MainTabNavigator,
  HomeScreen,
  InformationScreen
  //OtherScreens.
  
MainTabNavigator:
  Home: {
    screen: HomeScreen
  }
  //Other tabs

В методе рендеринга домашнего экрана у меня есть что-то вроде этого:

return (
        <MapView
          style={{ flex: 1 }}
            onRegionChange={this.onRegionChange}
            showsUserLocation={true}
            showsMyLocationButton={false}
        >
        {!editing && this.state.markers.map((marker) => {
          return(
            <MapView.Marker
              key={marker._id}
              coordinate={{latitude: +marker.latitude, longitude: +marker.longitude}}
              anchor={{x: 0.5, y: 1}}
              centerOffset={{x: 0.5, y: 1}}
              onPress={() => {this.onPress(marker)}}
              >
              </MapView.Marker>
          )
         })
        }
        {editing &&
          <MapView.Marker
           coordinate={{latitude: +marker.latitude, longitude: +marker.longitude}}
           anchor={{x: 0.5, y: 1}}
           centerOffset={{x: 0.5, y: 1}}
           onDragEnd={(e) => { var new_marker = Object.assign({}, marker); new_marker.latitude = e.nativeEvent.coordinate.latitude; new_marker.longitude = e.nativeEvent.coordinate.longitude; this.props.dispatch(setMarker(new_marker));}}
           draggable
          >

          </MapView.Marker>
        }
        </MapView>
        </View>
      );

Где реквизит editing управляется моим состоянием редукции.

На информационном экране у меня есть следующий код, чтобы обновить местоположение маркера, а затем сбросить состояние.

  update = () => {
    //Commit the changes that the user made.
    const { marker, user, navigation } = this.props;
    this.setState({
      loading: true
    })
    //Save the changes on the API.
    fetch(API).then(response => {
      this.setState({
        loading: false,
        changeMade: false,
        editing: false,
      });
      const resetAction = NavigationActions.reset({
        index: 1,
        actions: [
        //Main is the MainTabNavigator
            NavigationActions.navigate({ routeName: 'Main' }),
        //InformationScreen is the screen where we do the editing.
            NavigationActions.navigate({ routeName: 'InformationScreen'})
        ],
        key: null
      });
      this.props.navigation.dispatch(resetAction);

      this.props.dispatch(setEditing(false));
    });

  }

Теперь он, кажется, переходит к экранам, когда сбрасывает стек, что является просто ужасным пользовательским интерфейсом, а затем не отвечает на главном экране после того, как вы вернетесь. Я исследую это, это может быть бесконечный цикл или что-то в этом роде. Если мне нужно объяснить что-то яснее или добавить больше кода, просто оставьте комментарий, я постараюсь объяснить лучше.

В настоящее время я изучаю возможность отключения всех анимаций здесь: React Navigation: перейдите обратно к корню с помощью NavigationActions.reset, goBack и getStateForAction


person SwimmingG    schedule 10.03.2018    source источник