-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Description
Description
When the parent <View>’s width is changed at runtime (via useState or other dynamic styling), the <Line> | <Rect> inside an <Svg> with width="100%" does not redraw to fill the new width. Instead, it remains at the width it had when first mounted.
See recording:
I was able to workaround it with setting width to big number and setting overflow: "hidden" but I don't see it as proper solution.
Expected Behavior
When dynamicWidth changes, the <Line> should recompute its x2="100%" position and redraw to span the full width of its parent <View>.
Actual Behavior
After changing dynamicWidth, the <Svg> container indeed grows, but the <Line> remains stuck at its old length. Only a full re-mount of the <Svg> (for example by changing its key) causes the line to update.
Please let me know if you need any further information or if there’s a recommended workaround!
Steps to reproduce
- Initialize state for the container width:
const [dynamicWidth, setDynamicWidth] = useState(200);
- Render an
<Svg>inside a<View>whose width is driven by that state:<View style={{ width: dynamicWidth }}> <Svg height={DASH_HEIGHT} width="100%" style={styles.dash}> <Line x2="100%" stroke={borderColor} strokeWidth={DASH_HEIGHT} strokeDasharray="5, 2" /> </Svg> </View>
- Change
dynamicWidth(e.g. via button press or layout change):setDynamicWidth(prev => prev + 100);
- Observe that the yellow dashed line (the
<Line>) does not extend to the new width.
Snack or a link to a repository
https://snack.expo.dev/67DG-eFawckFJjnxobrKh
SVG version
15.8.0
React Native version
Expo 52.0.0 / react-native 0.77.1
Platforms
iOS, Android
JavaScript runtime
None
Workflow
None
Architecture
None
Build type
None
Device
None
Device model
No response
Acknowledgements
Yes