一尘不染

小部件树中的条件导航

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

使用此解决方案,每次我在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()));
        },
      ),
    );
  }

因为返回值不是小部件,所以它当然不起作用。有什么办法吗?

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

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


阅读 357

收藏
2020-08-31

共1个答案

一尘不染

只是不要直接使用FututeBuilder和操作Future:

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

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

2020-08-31