Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor right buttons #6090

Merged
merged 22 commits into from
Apr 1, 2020
Merged

Refactor right buttons #6090

merged 22 commits into from
Apr 1, 2020

Conversation

guyca
Copy link
Collaborator

@guyca guyca commented Mar 31, 2020

This pr started with an attempt to eliminate button flickering entirely when updating buttons which contain react components via mergeOptions. While the attempt wasn't 100% successful, I dit get some insights in the process.

  • It's not possible to add buttons at specific indices. Buttons contain an order property which determines the order of the button in the TopBar. To somewhat overcome this limitation, we can let users control button order via options.

  • When a right most component button is replaced with another component button, the rest of the buttons shift to the right since the newly added component isn't measured when it's added to the menu and its width is zero.
    We usually handle this situation with the waitForRender option but since buttons are measured with MeasureSpec.UNSPECIFIED, their dimensions are zero. Because of this, I've added options to set button dimensions.

  • When updating buttons via mergeOptions, if a component button is already added to the menu with the same order we will not remove and added it again. This mitigates flickering in some situations.

  • Textual button style properties were applied by traversing the view hierarchy and searching for the TextView corresponding to the button and updating its styles directly.
    There was an inherent bug in this logic where if two buttons contained the same text, styles could have been applied to the wrong TextView. We now apply styles directly on the button using spans.

@guyca guyca requested a review from yogevbd March 31, 2020 10:14
yogevbd
yogevbd previously approved these changes Mar 31, 2020
@jinshin1013
Copy link
Contributor

@guyca Is there any chance to also have a look at #5960 🙏

@guyca guyca merged commit 42a6917 into master Apr 1, 2020
@guyca guyca deleted the mergeButtonsFlicker branch April 1, 2020 13:53
stachu2k pushed a commit to stachu2k/react-native-navigation that referenced this pull request Apr 8, 2020
Refactor right buttons

This pr started with an attempt to eliminate button flickering entirely when updating buttons which contain react components via mergeOptions. While the attempt wasn't 100% successful, I dit get some insights in the process.

* It's not possible to add buttons at specific indices. Buttons contain an order property which determines the order of the button in the TopBar. To somewhat overcome this limitation, we can let users control button order via options.

* When a right most component button is replaced with another component button, the rest of the buttons shift to the right since the newly added component isn't measured when it's added to the menu and its width is zero. 
We usually handle this situation with the `waitForRender` option but since buttons are measured with `MeasureSpec.UNSPECIFIED`, their dimensions are zero. Because of this, I've added options to set button dimensions.

* When updating buttons via mergeOptions, if a component button is already added to the menu with the same order we will not remove and added it again. This mitigates flickering in some situations.

* Textual button style properties were applied by traversing the view hierarchy and searching for the TextView corresponding to the button and updating its styles directly.
There was an inherent bug in this logic where if two buttons contained the same text, styles could have been applied to the wrong TextView. We now apply styles directly on the button using spans.
stachu2k pushed a commit to stachu2k/react-native-navigation that referenced this pull request Apr 8, 2020
stachu2k pushed a commit to stachu2k/react-native-navigation that referenced this pull request Apr 8, 2020
guyca added a commit that referenced this pull request May 17, 2020
Updating button options with mergeOptions stopped working in 6.5.0. The regression was introduced by #6090. When updating buttons, RNN didn't take button options into account when checking if two buttons are equal, instead it checked only by button id.

closes #6205
guyca added a commit that referenced this pull request May 17, 2020
Updating button options with mergeOptions stopped working in 6.5.0. The regression was introduced by #6090. When updating buttons, RNN didn't take button options into account when checking if two buttons are equal, instead it checked only by button id.

closes #6205

Co-authored-by: Yogev Ben David <[email protected]>
guyca added a commit that referenced this pull request May 18, 2020
Updating button options with mergeOptions stopped working in 6.5.0. The regression was introduced by #6090. When updating buttons, RNN didn't take button options into account when checking if two buttons are equal, instead it checked only by button id.

closes #6205

Co-authored-by: Yogev Ben David <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants