版本更改后,一个 Hero widget 不能是另一个 Hero widget 的后代。
创始人
2024-11-20 18:00:44
0

在Flutter的版本更新后,一个 Hero widget不能是另一个Hero widget的后代。在此情况下,可以使用 HeroController 类自定义 Hero 动画。

以下是一个使用 HeroController 自定义 Hero 动画的示例:

import 'package:flutter/material.dart';

class CustomHeroController extends HeroController {
  @override
  Animation createHeroAnimation(
      {required String tag,
      required Animation fromHero,
      required Animation toHero}) {
    return Tween(
      begin: fromHero.value,
      end: toHero.value,
    ).animate(CurvedAnimation(
      parent: super.createHeroAnimation(tag: tag, fromHero: fromHero, toHero: toHero),
      curve: Curves.easeInOut,
    ));
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Custom Hero'),
      ),
      body: Center(
        child: GestureDetector(
          onTap: () {
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => DetailPage(),
              ),
            );
          },
          child: Hero(
            tag: 'hero',
            createRectTween: (begin, end) {
              return RectTween(
                begin: begin,
                end: end,
              );
            },
            child: Container(
              width: 100,
              height: 100,
              color: Colors.blue,
            ),
          ),
        ),
      ),
    );
  }
}

class DetailPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Detail Page'),
      ),
      body: Center(
        child: GestureDetector(
          onTap: () {
            Navigator.pop(context);
          },
          child: Hero(
            tag: 'hero',
            createRectTween: (begin, end) {
              return RectTween(
                begin: begin,
                end: end,
              );
            },
            child: Container(
              width: 200,
              height: 200,
              color: Colors.red,
            ),
          ),
        ),
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(
    home: HomePage(),
    theme: ThemeData(
      heroController: CustomHeroController(),
    ),
  ));
}

在这个示例中,我们自定义了一个 CustomHeroController 类来处理 Hero 动画。在 CustomHeroController 中,我们重写了 createHeroAnimation 方法来创建自定义的动画。然后,我们在 main 方法中将 CustomHeroController 设置为主题数据的一部分。

HomePage 中,我们使用 GestureDetector 包装 Hero,以便在点击时导航到 DetailPageHerotag 属性用于标识 Hero,以便在页面切换时进行匹配。

DetailPage 中,我们也使用了一个 GestureDetector 包装 Hero,并使用相同的 tag 属性。这样,在页面切换时,Hero 将根据 CustomHeroController 中定义的动画进行过渡。

这样,我们就成功地解决了Flutter版本更新后 Hero 的后代问题,并自定义了 Hero 的动画效果。

相关内容

热门资讯

突发!随意玩辅助器视频透视挂!... 突发!随意玩辅助器视频透视挂!果然真的有辅助下载(有挂工具)-哔哩哔哩1、下载好随意玩辅助器视频透视...
截至发稿!微信卡五星辅助器!真... 截至发稿!微信卡五星辅助器!真是真的是有辅助挂(发现有挂)-哔哩哔哩1、截至发稿!微信卡五星辅助器!...
做出回应!衢州都莱破解器!真是... 做出回应!衢州都莱破解器!真是有挂辅助软件(有挂实锤)-哔哩哔哩小薇(辅助器软件下载)致您一封信;亲...
今天下午!八仙游戏辅助!一贯存... 今天下午!八仙游戏辅助!一贯存在有辅助软件(有挂讲解)-哔哩哔哩1、进入到八仙游戏辅助是否有挂之后,...
经调查!道游辅助脚本!确实是真... 经调查!道游辅助脚本!确实是真的辅助脚本(有挂存在)-哔哩哔哩1、全新机制【道游辅助脚本ai辅助工具...
据相关数据显示!陕麻圈黑科技!... 据相关数据显示!陕麻圈黑科技!切实是有辅助软件(有挂详细)-哔哩哔哩1、进入游戏-大厅左侧-新手福利...
不少玩家反映!福州十八扑有外g... 不少玩家反映!福州十八扑有外g挂吗!其实有挂辅助修改器(详细教程)-哔哩哔哩1、完成福州十八扑有外g...
记者获悉!福建兄弟13水辅助!... 记者获悉!福建兄弟13水辅助!总是是真的辅助安装(有挂方式)-哔哩哔哩1、完成福建兄弟13水辅助辅助...
截至目前!天天贵阳app破解版... 截至目前!天天贵阳app破解版!都是真的有辅助插件(有挂解惑)-哔哩哔哩1、实时天天贵阳app破解版...
截至发稿!掌中乐游戏中心云南辅... 截至发稿!掌中乐游戏中心云南辅助!一贯存在有辅助app(有挂规律)-哔哩哔哩掌中乐游戏中心云南辅助是...