gpt4 book ai didi

widget - flutter : How to navigate to new page after state change?

转载 作者:IT老高 更新时间:2023-10-28 12:37:59 26 4
gpt4 key购买 nike

状态改变后如何导航到新页面?

我有一个需要先登录的应用程序。只有在登录后,应用程序组件才会完全创建。所以我写了这样的东西:

主应用

class AppComponentState extends State<AppComponent> implements CredentialProvider {

Credential credential;

@override
Widget build(BuildContext context) {
if (credential == null) {
return new MaterialApp(
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => new LoginPage(this),
},
);
} else {
return new MaterialApp(
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => new Desktop(credential),
...
},
);
}
}
@override
void setCredential(Credential s) {
setState(() {
credential = s;
});
}
}

凭据提供程序接口(interface)

abstract CredentialProvider {
void setCredential(Credential c);
}

LoginPage 中的登录按钮监听器,设置凭据并路由到新页面。

@override
Widget build(BuildContext context) {

void _handleSubmitted() {
...
credentialProvider.setCredential(c); // this change main widget state and hence new pages are created
// call setTimeout ?
Navigator.pushNamed(context, "/"); // this should go to new page, because credential is set.
}

...
}

看来,我必须等待当前 digest loop在调用 Navigator.pushNamed(context, "/"); 之前完成。像javascript中的 setTimeout 这样的 flutter 摘要循环有什么好的方法吗?

MaterialApp 的条件创建有点奇怪。 flutter 中有更好的模式吗?

最佳答案

要回答您的直接问题,addPostFrameCallbackFuture.delayed可以在最小延迟后调用代码。但是,这种模式存在一些问题:

  • 我建议您只有一个 MaterialApp 小部件。您可以为登录页面设置单独的路由。
  • 在 Flutter 中,状态从父级流向子级。子级不应调用父级State 上的方法。相反, parent 可以将回调传递给 child 。或者也许是 ChangeNotifier .如果没有其他方法可以做您想做的事,您可以使用 GlobalKey从应用程序的任何位置访问 AppComponentState 并在其上调用 setCredential,但这样做会失去一些封装性和可测试性。
  • 如果用户按下后退按钮并返回到上一个位置,则在导航器堆栈上推送另一个 "/" 可能会导致问题。可能您想要的是触发某个小部件的重建,该小部件是 LoginPageDesktop 的父级。或者你可以再次调用 runApp() 来强制 everything 重建。

关于widget - flutter : How to navigate to new page after state change?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45715942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com