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

Add API to detect back navigation #62

Open
omartinma opened this issue Aug 11, 2021 · 2 comments
Open

Add API to detect back navigation #62

omartinma opened this issue Aug 11, 2021 · 2 comments
Assignees
Labels
enhancement New feature or request waiting for response Waiting for additional information

Comments

@omartinma
Copy link

omartinma commented Aug 11, 2021

Is your feature request related to a problem? Please describe.
Let's say we have a list of items. Clicking on an item will navigate to the details of this item. Normally to handle that we will have on the state of our flow with a property Item? so if the item is null we know we should be on the list page, else we should be on the details page.

The problem comes if you try to navigate back from details to the list page again. Typically we can handle that just overriding the back button or using will pop scope.

  • Problem with will pop scope: it will not work with the native back button on Android and swipe navigation on iOS.

  • Problem with the back button: we will have to handle the view of this navigation inside the details page itself. So if we have a big flow we might suffer more than expected.

Describe the solution you'd like
I would like to have a new API that informs whether the user pops a page.
Then we have 2 choices for updating the state:

  1. I will need also maybe the page that is popping and I will manually check what I need to do, in this case clear the item of the state.
  2. Have a similar approach to the ReplayBloc with the undo.

I think number 1 should be easier to develop in the flow builder package, but developers will need to handle these cases anyway. Number 2 seems more complicated but developers will not need to do anything.

Additional context
This is an issue If you are using external state management, in my case, bloc.

@felangel felangel added the enhancement New feature or request label Oct 13, 2021
@felangel felangel self-assigned this Nov 3, 2021
@alestiago
Copy link
Contributor

alestiago commented Aug 18, 2022

You can use a NavigationObserver to detect back pops, this may solve (1).

For example, with the current API one can detect back navigation as follows:

  @override
  Widget build(BuildContext context) {
    return FlowBuilder<MyState>(
      state: context.watch<MyBloc>().state,
      onGeneratePages: onGeneratePages,
      observers: [
        _PopObserver(
          onPop: () => context.read<MyBloc>().add(const Popped()),
        )
      ],
    );
  }
}

class _PopObserver extends NavigatorObserver {
  _PopObserver({
    this.onPop,
  });

  final VoidCallback? onPop;

  @override
  void didPop(Route route, Route? previousRoute) {
    super.didPop(route, previousRoute);
    onPop?.call();
  }
}

However, I do believe FlowBuilder should expose a better API for detecting back navigation. One of the possible APIs could be adding an onChangedPages to FlowBuilder. I would expect onChangedPages to be called whenever the stack of pages changes.

Something as:

@override
  Widget build(BuildContext context) {
    return FlowBuilder<MyBlocState>(
      state: context.watch<MyBloc>().state,
      onChangedPages: (List<Page<void>> previous,  List<Page<void>> current) {}
      onGeneratePages: onGeneratePages,
    );
  }

So, one could detect a page has been poped by, for example, checking that the last element has changed.

Another alternative would be to provide a FlowNavigatorObserver or similar.

@felangel
Copy link
Owner

Hi @alestiago 👋

onDidPop was added as part of #99. Can you take a look and let me know if that satisfies your requirements?

@felangel felangel added the waiting for response Waiting for additional information label Aug 18, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request waiting for response Waiting for additional information
Projects
None yet
Development

No branches or pull requests

3 participants