gpt4 book ai didi

flutter - 在执行 Widget 状态构建时导航

转载 作者:IT王子 更新时间:2023-10-29 07:16:27 25 4
gpt4 key购买 nike

我正在构建一个简单的 Flutter 应用程序。它的启动屏幕确定用户是否已登录,然后根据该屏幕重定向到登录或主/主屏幕。

我的启动屏幕是一个 StatefulWidget,它的状态如下所示。它使用扩展 ChangeNotifier 的 ViewModel 类(它的代码不相关,所以我没有包含它)。

class _LaunchPageState extends State<LaunchPage> {
LaunchViewModel _viewModel = LaunchViewModel();

@override
void initState() {
super.initState();
_viewModel.checkSessionStatus();
}

@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<LaunchViewModel>(
builder: (_) => _viewModel,
child: Scaffold(
body: Consumer<LaunchViewModel>(
builder: (context, viewModel, _) {
if (viewModel.state is LaunchInitial) {
return CircularProgressIndicator();
}
if (viewModel.state is LaunchLoginPage) {
Navigator.pushNamed(context, "login");
}
if (viewModel.state is LaunchMainPage) {
Navigator.pushNamed(context, "main");
}
return Container();
},
),
),
);
}
}

ViewModel 发出 3 种状态之一:

  • Lau​​nchInitial:默认状态。
  • Lau​​nchLoginPage:表示应显示登录页面。
  • Lau​​nchMainPage:表示应显示主页。

LaunchInitial 状态处理得很好,屏幕上显示了一个进度条。但其他 2 个状态导致应用程序崩溃。抛出以下错误:

This Overlay widget cannot be marked as needing to build because the framework is already in the process of building widgets

似乎是在执行消费者的 build 方法时尝试重定向到另一个屏幕导致了这个问题。执行此操作的正确方法是什么?

谢谢!

最佳答案

您不能在小部件树中直接调用 Navigator。如果您有 event-state 构建器,那么最好更改您正在渲染的小部件树:

builder: (context, viewModel, _) {
if (viewModel.state is LaunchInitial) {
return CircularProgressIndicator();
}
if (viewModel.state is LaunchLoginPage) {
return LoginPage();
}
if (viewModel.state is LaunchMainPage) {
return MainPage();
}
return Container();
},

您必须在 build 方法中为每个子项返回 Widget

或者,您可以使用 Navigation 执行此操作:

  @override
void didChangeDependencies() {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (viewModel.state is LaunchLoginPage) {
Navigator.pushNamed(context, "login");
}
if (viewModel.state is LaunchMainPage) {
Navigator.pushNamed(context, "main");
}
});
super.didChangeDependencies();
}

addPostFrameCallback 方法将在 build 方法完成后立即调用,您可以在其中导航。

确保您的提供商没有lifecycle问题。

关于flutter - 在执行 Widget 状态构建时导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57234349/

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