mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
This PR adds a shared element transition for predictive back navigation, based on the specification found here: https://developer.android.com/design/ui/mobile/guides/patterns/predictive-back#shared-element-transition. A new transition builder added: `PredictiveBackPageSharedElementTransitionsBuilder`, which constructs the shared element transition version. <details><summary>Code sample</summary> ```dart import 'package:flutter/material.dart'; void main() { runApp(const MainApp()); } class MainApp extends StatelessWidget { const MainApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData( brightness: Brightness.light, pageTransitionsTheme: const PageTransitionsTheme( builders: { TargetPlatform.android: PredictiveBackPageSharedElementTransitionsBuilder(), }, ), ), home: const FirstScreen(), ); } } class FirstScreen extends StatelessWidget { const FirstScreen({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('First Screen'), ), body: Center( child: ElevatedButton( onPressed: () { Navigator.of(context).push( MaterialPageRoute(builder: (_) => const SecondScreen()), ); }, child: const Text('Go to Second Screen'), ), ), ); } } class SecondScreen extends StatelessWidget { const SecondScreen({super.key}); @override Widget build(BuildContext context) { return Theme( data: ThemeData(brightness: Brightness.dark), child: Scaffold( appBar: AppBar( title: const Text('Second Screen'), ), body: const Center( child: Text('Hello, Predictive back!'), ), ), ); } } ``` </details> [predictive_back_shared_element.webm](https://github.com/user-attachments/assets/1194cf09-c64f-4b1f-aa3f-10feb0ef12bd) Partial fix for #153577 --------- Co-authored-by: Justin McCandless <jmccandless@google.com>