【发布时间】:2020-06-18 19:49:57
【问题描述】:
我想立即创建从一个屏幕到另一个屏幕的过渡(无动画)。然而 isInitialRoute 会由于 Router 小部件的更新而产生错误。建议是使用 onGenerateInitialRoutes 但我不知道如何实现它。
颤振设计文档建议这样做: 路线和路线设置 目前,在不播放其入口动画的情况下将 Route 添加到历史堆栈的唯一方法是在其 RouteSettings 中将其标记为初始路由。声明式 API 要求可以随时添加不带动画的路由。当该路线被另一条路线覆盖并且播放动画根本没有意义时,这很有用。为了支持这一点,在 Route 接口中添加了一个 didAdd 方法。这个方法由 Navigator 调用而不是 didPush 当 Route 应该被添加而没有它的常规入口动画时。为简化起见,这种新方法还将用于将初始路线显示在屏幕上。这使得 RouteSettings.initialRoute 参数无用,并将从 RouteSettings 中删除。这是一个小的重大更改。
这是在 isInitialRoute 上生成错误的代码:
import 'package:flutter/cupertino.dart'
show
CupertinoApp,
CupertinoButton,
CupertinoPageRoute,
CupertinoPageScaffold;
import 'package:flutter/widgets.dart'
show
BuildContext,
Center,
Column,
Navigator,
Route,
RouteSettings,
SafeArea,
Spacer,
Text,
runApp,
Widget;
Widget makeButton(BuildContext context, String routeName) =>
new CupertinoButton(
onPressed: () => Navigator.pushReplacementNamed(context, routeName),
child: Text('Go to \'$routeName\''),
);
Route generateRoute(RouteSettings settings) {
switch (settings.name) {
case 'not-animated':
return new CupertinoPageRoute(
settings: RouteSettings(name: settings.name, isInitialRoute: true),
builder: (context) => CupertinoPageScaffold(
child: SafeArea(
child: Center(
child: Column(
children: [
Spacer(),
Text('This is \'not-animated\''),
makeButton(context, 'animated'),
Spacer(),
],
),
),
),
),
);
default:
return null;
}
}
void main() {
runApp(
CupertinoApp(
onGenerateRoute: generateRoute,
initialRoute: 'animated',
routes: {
'animated': (context) => CupertinoPageScaffold(
child: SafeArea(
child: Center(
child: Column(
children: [
Spacer(),
Text('This is \'animated\''),
makeButton(context, 'not-animated'),
Spacer(),
],
),
),
),
),
},
),
);
}
【问题讨论】:
标签: flutter