在Flutter应用程序中,我有两个页面(ViewPage
和EditPage
),两个页面都有直接相互路由的按钮。也可以直接从EditPage
进入HomePage
页面。
场景路线: HomePage > ViewPage > EditPage > ViewPage > EditPage > ViewPage > ...
使用此示例路由,它要求用户弹出几次才能返回HomePage
。即使用户在EditPage
和HomePage > ViewPage
之间来回几次,是否有办法使从EditPage
到ViewPage
的路线?
当前代码:
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => EditPage(
contract: contract,
),
),
);
我尝试使用各种不同的导航选项都没有成功(例如下面的pushAndRemoveUntil
)。
var route = MaterialPageRoute(
builder: (context) => EditPage(
contract: contract,
),
);
Navigator.of(context).pushAndRemoveUntil(route, (route) => !route.isActive);
澄清性修改:
用户的示例路线:HomePage > ViewPage > EditPage > ViewPage > EditPage > ViewPage > EditPage
在最后一个EditPage
上弹出时的当前路由行为:HomePage > ViewPage > EditPage > ViewPage > EditPage > ViewPage
在最后一个EditPage
上弹出时所需的路由行为:HomePage > ViewPage
说明编辑2:
想得更多,这是使这项工作有效的逻辑(我认为)。从ViewPage
弹出时,请始终导航至HomePage
(我想我可以使用标准的.push方法来使它起作用)。
但是,当从EditPage
弹出时,它需要转到ViewPage
(如果最初是从ViewPage
导航到)或转到HomePage
(如果是从{{ 1}}。总之,如果HomePage
在路线中,请转到ViewPage
的第一个实例,否则请导航到ViewPage
的第一个实例。
我希望这一切都有意义,因为这样做有点令人困惑...
答案 0 :(得分:1)
@Ned,想知道您是否尝试过如下所示的pushNamedAndRemoveUntil,
auto call = [](auto&&...funcs) {
(funcs(),...);
};
int main()
{
A<int, float, char> l;
std::get<0>(l.funcs) = []() { cout << "Calling int()" << endl; return 1; };
std::get<1>(l.funcs) = []() { cout << "Calling float()" << endl; return 1.f; };
std::get<2>(l.funcs) = []() { cout << "Calling char()" << endl; return '1'; };
std::apply(call, l.funcs);
return 0;
}
void main(){
runApp(new MaterialApp(
home: new HomePage(),
routes: <String, WidgetBuilder> {
'HomeScreen': (BuildContext context) => new HomePage(),
'EditScreen': (BuildContext context) => new EditPage(),
},
));
}
答案 1 :(得分:1)
通过使用if语句和一个额外的变量来解决。如果我们从ViewPage导航到Edit,请使用.pop()
回到ViewPage,否则(从主页)“。push” EditPage。
ViewPage:
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => EditPage(
pushedFromViewPage: true,
),
),
);
EditPage:
if (widget.pushedFromViewPage) {
Navigator.of(context).pop();
} else {
Route route = MaterialPageRoute(
builder: (context) => ViewPage(),
);
Navigator.of(context).push(route);
}