小部件树内的条件导航

Ese*_*met 4 dart flutter

我之前问过但事情已经改变了,今天我意识到我之前得到的解决方案存在严重问题。我的算法有点改变。

这是新代码:

  @override
  Widget build(BuildContext context) {
    return Material(
      child: FutureBuilder(
        future: _future,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            print('BOOT VALUE IS ${snapshot.data}');
          }
          return !snapshot.hasData
              ? SplashScreen()
              : snapshot.data ? HomePage() : FirstScreen();
        },
      ),
    );
  }
Run Code Online (Sandbox Code Playgroud)

使用此解决方案,每次我在 FutureBuilder 内有条件地呈现的页面内导航时,都会执行 BootScreen 页面函数。所以这不是最好的......我需要在 Future Builder 中毫无问题地执行 Navigation,如下所示:

  @override
  Widget build(BuildContext context) {
    return Material(
      child: FutureBuilder(
        future: _future,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            print('BOOT VALUE IS ${snapshot.data}');
          }
          return !snapshot.hasData
              ? SplashScreen()
              : snapshot.data
                  ? Navigator.of(context).pushReplacement(
                      MaterialPageRoute(builder: (context) => HomePage()))
                  : Navigator.of(context).pushReplacement(
                      MaterialPageRoute(builder: (context) => FirstScreen()));
        },
      ),
    );
  }
Run Code Online (Sandbox Code Playgroud)

它当然不会工作,因为返回值不是 Widget。有什么解决办法吗?

编辑:感谢雷米,我是这样解决的:

        @override
  void initState() {
    final MainModel model = ScopedModel.of(context);
    model.bootUp().then(
          (value) => Future.delayed(
                Duration(seconds: 1, milliseconds: 500),
                () {
                  Navigator.pushReplacement(
                      context,
                      MaterialPageRoute(
                          builder: (context) =>
                              value ? HomePage() : FirstScreen()));
                },
              ),
        );
    super.initState();
  }
Run Code Online (Sandbox Code Playgroud)

Rém*_*let 6

不要直接使用FututeBuilder和操作Future

Future future;
future.then((value) {
  Navigator.pushNamed(context, "/foo");
});
Run Code Online (Sandbox Code Playgroud)

请记住,您不应在build方法中执行此操作。在创建 Future 的地方执行此操作,通常是initState