Skip to content

Menu component closes and fails to open again on re-render #4763

@julwil

Description

@julwil

Current behaviour

  • Open the Menu component
  • The parent component re-renders
  • Menu component closes and can't be opened again

Expected behaviour

  • Open the Menu component
  • The parent component re-renders
  • Menu component stays open

How to reproduce?

import React, {useState} from 'react';
import {View} from 'react-native';
import {Button, Menu, PaperProvider} from 'react-native-paper';

const MyComponent = () => {
  const [randomVarialbeToForceRerender, setRandomVarialbeToForceRerender] =
    useState(0);
  const [visible, setVisible] = useState(false);

  const openMenu = () => {
    console.debug('Opening menu');
    setVisible(true);

    /**
     * We update a state variable to force a re-render of the component.
     * A real-world example could be a network request or some other
     * asynchronous operation that updates the state.
     */
    setTimeout(() => setRandomVarialbeToForceRerender(Math.random()), 1000);
  };

  const closeMenu = () => {
    setVisible(false);
    console.debug('Closing menu');
  };

  console.debug('visible', visible);
  return (
    <PaperProvider>
      <View
        style={{
          paddingTop: 50,
          flexDirection: 'row',
          justifyContent: 'center',
        }}>
        <Menu
          visible={visible}
          onDismiss={closeMenu}
          anchor={<Button onPress={openMenu}>Show menu</Button>}>
          <Menu.Item
            onPress={() => {}}
            title={`Random  ${randomVarialbeToForceRerender}`}
          />
        </Menu>
      </View>
    </PaperProvider>
  );
};

export default MyComponent;

Preview

Simulator.Screen.Recording.-.iPhone.16.-.2025-06-23.at.12.55.03.mp4

What have you tried so far?

Memoization to avoid re-rendering the menu. However, this approach is limited and breaks
when the menu items are non-static (c.f. example)

Your Environment

software version
ios 18.5
android x
react-native 0.77.2
react-native-paper 5.13.1
node 18.20.8
npm or yarn 3.8.7
expo sdk x.x.x

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions