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
除非另有说明,否则本网站上的文档反映了 Flutter 的最新稳定版本。页面上次更新时间为 2024-04-04。 查看源代码 或 报告问题.