17

我正在尝试在我的第一个颤振应用程序中使用英雄动画,但是已经有类似底部导航的 Instagram 使用这种方法实现了,我发现英雄动画在嵌套导航器中不起作用。

例如,您可以从此处获取完整示例并从类替换为home: MainScreen(),HeroApp

home: Navigator(onGenerateRoute: (_) {
  return MaterialPageRoute(builder: (_) => MainScreen());
}),

和英雄动画将打破。

也许还有其他一些方法可以为每个选项卡实现具有独立堆栈的底部导航,它们不使用嵌套导航器,但我还没有找到。

因此,非常感谢任何建议。

UPD:我刚刚意识到答案应该在MaterialApp课堂和宾果游戏中!

有一个简单的解决方案有效:

home: Navigator(
  onGenerateRoute: (_) => MaterialPageRoute(builder: (_) => MainScreen()),
  observers: [HeroController()],
),

但是在MaterialApp源代码中事情稍微复杂一点,所以也许有一些隐藏的东西,打破了我天真的解决方案。因此问题仍然存在。

4

1 回答 1

23

这是因为Hero依赖于一个HeroController , MaterialApp中的导航器有但你的自定义导航器没有,要解决这个问题,只需添加控制器,就像这样。

import 'package:flutter/material.dart';

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  HeroController _heroController;

  @override
  void initState() {
    super.initState();
    _heroController = HeroController(createRectTween: _createRectTween);
  }

  @override
  Widget build(BuildContext context) {
    return Navigator(
      observers: [_heroController],
      onGenerateRoute: (settings) {
        return MaterialPageRoute(
            settings: settings, builder: (context) => Text(''));
      },
    );
  }

  RectTween _createRectTween(Rect begin, Rect end) {
    return MaterialRectArcTween(begin: begin, end: end);
  }
}
于 2020-03-17T19:36:48.200 回答