使用 ModalRoute.withName() 的 Flutter Navigator.popUntil() 在配置文件和发布模式下不工作
Flutter Navigator.popUntil() with ModalRoute.withName() not working in profile and release mode
我有一个使用路由设置导航到新页面的功能
void pushWithSettings(
{@required BuildContext context, @required Widget newPage}) {
Navigator.push(
context,
MaterialPageRoute(
settings: RouteSettings(
name: newPage.toString(),
),
builder: (_) => newPage));
}
然后我使用
弹出到特定页面
Navigator.popUntil(context, ModalRoute.withName(Page().toString));
这在调试模式下运行良好,但在配置文件和发布模式下它只弹出一次
上下文示例
import 'package:flutter/material.dart';
import 'package:flutter_app/main.dart';
class FirstPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Center(child: Text("First Page"),),
RaisedButton(
onPressed: (){
pushWithSettings(context: context, newPage: SecondPage());
},
child: Text("Navigate to second", style: TextStyle(inherit: false)),
)
],
);
}
}
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Center(child: Text("Second Page"),),
RaisedButton(
onPressed: (){
pushWithSettings(context: context, newPage: ThirdPage());
},
child: Text("Navigate to third", style: TextStyle(inherit: false)),
)
],
);
}
}
class ThirdPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Center(child: Text("Third Page"),),
RaisedButton(
onPressed: (){
Navigator.popUntil(context, ModalRoute.withName(FirstPage().toString()));
},
child: Text("Navigate to first", style: TextStyle(inherit: false),),
)
],
);
}
}
在调试模式下,点击第三页中的按钮会导航到第一页,但在配置文件和发布模式下,点击按钮不会执行任何操作。
我目前 运行 flutter 1.17.4 在稳定频道
我已经在配置文件模式 returns 'Widget' 中尝试了您的代码 FirstPage().toString()
,而在调试中 returns 'FirstPage'。
我会添加一个 mixin,其中包含您可以使用的 routeName 字符串。
另外请记住,至少对于网络,建议您的初始路由带有“/”。
void pushWithSettings(
{@required BuildContext context, @required NamedRoute newPage}) {
Navigator.push(
context,
MaterialPageRoute(
settings: RouteSettings(
name: newPage.routeName,
),
builder: (_) => newPage));
}
mixin NamedRoute implements Widget {
String get routeName;
}
class ThirdPage extends StatelessWidget with NamedRoute {
@override
String get routeName => '/third_page';
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Center(
child: Text("Third Page"),
),
RaisedButton(
onPressed: () {
Navigator.popUntil(context, ModalRoute.withName(FirstPage().routeName));
},
child: Text(
"Navigate to first",
style: TextStyle(inherit: false),
),
)
],
);
}
}
第一个答案有效,但为了避免向我可用的所有页面添加 mixins,我使用 runtimeType
而不是
settings: RouteSettings(
name: newPage.toString(),
),
变成了
settings: RouteSettings(
name: newPage.runtimeType.toString(),
),
我有一个使用路由设置导航到新页面的功能
void pushWithSettings(
{@required BuildContext context, @required Widget newPage}) {
Navigator.push(
context,
MaterialPageRoute(
settings: RouteSettings(
name: newPage.toString(),
),
builder: (_) => newPage));
}
然后我使用
弹出到特定页面Navigator.popUntil(context, ModalRoute.withName(Page().toString));
这在调试模式下运行良好,但在配置文件和发布模式下它只弹出一次
上下文示例
import 'package:flutter/material.dart';
import 'package:flutter_app/main.dart';
class FirstPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Center(child: Text("First Page"),),
RaisedButton(
onPressed: (){
pushWithSettings(context: context, newPage: SecondPage());
},
child: Text("Navigate to second", style: TextStyle(inherit: false)),
)
],
);
}
}
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Center(child: Text("Second Page"),),
RaisedButton(
onPressed: (){
pushWithSettings(context: context, newPage: ThirdPage());
},
child: Text("Navigate to third", style: TextStyle(inherit: false)),
)
],
);
}
}
class ThirdPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Center(child: Text("Third Page"),),
RaisedButton(
onPressed: (){
Navigator.popUntil(context, ModalRoute.withName(FirstPage().toString()));
},
child: Text("Navigate to first", style: TextStyle(inherit: false),),
)
],
);
}
}
在调试模式下,点击第三页中的按钮会导航到第一页,但在配置文件和发布模式下,点击按钮不会执行任何操作。 我目前 运行 flutter 1.17.4 在稳定频道
我已经在配置文件模式 returns 'Widget' 中尝试了您的代码 FirstPage().toString()
,而在调试中 returns 'FirstPage'。
我会添加一个 mixin,其中包含您可以使用的 routeName 字符串。
另外请记住,至少对于网络,建议您的初始路由带有“/”。
void pushWithSettings(
{@required BuildContext context, @required NamedRoute newPage}) {
Navigator.push(
context,
MaterialPageRoute(
settings: RouteSettings(
name: newPage.routeName,
),
builder: (_) => newPage));
}
mixin NamedRoute implements Widget {
String get routeName;
}
class ThirdPage extends StatelessWidget with NamedRoute {
@override
String get routeName => '/third_page';
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Center(
child: Text("Third Page"),
),
RaisedButton(
onPressed: () {
Navigator.popUntil(context, ModalRoute.withName(FirstPage().routeName));
},
child: Text(
"Navigate to first",
style: TextStyle(inherit: false),
),
)
],
);
}
}
第一个答案有效,但为了避免向我可用的所有页面添加 mixins,我使用 runtimeType
而不是
settings: RouteSettings(
name: newPage.toString(),
),
变成了
settings: RouteSettings(
name: newPage.runtimeType.toString(),
),