Flutter,在使用 WidgetBuilder 配置我的路由时不确定如何实现 PageRouteBuilder()
Flutter, not sure how to implement a PageRouteBuilder(), when using a WidgetBuilder to configure my routes
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: codGray,
body: Navigator(
key: _navigatorKey,
initialRoute: '/',
onGenerateRoute: (RouteSettings settings) {
WidgetBuilder builder;
// Manage your route names here
switch (settings.name) {
case '/':
builder = (BuildContext context) => ProviderPage();
break;
case '/chats':
builder = (BuildContext context) => ChatProviderPage();
break;
case '/addPoll':
builder = (BuildContext context) => AddPollPage();
break;
case '/friends':
builder = (BuildContext context) => ProfileProviderPage();
break;
case '/settings':
builder = (BuildContext context) => SettingsProviderPage();
break;
default:
throw Exception('Invalid route: ${settings.name}');
}
return MaterialPageRoute(
builder: builder,
settings: settings,
);
},
),
}
这是我的项目的一个片段,我试图在页面之间转换时实现自定义动画,但是由于我使用自定义导航器进行路由,它使用 WidgetBuilder,所以我不确定如何实现自定义 PageRouteBuilder(),它使用 WidgetBuilder 构建器在页面之间进行转换。
您可以像这样直接 return MaterialPageRoute
或 PageRouteBuilder
来做到这一点。
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: codGray,
body: Navigator(
key: _navigatorKey,
initialRoute: '/',
onGenerateRoute: (RouteSettings settings) {
switch (settings.name) {
case '/':
return MaterialPageRoute(
builder: (BuildContext context) => ProviderPage(),
settings: settings,
);
case '/chats':
return MaterialPageRoute(
builder: (BuildContext context) => ChatProviderPage(),
settings: settings,
);
case '/customTransition':
return PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) => Page(),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return child;
},
);
default:
throw Exception('Invalid route: ${settings.name}');
}
},
),
}
虽然你可以在这里重构很多东西,使其更具可读性和可维护性
- 您可以在
Navigator
小部件 中提取给定 onGenerateRoute
参数的这个函数
- 为路由使用常量。它使它更易读,并且不易因打字错误而出错。
- 您可以使用自己的 class 创建扩展
PageRouteBuilder
,它采用 Widget
类型的子参数,其余所有转换逻辑都在 class 中。
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: codGray,
body: Navigator(
key: _navigatorKey,
initialRoute: '/',
onGenerateRoute: (RouteSettings settings) {
WidgetBuilder builder;
// Manage your route names here
switch (settings.name) {
case '/':
builder = (BuildContext context) => ProviderPage();
break;
case '/chats':
builder = (BuildContext context) => ChatProviderPage();
break;
case '/addPoll':
builder = (BuildContext context) => AddPollPage();
break;
case '/friends':
builder = (BuildContext context) => ProfileProviderPage();
break;
case '/settings':
builder = (BuildContext context) => SettingsProviderPage();
break;
default:
throw Exception('Invalid route: ${settings.name}');
}
return MaterialPageRoute(
builder: builder,
settings: settings,
);
},
),
}
这是我的项目的一个片段,我试图在页面之间转换时实现自定义动画,但是由于我使用自定义导航器进行路由,它使用 WidgetBuilder,所以我不确定如何实现自定义 PageRouteBuilder(),它使用 WidgetBuilder 构建器在页面之间进行转换。
您可以像这样直接 return MaterialPageRoute
或 PageRouteBuilder
来做到这一点。
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: codGray,
body: Navigator(
key: _navigatorKey,
initialRoute: '/',
onGenerateRoute: (RouteSettings settings) {
switch (settings.name) {
case '/':
return MaterialPageRoute(
builder: (BuildContext context) => ProviderPage(),
settings: settings,
);
case '/chats':
return MaterialPageRoute(
builder: (BuildContext context) => ChatProviderPage(),
settings: settings,
);
case '/customTransition':
return PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) => Page(),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return child;
},
);
default:
throw Exception('Invalid route: ${settings.name}');
}
},
),
}
虽然你可以在这里重构很多东西,使其更具可读性和可维护性
- 您可以在
Navigator
小部件 中提取给定 - 为路由使用常量。它使它更易读,并且不易因打字错误而出错。
- 您可以使用自己的 class 创建扩展
PageRouteBuilder
,它采用Widget
类型的子参数,其余所有转换逻辑都在 class 中。
onGenerateRoute
参数的这个函数