Действия должны быть простыми объектами.Использовать пользовательское промежуточное ПО для асинхронных действий / undefined не является объектом / Получение ошибки с помощью navigator.geolocation - PullRequest
0 голосов
/ 08 октября 2018

Я продолжаю получать сообщение «Необработанный отказ (ошибка): действия должны быть простыми объектами. Использовать пользовательское промежуточное программное обеспечение для асинхронных действий».

Подробности: я следую этому учебнику * серии 1004 *, но разрабатываю дляAndroid в Windows 10.Используем реактивную версию v0.57.Моя проблема в том, что когда я вызываю this.props.getCurrentLocation () из компонента Home, я получаю эту ошибку.Кажется, что это проблема, с которой столкнулись многие люди, работающие с одним и тем же учебным пособием, поэтому я много читаю, но просто не могу разобраться в этом.

Вот мой код: src/routes/Home/modules/home.js

import update from "react-addons-update";
import constants from "./actionConstants";
import { Dimensions } from "react-native";

// -------------------------------
// CONSTANTS
// -------------------------------

const { GET_CURRENT_LOCATION } = constants; // keeps all the constants in one file
const { width, height } = Dimensions.get("window");
const ASPECT_RATIO = width / height;
const LATITUDE_DELTA = 0.0922;
const LONGITUDE_DELTA = ASPECT_RATIO * LATITUDE_DELTA;

// -------------------------------
// ACTIONS
// -------------------------------

export function getCurrentLocation(){
  return (dispatch)=>{ 
    navigator.geolocation.getCurrentPosition(
      (position) => { 
        dispatch({
          type:GET_CURRENT_LOCATION,
          payload:position
        }); 
      },
      (error) => {
          console.warn("error::" . error.code);
          var msg = null;
          switch(error.code) {
            case error.PERMISSION_DENIED:
                // msg = "User denied the request for Geolocation.";
                msg = "Usuario denego la solicitud de Geolocalizacion.";
                break;
            case error.POSITION_UNAVAILABLE:
                msg = "Location information is unavailable.";
                break;
            case error.TIMEOUT:
                msg = "The request to get user location timed out.";
                break;
            case error.UNKNOWN_ERROR:
                msg = "An unknown error occurred.";
                break;
          }
          alert(msg);
      },
      { enableHighAccuracy: true, timeout: 8000, maximumAge: 10000 }
    );
  }
}



// -------------------------------
// ACTION HANDLERS
// -------------------------------

function handleGetCurrentLocation(state, action){
  return update(state, {
    region:{
      latitude:{
        $set:action.payload.coords.latitude
      },
      longitude:{
        $set:action.payload.coords.longitude
      },
      latitudeDelta:{
        $set:LATITUDE_DELTA
      },
      longitudeDelta:{
        $set:LONGITUDE_DELTA
      }
    }
  });
}


const ACTION_HANDLERS = {

  GET_CURRENT_LOCATION:handleGetCurrentLocation
};

const initialState = {
  region:{}
};

export function HomeReducer (state = {}, action) {
  const handler = ACTION_HANDLERS[action.type];
  return handler ? handler(state, action) : state;
};

src / router / Home / modules / actionConstants.js

export default {
  GET_CURRENT_LOCATION: "GET_CURRENT_LOCATION"
};

src / маршруты / дома / контейнеры / HomeContainer.js

import { connect } from "react-redux";
import Home from "../components/Home";
import {
  getCurrentLocation
} from "../modules/home";

const mapStateToProps = (state) => ({
  region:state.home.region
});

const mapActionCreators = { 
  getCurrentLocation 
}; 

export default connect(mapStateToProps, mapActionCreators)(Home);

app / src / main / AndroidManifest.js

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.taxiapp">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

src / store / createStore.js

import { createStore, applyMiddleware, compose } from "redux";
import thunk from "redux-thunk";
import makeRootReducer from "./reducers";
import { createLogger } from "redux-logger";

const log = createLogger({ diff: true, collapsed: true });

// Export function that can create our store and autopersist the data

export default (initialState = {}) => {

  // Middleware configuration
  const middleware = {thunk, log}; 

  // Store enhancers
  const enhancers = [];

  // Store instantiation
  const store = createStore(
    makeRootReducer(),
    initialState,
    compose(
      applyMiddleware(...middleware),
      ...enhancers
    )
  );
  return store;
};

src / router / home / components / Home.js

// Takes care of the state
import React from "react";
import { View, Text } from "react-native";

import {Container} from "native-base";
import MapContainer from "./MapContainer";

class Home extends React.Component {

  componentDidMount() {

    this.props.getCurrentLocation();

  }
  render(){

    return(
      <Container>
        {   this.props.region.latitude && 
          <MapContainer region={ this.props.region}/>
        } 
      </Container>
    );

  }
}

export default Home;

1 Ответ

0 голосов
/ 12 октября 2018

Ошибка, похоже, в экземпляре магазина.

// Store instantiation
  const store = createStore(
    makeRootReducer(),
    initialState,
    compose(
      // applyMiddleware(...middleware), => works after commenting this line
      applyMiddleware(thunk),
      ...enhancers
    )
  );
...