Navigator 和 Hero Controller Scope 中更严格的断言
概述
#当框架检测到一个 Hero Controller Scope 中注册了多个 Navigator 时,它会抛出一个断言错误。
背景
#Hero Controller Scope 为其 Widget 子树托管一个 Hero Controller。Hero Controller 一次只能支持一个 Navigator。以前,并没有断言来保证这一点。
变更说明
#如果代码在此更改后开始抛出断言错误,这意味着该代码在此更改之前就已经存在问题。同一个 Hero Controller Scope 下可能注册了多个 Navigator,并且当它们的路由发生变化时,它们无法触发 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 Scope 来修复此应用程序。
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