Flutter - 当 Provider 变量改变时触发导航

Wil*_*ill 6 navigation provider triggers splash-screen flutter

我正在尝试在初始应用程序启动时显示启动画面,直到正确检索到所有数据。检索由名为“ProductData”的类完成。一旦准备就绪,我想从启动页面导航到应用程序的主屏幕。

不幸的是,我找不到触发运行这种导航并侦听提供者的方法的好方法。

这是我用来测试这个想法的代码。具体来说,我想运行命令 Navigator.pushNamed(context, 'home'); 当变量 shouldProceed 变为真时。不幸的是,下面的代码给了我错误,“在构建过程中调用了 setState() 或 markNeedsBuild()”。

import 'package:catalogo/firebase/ProductData.dart';
import 'package:flutter/material.dart';=
import 'package:provider/provider.dart';

class RouteSplash extends StatefulWidget {
  @override
  _RouteSplashState createState() => _RouteSplashState();
}

class _RouteSplashState extends State<RouteSplash> {
  bool shouldProceed = false;

  @override
  Widget build(BuildContext context) {
    shouldProceed =
        Provider.of<ProductData>(context, listen: true).shouldProceed; 
    if (shouldProceed) {
      Navigator.pushNamed(context, 'home'); <-- The error occurs when this line is hit.
    } else {
      return Scaffold(
        body: Center(
          child: CircularProgressIndicator(),
        ),
      );
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法可以根据提供者的结果来导航到页面?

Joã*_*res 4

如果您仍在等待数据,您应该做的不是尝试导航到新视图,而是显示加载启动屏幕,一旦更改显示您的主主页视图,如下所示:

import 'package:catalogo/firebase/ProductData.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class Main extends StatefulWidget {
  @override
  _MainState createState() => _MainState();
}

class _MainState extends State<Main> {
  bool shouldProceed = Provider.of<ProductData>(context, listen: true).shouldProceed;

  @override
  Widget build(BuildContext context) {
    if(shouldProceed){
      return Home();
    }else{
      return RouteSplash();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)