使用 Effect 和 getPermissionAsync
UseEffect with getPermissionAsync
不幸的是,我正在努力处理 React Native 中的钩子生命周期。
我在顶层有两个钩子。
const permission = useLocationPermission();
const location = useCurrentLocation(locationPermission);
第一个处理定位权限权限,请用户grand。
export default function useLocationPermission() {
const [hasLocationPermission, setHasLocationPermission] = useState(false);
const appState = useRef(AppState.currentState);
useEffect(() => {
hasPermission();
}, []);
const hasPermission = async () => {
const { granted } = await Location.getForegroundPermissionsAsync();
if (!granted) {
const { granted: request } =
await Location.requestForegroundPermissionsAsync();
if (!request) {
Alert.alert(
"Some Message"
);
setHasLocationPermission(false);
} else {
setHasLocationPermission(true);
}
} else {
setHasLocationPermission(true);
}
};
return hasLocationPermission;
}
第二个处理当前位置。
export default function useCurrentLocation(hasPermission: boolean) {
const [currentLocation, setCurrentLocation] = useState<LatLng>(initLocation);
useEffect(() => {
console.log(hasPermission);
if (hasPermission) {
setWatcher();
getCurrentPosition().then((locationObject) => {
setCurrentLocation({
latitude: locationObject.coords.latitude,
longitude: locationObject.coords.longitude,
});
});
} else {
setCurrentLocation(initLocation);
}
}, []);
const getCurrentPosition = async () => {
return Location.getCurrentPositionAsync({});
};
const setWatcher = async () => {
await Location.watchPositionAsync({ distanceInterval: 5 }, (locaction) => {
setCurrentLocation({
latitude: locaction.coords.latitude,
longitude: locaction.coords.longitude,
});
});
};
return currentLocation;
}
我的问题是在用户授予权限之后。该位置将不再更新(仍然是初始位置)。好像第二个钩子只叫ones。
是否有任何最佳做法来处理这种情况。所以设置权限后会更新location和watcher。
非常感谢。
您设置当前位置的效果的依赖项列表为空。由于您是说您希望该效果取决于 hasPermission
,因此请将其设置为 [hasPermission]
。
不幸的是,我正在努力处理 React Native 中的钩子生命周期。 我在顶层有两个钩子。
const permission = useLocationPermission();
const location = useCurrentLocation(locationPermission);
第一个处理定位权限权限,请用户grand。
export default function useLocationPermission() {
const [hasLocationPermission, setHasLocationPermission] = useState(false);
const appState = useRef(AppState.currentState);
useEffect(() => {
hasPermission();
}, []);
const hasPermission = async () => {
const { granted } = await Location.getForegroundPermissionsAsync();
if (!granted) {
const { granted: request } =
await Location.requestForegroundPermissionsAsync();
if (!request) {
Alert.alert(
"Some Message"
);
setHasLocationPermission(false);
} else {
setHasLocationPermission(true);
}
} else {
setHasLocationPermission(true);
}
};
return hasLocationPermission;
}
第二个处理当前位置。
export default function useCurrentLocation(hasPermission: boolean) {
const [currentLocation, setCurrentLocation] = useState<LatLng>(initLocation);
useEffect(() => {
console.log(hasPermission);
if (hasPermission) {
setWatcher();
getCurrentPosition().then((locationObject) => {
setCurrentLocation({
latitude: locationObject.coords.latitude,
longitude: locationObject.coords.longitude,
});
});
} else {
setCurrentLocation(initLocation);
}
}, []);
const getCurrentPosition = async () => {
return Location.getCurrentPositionAsync({});
};
const setWatcher = async () => {
await Location.watchPositionAsync({ distanceInterval: 5 }, (locaction) => {
setCurrentLocation({
latitude: locaction.coords.latitude,
longitude: locaction.coords.longitude,
});
});
};
return currentLocation;
}
我的问题是在用户授予权限之后。该位置将不再更新(仍然是初始位置)。好像第二个钩子只叫ones。 是否有任何最佳做法来处理这种情况。所以设置权限后会更新location和watcher。
非常感谢。
您设置当前位置的效果的依赖项列表为空。由于您是说您希望该效果取决于 hasPermission
,因此请将其设置为 [hasPermission]
。