【问题标题】:Conditional Navigation inside Widget Tree小部件树内的条件导航
【发布时间】:2019-02-27 08:27:18
【问题描述】:

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

这是新代码:

  @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 中毫无问题地执行 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()));
        },
      ),
    );
  }

这当然行不通,因为返回值不是小部件。有什么解决办法吗?

编辑:感谢 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】:

    干脆不要使用FututeBuilder,直接操作Future

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

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

    【讨论】:

    • 完成了,谢谢 Remi,我现在分享我的代码。顺便说一句,我期待你在 Flutter 播客频道上的另一个播客 :)
    猜你喜欢
    • 1970-01-01
    • 2020-11-29
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2019-10-24
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多