There is an interesting problem. I'm using Flutter 2.0 in my app. It has a bottom navigation bar. When I push to the new screen using "Navigator.of(context, rootNavigator: true)" along with the new screen, the screen that provides navigation is also rebuilding.

CategoriesView build() method

@override
Widget build(BuildContext context) {
   print("Building: CategoryView");
   return mobileBody;
}

ProductDetailView build() method

  @override
  Widget build(BuildContext context) {
    print("Building: ProductDetailView");
    return mobileBody;
  }

When i use the "context.rootNavigator.pushNamed(ProductDetailView.route);" in CategoryView output is:

I/flutter (21910): Building: ProductDetailView
I/flutter (21910): Building: CategoryView 

Without rootNavigator output is (context.navigator.pushNamed(ProductDetailView.route);):

I/flutter (21910): Building: ProductDetailView

Navigator extensions:

extension NavigationExtension on BuildContext {
  NavigatorState get rootNavigator => Navigator.of(this, rootNavigator: true);
  NavigatorState get navigator => Navigator.of(this);
}

Why is this happening? How can I prevent this?


Solution 1: LX Guo

I have met the same issue too, currently use a StatefulWidget wrapper for it.

class WrapperStateless extends StatefulWidget {
  const WrapperStateless({Key key}) : super(key: key);

  @override
  _WrapperStatelessState createState() => _WrapperStatelessState();
}

class _WrapperStatelessState extends State<WrapperStateless> {
  TabA tabA;
  @override
  void initState() {
    super.initState();
    tabA = TabA();
  }

  @override
  Widget build(BuildContext context) {
    // return tabA;
    return tabA;
  }

  @override
  void didUpdateWidget(WrapperStateless oldWidget) {
    super.didUpdateWidget(oldWidget);
    // setState(() {});
  }
}