Widget Tree 内的条件导航

4

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

以下是新代码:

  @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页面功能都会执行。所以这并不是最好的...我需要在FutureBuilder中无问题地执行导航,就像这样:

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

6

不要使用FutureBuilder,直接操作Future

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

请记住,在build方法内部不应该这样做。通常在创建Future的地方,例如initState中执行。

做完了,谢谢Remi。我现在分享我的代码。顺便说一句,我期待着你在Flutter播客频道的另一期播客 :) - Mehmet Esen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接