5

シンプルな 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メソッド実行中に別の画面にリダイレクトしようとすると、この問題が発生しているようです。これを行う正しい方法は何ですか?

ありがとう!

4

1 に答える 1