Reenable fade transition for Material page transition (#13048) (#13680)

Fixes #12877 by reverting #9472
diff --git a/packages/flutter/lib/src/material/page.dart b/packages/flutter/lib/src/material/page.dart
index 036d4bc..40e40de 100644
--- a/packages/flutter/lib/src/material/page.dart
+++ b/packages/flutter/lib/src/material/page.dart
@@ -24,9 +24,14 @@
          parent: routeAnimation, // The route's linear 0.0 - 1.0 animation.
          curve: Curves.fastOutSlowIn,
        )),
+       _opacityAnimation = new CurvedAnimation(
+         parent: routeAnimation,
+         curve: Curves.easeIn, // Eyeballed from other Material apps.
+       ),
        super(key: key);
 
   final Animation<Offset> _positionAnimation;
+  final Animation<double> _opacityAnimation;
   final Widget child;
 
   @override
@@ -34,7 +39,10 @@
     // TODO(ianh): tell the transform to be un-transformed for hit testing
     return new SlideTransition(
       position: _positionAnimation,
-      child: child,
+      child: new FadeTransition(
+        opacity: _opacityAnimation,
+        child: child,
+      ),
     );
   }
 }
diff --git a/packages/flutter/test/material/page_test.dart b/packages/flutter/test/material/page_test.dart
index d7944a8..5841beb 100644
--- a/packages/flutter/test/material/page_test.dart
+++ b/packages/flutter/test/material/page_test.dart
@@ -28,6 +28,8 @@
     await tester.pump();
     await tester.pump(const Duration(milliseconds: 1));
 
+    Opacity widget2Opacity =
+        tester.element(find.text('Page 2')).ancestorWidgetOfExactType(Opacity);
     Offset widget2TopLeft = tester.getTopLeft(find.text('Page 2'));
     final Size widget2Size = tester.getSize(find.text('Page 2'));
 
@@ -35,8 +37,10 @@
     expect(widget1TopLeft.dx == widget2TopLeft.dx, true);
     // Page 1 is above page 2 mid-transition.
     expect(widget1TopLeft.dy < widget2TopLeft.dy, true);
-    // Animation begins from the top of the page.
-    expect(widget2TopLeft.dy < widget2Size.height, true);
+    // Animation begins 3/4 of the way up the page.
+    expect(widget2TopLeft.dy < widget2Size.height / 4.0, true);
+    // Animation starts with page 2 being near transparent.
+    expect(widget2Opacity.opacity < 0.01, true);
 
     await tester.pump(const Duration(milliseconds: 300));
 
@@ -48,10 +52,14 @@
     await tester.pump();
     await tester.pump(const Duration(milliseconds: 1));
 
+    widget2Opacity =
+        tester.element(find.text('Page 2')).ancestorWidgetOfExactType(Opacity);
     widget2TopLeft = tester.getTopLeft(find.text('Page 2'));
 
     // Page 2 starts to move down.
     expect(widget1TopLeft.dy < widget2TopLeft.dy, true);
+    // Page 2 starts to lose opacity.
+    expect(widget2Opacity.opacity < 1.0, true);
 
     await tester.pump(const Duration(milliseconds: 300));