Expo React-Card-карты сбои при работе с близлежащим пользовательским запросомIOS

Программируем под IOS
Ответить
Anonymous
 Expo React-Card-карты сбои при работе с близлежащим пользовательским запросом

Сообщение Anonymous »

Сводка
Я разрабатываю приложение, которое отображает пользователей в качестве маркеров на карте. Приложение фильтрует пользовательские данные и только отображает маркеры для пользователей в радиусе 10 км из начального местоположения. Сбой. После этого приложение больше не сбои. Это говорит о том, что проблема связана с логикой рендеринга карты. < /Li>
< /ul>
Примечания
Эта проблема возникла только в устройствах iOS, отлично работает в Android.

Код: Выделить всё

import { useMemo, useRef } from 'react';
import { alumniData } from '../../../data/alumniData';

const calculateDistance = (lat1, lon1, lat2, lon2) => {
const R = 6371; // Radius of the Earth in kilometers
const dLat = (lat2 - lat1) * Math.PI / 180;
const dLon = (lon2 - lon1) * Math.PI / 180;
const a =
Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
Math.sin(dLon/2) * Math.sin(dLon/2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
const distance = R * c; // Distance in kilometers
return distance;
};

export const useAlumniFilter = (userLocation, searchQuery, activeTab) => {
// Store initial coordinates permanently - only set once
const storedCoordinates = useRef(null);

// Set coordinates only if not already stored and userLocation is available
if (!storedCoordinates.current && userLocation) {
storedCoordinates.current = {
lat: userLocation.latitude,
lon: userLocation.longitude
};
}

// Use stored coordinates or fallback to default
const coordinates = storedCoordinates.current || {
lat: -7.799686848512109,
lon: 110.35255749979842
};

// Get nearby alumni (filtered by 10km radius)
const nearbyAlumni = useMemo(() => {
return alumniData.filter(alumni => {
try {
// Add safety checks for alumni location
if (!alumni.location ||
typeof alumni.location.latitude !== 'number' ||
typeof alumni.location.longitude !== 'number') {
return false;
}

const distance = calculateDistance(
coordinates.lat,
coordinates.lon,
alumni.location.latitude,
alumni.location.longitude
);
return distance  {
return activeTab === "sekitar" ? nearbyAlumni : alumniData;
}, [activeTab, nearbyAlumni]);

// Common filter function for both tabs
const filterAlumniByQuery = useMemo(() => {
return (dataToFilter, query) => {
// Early return for empty search
if (!query || query.trim() === '') {
return dataToFilter;
}

const searchQuery = query.toLowerCase().trim();

return dataToFilter.filter((alumni) => {
try {
// Add safety checks for alumni data
if (!alumni || typeof alumni !== 'object') {
return false;
}

const name = alumni.name?.toLowerCase() || '';
const batch = alumni.batch?.toLowerCase() || '';

// More robust word splitting
const nameWords = name.split(/\s+/).filter(word => word.length > 0);
const batchWords = batch.split(/\s+/).filter(word => word.length > 0);

// Check if any word in name starts with query
const nameMatch = nameWords.some(word => word.startsWith(searchQuery));

// Check if second word in batch starts with query (with safety check)
const batchMatch = batchWords.length > 1 && batchWords[1].startsWith(searchQuery);

return nameMatch || batchMatch;
} catch (error) {
console.error('Error filtering alumni:', alumni?.name || 'unknown', error);
return false;
}
});
};
}, []);

// Apply the same filter logic to the selected source data
const filteredAlumni = useMemo(() => {
return filterAlumniByQuery(sourceData, searchQuery);
}, [sourceData, searchQuery, filterAlumniByQuery]);

return {
nearbyAlumni,
filteredAlumni,
sourceData,
userCoordinates: coordinates // Return stored coordinates for reference
};
};
Шаги по воспроизведению
https://github.com/user-attachments/ass ... 2aec88ff62
Входной входной вход, а затем очистите вход или делите с помощью клавиатуры. Наконец, введите что -нибудь еще раз.>

Подробнее здесь: https://stackoverflow.com/questions/796 ... user-query
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»