シンプルな Flutter アプリを作成しています。その起動画面は、ユーザーがログインしているかどうかを判断し、それに応じて、その後ログインまたはメイン/ホーム画面にリダイレクトします。
私の起動画面は でStatefulWidget
、その状態を以下に示します。拡張する ViewModel クラスを使用しますChangeNotifier
(そのコードは無関係なので、含めませんでした)。
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 状態は正常に処理され、プログレス バーが画面に表示されます。ただし、他の 2 つの状態ではアプリがクラッシュします。次のエラーがスローされます。
This Overlay widget cannot be marked as needing to build because the framework is already in the process of building widgets
Consumer のbuild
メソッド実行中に別の画面にリダイレクトしようとすると、この問題が発生しているようです。これを行う正しい方法は何ですか?
ありがとう!