将Polyline与本机贴图一起使用时出现空参考错误

时间:2019-06-26 20:03:32

标签: javascript android google-maps react-native react-native-android

当我使用折线时,会出现以下错误: attempt to invoke interface method 'java.util.iterator java.util.list.iterator()' on a null object

起初,我以为我做错了或者我滥用了google-map API,因此尝试使用一些硬编码的坐标(如下代码所示),但是没有任何进展。 如果删除折线部分,代码将运行正常。 我用谷歌搜索,希望找到任何解决方案,但也没有成功。

  • 一些有关开发平台的信息:
  • expo版本2.19.1
  • 纱线版本​​1.16.0
  • 节点版本10.15.2

在安装了Android PI的物理设备上进行测试。

import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { Permissions, MapView } from 'expo'

// import Polyline from '@mapbox/polyline'
import { Polyline } from 'react-native-maps'

const locations = require('./locations.json')

export default class App extends React.Component {

  state = {
    latitude: null,
    longitude: null,
    locations: locations
  }

  componentDidMount() {
    this.GetLocations()
  }


  GetLocations = async () => {
    const { status } = await Permissions.getAsync(Permissions.LOCATION)
    if (status !== 'granted') {
      const response = await Permissions.askAsync(Permissions.LOCATION)
    }

    navigator.geolocation.getCurrentPosition(
      ({ coords: { latitude, longitude }}) => this.setState({ latitude, longitude}, this.mergeCoords),
      (err) => console.log(`Error: ${err}`)
    )

    const { locations: [sampleLocation] } = this.state
    this.setState({
      desLatitude: sampleLocation.coords.latitude,
      desLongitude: sampleLocation.coords.longitude,
    }, this.mergeCoords)
  }

  mergeCoords = () => {
    const { latitude, longitude, desLatitude, desLongitude } = this.state
    const hasStartAndEnd = ( latitude !== null && desLatitude !== null )

    // if the line have start and end 
    if (hasStartAndEnd) {
      const concatStart = `${latitude},${longitude}`
      const concatEnd = `${desLatitude},${desLongitude}`
      this.getDirections(concatStart, concatEnd)
    }
  }


  async getDirections(startLoc, desLoc) {
    try {
      // const res =  await fetch(`https://maps.googleapis.com/maps/api/directions/json?key=MY_API_KEY&origin=${startLoc}&destination=${desLoc}`)
      // const resJson = await res.json()
      // const points = Polyline.decode(resJson.routes[0].overview_polyline.points)
      // const coords = points.map( point => {
      //   return {
      //     latitude: point[0],
      //     longitude: point[1]
      //   }
      // })


      const coords = {
        latitude: 31.262353,        
        longitude: 29.989506,     
      }
      console.log("point, coords: ", coord)
      this.setState({coords})

    } catch(err) {
      console.log('Error: ', err)
    }
  }

  render() {
    const { latitude, longitude, coords } = this.state

    if (latitude) {
      return (
        <MapView 
          style={{ flex: 1 }}
          showsUserLocation
          initialRegion={{
            latitude,
            longitude,
            latitudeDelta: 0.0922,
            longitudeDelta: 0.0421, 
          }}
        >
          <MapView.Polyline
            strokeWidth={2}
            strokeColor="red"
            coordinates={coords}
          />

        </MapView>
      )
    }

    return (
      <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center'}}>
        <Text>We need your permissions !!</Text>
      </View>
    )
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});



1 个答案:

答案 0 :(得分:0)

//use condional rendering
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { Permissions, MapView } from 'expo'

// import Polyline from '@mapbox/polyline'
import { Polyline } from 'react-native-maps'

const locations = require('./locations.json')

export default class App extends React.Component {

state = {
latitude: null,
longitude: null,
locations: locations,
direct : false

}

componentDidMount() {
this.GetLocations()
}


GetLocations = async () => {
const { status } = await Permissions.getAsync(Permissions.LOCATION)
if (status !== 'granted') {
  const response = await Permissions.askAsync(Permissions.LOCATION)
}

navigator.geolocation.getCurrentPosition(
  ({ coords: { latitude, longitude }}) => this.setState({ latitude, longitude}, 
this.mergeCoords),
  (err) => console.log(`Error: ${err}`)
)

const { locations: [sampleLocation] } = this.state
this.setState({
  desLatitude: sampleLocation.coords.latitude,
  desLongitude: sampleLocation.coords.longitude,
}, this.mergeCoords)
}

mergeCoords = () => {
const { latitude, longitude, desLatitude, desLongitude } = this.state
const hasStartAndEnd = ( latitude !== null && desLatitude !== null )

// if the line have start and end 
if (hasStartAndEnd) {
  const concatStart = `${latitude},${longitude}`
  const concatEnd = `${desLatitude},${desLongitude}`
  this.getDirections(concatStart, concatEnd)
}
}


async getDirections(startLoc, desLoc) {
try {
  // const res =  await fetch(`https://maps.googleapis.com/maps/api/directions/json? 
  key=MY_API_KEY&origin=${startLoc}&destination=${desLoc}`)
  // const resJson = await res.json()
  // const points = Polyline.decode(resJson.routes[0].overview_polyline.points)
  // const coords = points.map( point => {
  //   return {
  //     latitude: point[0],
  //     longitude: point[1]
  //   }
  // })


  const coords = {
    latitude: 31.262353,        
    longitude: 29.989506,     
  }
  console.log("point, coords: ", coord)
  this.setState({coords, direct:true})

} catch(err) {
  console.log('Error: ', err)
}

}

render() {
const { latitude, longitude, coords } = this.state

if (latitude) {
  return (
    <MapView 
      style={{ flex: 1 }}
      showsUserLocation
      initialRegion={{
        latitude,
        longitude,
        latitudeDelta: 0.0922,
        longitudeDelta: 0.0421, 
      }}
    >
{this.state.direct &&    
<MapView.Polyline
        strokeWidth={2}
        strokeColor="red"
        coordinates={coords}
      />}

    </MapView>
  )
}

return (
  <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center'}}>
    <Text>We need your permissions !!</Text>
  </View>
)

} }