导航器和 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');
}
);
},
),
],
);
}
)
);
}
您可以通过引入自己的英雄控制器作用域来修复此应用。
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