felangel / flow_builder

Flutter Flows made easy! A Flutter package which simplifies navigation flows with a flexible, declarative API.
https://pub.dev/packages/flow_builder
MIT License
389 stars 63 forks source link

When the AppFlowData changes, every page in the stack is rebuilt (can I get around it?) #47

Open LucaDillenburg opened 3 years ago

LucaDillenburg commented 3 years ago

Describe the bug This is probably more of a question than an actual bug. Every change I make to the AppFlowData causes every page that is in the stack to rebuild itself. The problem is that I need for a particular page (the homepage) to show some animations and perform an API call when it first loads, however, when the home page adds another page to the stack or the page added is popped, for example, the homepage is rebuilt, showing the animation again and calling the API once more. This is not the same behavior as if you are using named routes in the MaterialApp. I want to know if this is the expected behavior and how (if possible) I can get around it.

To Reproduce Steps to reproduce the behavior:

  1. Create two pages and a FlowBuilder that starts only with one of them
  2. On a button click on the first page, change the FlowData to add the other page to the stack
  3. When you click the button (or pop the second page for that matter) you will realize that the first page was rebuilt.

I made an example in this repository.

Expected behavior I believe the expected behavior should be the same as if you were using Flutter's regular routes system (MaterialRoute with routes property): when a page is added or removed from the stack, the other pages are not rebuilt.

duan-daniel commented 2 years ago

Ran into the same issue with your reproduction sample. Upon further testing, it seems that when there are multiple pages in the navigation stack, whenever context.flow<FlowState>().update() is called with a change to FlowState all the pages provided in onGeneratePages get rebuilt.

A workaround could be to modify your flow state so that the home page is not included in onGeneratePages after you navigate to a new page. For example, in your flow_navigation reproduction sample you can modify routes.dart accordingly:

onGeneratePages: (state, pages) => [
  if (!state.subpage)
    MaterialPage<void>(
      child: Home(),
    ),
  if (state.subpage)
    MaterialPage<void>(
      child: Subpage(),
    ),
],

This way, once context.flow<AppFlowData>().update((data) => data.copyWith(subpage: true)) is called Home will not be included in the onGeneratePages list and won't get rebuilt.

omartinma commented 2 years ago

I'm able to reproduce this on the onboarding example of this repo @felangel You can see that if you are in welcome page and navigates to the next, this welcome page will be rebuilt