Giter VIP home page Giter VIP logo

Comments (2)

HE-LU avatar HE-LU commented on June 28, 2024

So, I come up with a theory.

Looks like PopScope implements PopEntry. registerPopEntry should always register to the top route, which happens inside didChangeDependencies() method. For me, this method is not called when pushing other children's routes. This mean that other children routes pushed atop, are not registered, and PopScopes canPopNotifier is not used.

from auto_route_library.

HE-LU avatar HE-LU commented on June 28, 2024

So I think I finally solved the issue for my case. I will try to describe the solution as best I can.

Let's take for example one nested page from my example above, e.g. IdentityVerificationStepTaxId. This page has two "states" which means two content widgets. First _SelectIdTypeDataStateWidget and second _FillNationalIdDataStateWidget. This means, that once the user selects ID type, the second widget is presented to him.

My solution was to wrap the whole content inside _FillNationalIdDataStateWidget (the second one) with PopScope the following way:

return PopScope(
  canPop: false,
  onPopInvoked: (didPop) => stateNotifier.clearSelectTaxIdType(),
  child: Container(

This will handle the back button on that page, and always block the maybePop. It will also invoke the clearSelectTaxIdType, which will switch UI back to _SelectIdTypeDataStateWidget (the first one). The second widget gets disposed, including the PopScope handler, and on the second maybePop, the navigator will switch to the previous nested screen.

This solves half of my issue, with blocking of the navigation on a specific page. The second issue is to get notified every time the navigation changes, and I actually change the child navigation, which I am currently handling using NavigationObserver.

This means that on the root IdentityVerificationPage, I have a custom nav observer, and I am handling the pop there manually. Here is a code snippet:

class _NavigationObserver extends AutoRouterObserver {
  _NavigationObserver({
    required this.onDidPop,
  });

  final void Function() onDidPop;

  @override
  void didPop(Route route, Route? previousRoute) {
    onDidPop();
    super.didPop(route, previousRoute);
  }
}
AutoRouter(
  navigatorObservers: () => [
    _NavigationObserver(
      onDidPop: () => stateNotifier.onPopInvoked(),
    ),
  ],
)

from auto_route_library.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.