跳至主要内容

Navigator 和 Hero Controller 作用域中更严格的断言

摘要

#

当框架检测到一个 Hero Controller 作用域中注册了多个 Navigator 时,会抛出一个断言错误。

上下文

#

Hero Controller 作用域为其 Widget 子树托管一个 Hero Controller。Hero Controller 每次只能支持一个 Navigator。之前,没有断言来保证这一点。

更改说明

#

如果代码在此更改后开始抛出断言错误,则表示代码在此更改之前就已经存在问题。多个 Navigator 可能会在同一个 Hero Controller 作用域下注册,并且当它们的路由发生更改时,它们无法触发 Hero 动画。此更改仅暴露了此问题。

迁移指南

#

一个开始抛出异常的示例应用程序。

dart
import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      builder: (BuildContext context, Widget child) {
        // Builds two parallel navigators. This throws
        // error because both of navigators are under the same
        // hero controller scope created by MaterialApp.
        return Stack(
          children: <Widget>[
            Navigator(
              onGenerateRoute: (RouteSettings settings) {
                return MaterialPageRoute<void>(
                  settings: settings,
                  builder: (BuildContext context) {
                    return const Text('first Navigator');
                  }
                );
              },
            ),
            Navigator(
              onGenerateRoute: (RouteSettings settings) {
                return MaterialPageRoute<void>(
                  settings: settings,
                  builder: (BuildContext context) {
                    return const Text('Second Navigator');
                  }
                );
              },
            ),
          ],
        );
      }
    )
  );
}

可以通过引入您自己的 Hero Controller 作用域来修复此应用程序。

dart
import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      builder: (BuildContext context, Widget child) {
        // Builds two parallel navigators.
        return Stack(
          children: <Widget>[
            HeroControllerScope(
              controller: MaterialApp.createMaterialHeroController(),
              child: Navigator(
                onGenerateRoute: (RouteSettings settings) {
                  return MaterialPageRoute<void>(
                    settings: settings,
                    builder: (BuildContext context) {
                      return const Text('first Navigator');
                    }
                  );
                },
              ),
            ),
            HeroControllerScope(
              controller: MaterialApp.createMaterialHeroController(),
              child: Navigator(
                onGenerateRoute: (RouteSettings settings) {
                  return MaterialPageRoute<void>(
                    settings: settings,
                    builder: (BuildContext context) {
                      return const Text('second Navigator');
                    }
                  );
                },
              ),
            ),
          ],
        );
      }
    )
  );
}

时间线

#

包含于版本:1.20.0
稳定版:1.20

参考资料

#

API 文档

相关问题

相关 PR