小部件树内的条件导航

问题描述 投票:2回答:1

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

这是新代码:

  @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();
        },
      ),
    );
  }

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

  @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()));
        },
      ),
    );
  }

它当然不起作用,因为返回值不是Widget。有解决方案吗

编辑:感谢Remi,我解决了这样的问题:

        @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();
  }
dart flutter
1个回答
1
投票

只是不要使用FututeBuilder并直接操纵Future

Future future;
future.then((value) {
  Navigator.pushNamed(context, "/foo");
});

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

© www.soinside.com 2019 - 2024. All rights reserved.