[Android] safeAddFeature overwrites existing features on indexed insertion
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 72/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- android, react-native
- Domaine
- mobile
Piste de recherche
Commencez par localiser safeAddFeature et les chemins qui mettent à jour features et savedFeatures ; comparez-les à removeFeatureAt pour vérifier la gestion de l’ordre indexé. Reproduisez le Android New Architecture sample, puis confirmez que le fait de préfixer C et de réduire à B ne laisse que B visible et maintient les deux collections alignées.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Summary
On Android, dynamically inserting a map child anywhere except the end can desynchronise MapView.features from the React child list. A later removal can remove the wrong Google Maps feature and leave the intended feature orphaned on the map.
safeAddFeature, introduced by #5795, currently pads the list and calls features.set(index, mapFeature). When index < features.size(), set overwrites the existing entry instead of inserting and shifting it. The native feature that was overwritten remains on the Google map, but MapView.features no longer contains the reference needed to remove it. This is inconsistent with removeFeatureAt, which uses features.remove(index) and therefore shifts later entries.
The same issue exists in the paused path for savedFeatures.
Reproducible sample code
import React from "react"
import { Button, View } from "react-native"
import MapView, { Marker, PROVIDER_GOOGLE } from "react-native-maps"
const markers = {
a: { latitude: 13.69, longitude: -89.22 },
b: { latitude: 13.70, longitude: -89.21 },
c: { latitude: 13.71, longitude: -89.20 },
}
const phases = [
["a", "b"],
["c", "a", "b"],
["b"],
] as const
export default function App() {
const [phase, setPhase] = React.useState(0)
return (
<View style={{ flex: 1 }}>
<MapView
provider={PROVIDER_GOOGLE}
style={{ flex: 1 }}
initialRegion={{
latitude: 13.70,
longitude: -89.21,
latitudeDelta: 0.05,
longitudeDelta: 0.05,
}}
>
{phases[phase].map((id) => (
<Marker key={id} coordinate={markers[id]} title={id.toUpperCase()} />
))}
</MapView>
<Button
title="Next marker set"
onPress={() => setPhase((current) => Math.min(current + 1, 2))}
/>
</View>
)
}
Steps to reproduce
- Run the sample on Android with the New Architecture enabled.
- Confirm markers A and B are initially visible.
- Press Next marker set once. This prepends C before the existing children.
- Press Next marker set again. The declared child list now contains only B.
- Observe the markers without moving the camera.
Expected result
The native feature list stays aligned with the React children. After the second press, only marker B is visible.
Actual result
Inserting C at index 0 overwrites the feature reference for A in features instead of shifting it. Subsequent removals operate on the corrupted list: the wrong marker can be removed and an old marker can remain visible with no entry left in features to remove it later.
React Native Maps Version
1.27.2
What platforms are you seeing the problem on?
Android
React Native Version
0.85.3
What version of Expo are you using?
Not using Expo
Device(s)
Android emulator
Additional information
The collection overwrite mechanism was previously observed in this comment on #5750. The safeAddFeature helper was later introduced by #5795 to handle out-of-order additions after detach/attach, but its use of set makes that overwrite behavior apply to every non-tail insertion.
The corresponding fix is to pad only while size() < index, then use add(index, mapFeature) for both features and savedFeatures. This makes insertion shift entries in the same way that indexed removal shifts them back.
- Langage dominant
- TypeScript
- Étoiles
- 16k
- Forks
- 5k
- Merge moyen
- 1 j 2 h
- PR mergées (30 j)
- 3
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de react-native-maps/react-native-maps
-
[Android] onMarkerClick calls showInfoWindow() on markers that have no info window, raising them above every zIndexPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverte
Difficulté 1/5 1-3 heures Accessibilité débutants 88/100
react-native-maps/react-native-maps#6006 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
react-native-maps/react-native-maps#6005 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
react-native-maps/react-native-maps#6003 ·
Les mainteneurs répondent en général sous 1 jour
-
onPress/onLongPress `position` is in device pixels on Android, points on iOSPeut-être pris @ivan-kolesov l’a pris il y a 32 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
react-native-maps/react-native-maps#5998 ·
Les mainteneurs répondent en général sous 1 jour
-
Fabric: ReactViewGroup cannot be cast to MapMarker in MarkerManager.onLayoutChange (leaked layout listener on recycled views)Peut-être pris @huytdps13400 l’a pris il y a 45 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
react-native-maps/react-native-maps#5987 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de react-native-maps/react-native-maps
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
one-zero-eight/apply-bot#39 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
bigbluebutton/bbb-ui-components-react#108 ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
Les mainteneurs répondent en général sous 1 jour
-
high priority
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
CI-CMG/deep-sea-corals-exb#84 · 1 commentaire ·