When i use navigator nested in MaterialApp that contains a navigator, there is shadow as showed in the following image.
Why? How to remove this shadow?

My code is here:
import 'package:flutter/material.dart';
void main() => runApp(NavigatorNested());
class NavigatorNested extends StatefulWidget {
@override
NavigatorNestedState createState() => NavigatorNestedState();
}
class NavigatorNestedState extends State<NavigatorNested> {
@override
Widget build(BuildContext context) {
return MaterialApp(
initialRoute: 'hpme',
title: 'test',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('helle world'),
),
body: Container(
margin: EdgeInsets.symmetric(vertical: 48, horizontal: 24),
child: Navigator(
onGenerateRoute: (settings) {
return MaterialPageRoute<dynamic>(
settings: settings,
builder: (context) {
return Text('helle world');
});
},
onUnknownRoute: (settings) {
return MaterialPageRoute<dynamic>(
settings: settings,
builder: (context) {
return Text('helle world');
});
},
initialRoute: "home",
),
),
),
);
}
}
If i use Text('hello') to replace Navigator, it works goods. Is it a bug in flutrer?
Step 1: Add the Container widget. Step 2: Add the decoration parameter (inside Container) and assign the BoxDecoration class. Step 3: Add the boxShadow parameter (inside BoxDecoration) and assign the BoxShadow class. Step 4: Add the blurRadius parameter (inside BoxShadow) and set the value to 25.
By using the Navigator. pop() method. The pop() method removes the current Route from the stack of routes managed by the Navigator .
MaterialPageRoute is not a Material Widget itself. This shadow only occurs on iOS and is coming from the buildPageTransitions method in CupertinoPageRoute class....
When using a MaterialPageRoute Flutter looks at your pageTransitionsTheme and by default on iOS returns a CupertinoPageRouteTransitionsBuilder and Android a FadeUpwardsPageTransitionsBuilder
The shadow is part of iOS' default page transition but there might be good reasons why one doesn't want these to show up.
See: https://api.flutter.dev/flutter/material/PageTransitionsTheme-class.html https://raw.githubusercontent.com/flutter/flutter/master/packages/flutter/lib/src/cupertino/route.dart
There are a couple of solutions:
(1) Using a custom PageRouteBuilder (and building your own transitions) as suggested earlier works but it will break the default "swipe back" gesture on iOS that is implemented in CupertinoPageRoute.
(2) Define FadeUpwardsPageTransitionsBuilder as the default transition on iOS also. But again this will break the swipe back gesture on iOS.
MaterialApp(
theme: ThemeData(
pageTransitionsTheme: PageTransitionsTheme(
builders: {
TargetPlatform.iOS: FadeUpwardsPageTransitionsBuilder(),
TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(),
}
),
),
...
)
(3) Subclass CupertinoPageTransition and override build. Inside the build function there is an animation _primaryShadowAnimation that you don't need. This will keep the swipe back gesture on iOS intact. You would also have to subclass some parent classes such as CupertinoPageRouteTransitionsBuilder to return your custom CupertinoPageTransition instead
So instead of:
# file: packages/flutter/lib/src/cupertino/route.dart, lines: 407-410
child: DecoratedBoxTransition(
decoration: _primaryShadowAnimation,
child: child,
),
you return child directly:
child: child,
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With