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

Expose keys in useState #441

Open
timcreatedit opened this issue Aug 12, 2024 · 5 comments
Open

Expose keys in useState #441

timcreatedit opened this issue Aug 12, 2024 · 5 comments
Assignees
Labels
enhancement New feature or request

Comments

@timcreatedit
Copy link
Contributor

timcreatedit commented Aug 12, 2024

Is your feature request related to a problem? Please describe.
Multiple times now I've been surprised by the fact that useState doesn't allow for setting custom keys that trigger a reevaluation of the state. A simple use-case is rebuilding a widget whenever a PageController page changes.

Widget build(BuildContext context) {
    final page = useState(pageController.initialPage);
    return PageView(
       controller: pageController,
       onPageChanged: (value) => page.value = value,
      //  ...
    );
}

This code works in principle, until pageController changes. This change will not get picked up by useState.

Describe the solution you'd like
Add optional keys to the useState hook.

final page = useState(pageController.initialPage, keys: [pageController]);
// ...

Describe alternatives you've considered
For the given example, one might suggest useListenable, but that will rebuild way too often.

Another option would be:

useEffect(() {
  page.value = pageController.initialValue;
}, [pageController]);

However, this is verbose, imperative, and not really readable (it might also add an extra rebuild?).

Additional Context:
Riverpods StateProvider is a nice example for a bridge between declarative re-evaluation using ref and imperative modification using .state

@rrousselGit
Copy link
Owner

That's just how it is in React

@timcreatedit
Copy link
Contributor Author

Meaning you would not want to touch it? I feel like an optional parameter is a nice escape hatch, while keeping the default behaviour consistent with react

@timcreatedit
Copy link
Contributor Author

timcreatedit commented Aug 13, 2024

Seems like #347 was also looking for this. At least a keys parameter could've covered their use-case. And just to be clear I'm not advocating for changing any current behaviour, it makes sense for useState(x) to not recompute when x changes, since React does it that way. But having the option to opt-in by saying useState(x, keys: [x]) could be powerful.

It could also help alleviate some of the confusion, since the keys parameter and its default value would be visible, so people could see that x is not part of the hooks keys by default.

@rrousselGit
Copy link
Owner

I'd rather not have the core React hooks deviate too much from React.
We can add new hooks if need be

@andrerpena
Copy link

I see the reasoning for requesting this feature, and I have also wished React had the same.
But I do agree with not deviating much from React. Apart from breaking expectations, it can happen that we're not seeing weird edge-cases that caused React to be like that in the first place.

btw, @rrousselGit , unrelated, but I love this library. I can't think of any better state manager. I wonder why hooks are not a core part of Flutter itself. Thanks for doing this ❤️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants