woltapp / wolt_modal_sheet

This package provides a responsive modal with multiple pages, motion animation for page transitions, and scrollable content within each page.
MIT License
512 stars 65 forks source link

onCurrentPageChanged with ID and index #251

Open blingkonnerth opened 4 months ago

blingkonnerth commented 4 months ago

I would love have a onPageChanged - Callback.

I would expect it to look something like this:

onCurrentPageChanged: (newPageId, index) {
// ... do some stuff here
}

This came up when I wanted to build in tracking for the bottomsheet. I had this method before:

  static void _handleTracking({
    required BuildContext context,
    required List<UIBottomSheetPageModel> pages,
    required int currentIndex,
    required ValueNotifier<int> pageIndexNotifier,
  }) {
    // Since the views inside the bottom sheet are not actual routes,
    // we need to track the navigation manually.

    final firstPage = pages[0];

    // Track initial page
    context.appDelegate.trackNavigation(
      navigationType: UINavigationType.push,
      routeName: firstPage.trackingName,
      trackWithSegment: true,
    );

    // Track navigation inside the modal sheet
    pageIndexNotifier.addListener(() {
      final newIndex = pageIndexNotifier.value;
      final newPage = pages[newIndex];

      context.appDelegate.trackNavigation(
        navigationType: newIndex > currentIndex
            ? UINavigationType.push
            : UINavigationType.pop,
        routeName: newPage.trackingName,
        trackWithSegment: true,
      );
      currentIndex = newIndex;
    });
  }

But this will obviously not work when dealing with dynamic routes or even when pushing or popping. It will only work if all pages are constant.

I guess I could get hacky here and still manage to make it work, but everything would be solved, by a simply onCurrentPageChanged - callback (getting the id of the new page and index would be crucial here).

ulusoyca commented 4 months ago

Brilliant idea. Would you consider opening a PR?

blingkonnerth commented 4 months ago

I wish I could, but I don't quite understand where exactly I have to call it .. I will give it another try later this week.

blingkonnerth commented 4 months ago

@ulusoyca I looked into it but wasn't able to get it properly done. When looking into it, I think instead of just passing the id, passing the whole page would be even better for more flexibility?

ulusoyca commented 4 months ago

@MbIXjkee is currently managing the work that will add internal navigation system to the modal. Adding a navigation observer will solve this. Expected to be released in the 0.8.x.

blingkonnerth commented 4 months ago

"interntal navigation observer" sounds perfect! @MbIXjkee 🫶

ulusoyca commented 4 months ago

Correction: It is a long work and expected in 0.9.x https://github.com/woltapp/wolt_modal_sheet/pull/271