Flutter中实现Hero Page Route效果

在Flutter中实现Hero动画的页面路由效果,主要通过共享元素的平滑过渡来提升用户体验。以下是关键实现步骤和技术要点:

核心实现原理

  1. ‌Hero组件 ‌:需在源页面和目标页面使用相同tag标识的Hero组件包裹共享元素(如图片或控件),系统会自动计算过渡路径并执行动画26。
  2. ‌路由跳转 ‌:通过Navigator.push触发页面切换,Hero动画会在路由切换过程中自动执行3。
  3. ‌动画控制 ‌:默认使用MaterialRectArcTween实现位置和形状的插值动画,可通过自定义PageRouteBuilder调整过渡效果67。

代码实现示例

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return MaterialApp(

home: HeroSourcePage(),

);

}

}

class HeroSourcePage extends StatelessWidget {

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(title: Text('源页面')),

body: Center(

child: GestureDetector(

child: Hero(

tag: 'heroTag', // 唯一标识

child: Container(

width: 100,

height: 100,

color: Colors.blue,

),

),

onTap: () => Navigator.push(

context,

MaterialPageRoute(builder: (_) => HeroTargetPage()),

),

),

),

);

}

}

class HeroTargetPage extends StatelessWidget {

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(title: Text('目标页面')),

body: Center(

child: Hero(

tag: 'heroTag', // 与源页面相同tag

child: Container(

width: 200,

height: 200,

color: Colors.red,

  1. ‌tag一致性 ‌:源页面和目标页面的Hero组件必须使用相同的tag,否则动画失效23。
  2. ‌路由配置 ‌:可通过PageRouteBuilder自定义过渡动画时长和效果,如渐隐或滑动7。
  3. ‌复杂场景 ‌:支持多Hero动画并行,但同一页面内的多个Hero需使用不同tag6。

高级应用

  • ‌Dialog路由‌:Hero动画同样适用于Dialog等非全屏路由3。
  • ‌自定义动画 ‌:通过transitionsBuilder重写默认动画逻辑,如结合缩放和旋转效果。

完整示例可通过调整Container的子控件(如Image)实现图片缩放的动态效果

相关推荐
excel13 小时前
Nuxt 中 useSeoMeta 与 useHead 的区别
前端
竹林81813 小时前
OmniGame 技术白皮书:从零依赖到 WebRTC P2P,重新定义网页小游戏的工程上限
前端·浏览器
ss27313 小时前
AI全栈实战 | 2.1-02 CSS 布局:垂直居中为什么是经典面试题?所有布局在解决什么矛盾
前端·css
律宏阔13 小时前
Flutter Riverpod 3:统一打印 Provider 错误与自动重试日志
前端·flutter
周洲083013 小时前
STM32片内Flash读写深度详解|掉电参数保存、底层原理
linux·前端·stm32
data analyse 45614 小时前
埋点工具的私有化部署成本高吗?
前端·数据分析·github
data analyse 45614 小时前
埋点工具的埋点查询语言难学吗?
前端·数据分析
DianSan_ERP14 小时前
多平台订单自动下载与回传的技术实现:从消息推送到状态闭环引言
java·linux·服务器·前端·网络·架构·自动化
恋猫de小郭14 小时前
Shopify 回应为什么从 RN 回到原生,为什么不用 KMP ?
android·前端·flutter
小蜗 strong15 小时前
和电脑猜拳(随机程序应用)
服务器·前端·python