小部件树中的条件导航

时间:2019-02-27 08:27:19

标签: dart flutter

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

这是新代码:

fetch(`${baseUrl}api/user/login`, {
    withCredentials: true,
    headers: myHeaders
})
.then(function(response) {
    console.log(response.status); // Will show you the status
    if (!response.ok) {
        throw new Error("HTTP status " + response.status);
    }
    return response.json();
})
.then(// ...

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

由于返回值不是小部件,因此它当然不起作用。有解决办法吗?

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

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

1 个答案:

答案 0 :(得分:1)

只需不要使用FututeBuilder并直接操作Future

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

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