我正在构建一个简单的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种状态之一:
- LaunchInitial: 默认状态。
- LaunchLoginPage: 表示应该显示登录页面。
- LaunchMainPage: 表示应该显示主页面。
处理LaunchInitial状态很好,屏幕上会显示进度条。但是其他两个状态会导致应用程序崩溃。将抛出以下错误:
This Overlay widget cannot be marked as needing to build because the framework is already in the process of building widgets
似乎在执行消费者的
build
方法时尝试重定向到另一个屏幕会导致此问题。正确的方法是什么?谢谢!