当前位置: 首页 > 面试题库 >

小部件树中的条件导航

燕俊明
2023-03-14
问题内容

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

这是新代码:

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


问题答案:

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

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

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



 类似资料:
  • 面对这样的问题: 表由bootstrap(来自yii booster)的小部件TbGridView形成。在TBButton列中,我形成“编辑/删除等” 但是我想用一个按钮来处理拆分下拉列表的效果http://yii-booster.clevertech.biz/components.html#buttonDropdowns

  • 有趣的是,我尝试了一个switch case语句,它给了我同样的警告,因此我无法运行代码。是我做错了什么,还是让人无法使用if/else或switch语句而不认为有死代码?

  • 在Flatter引入空安全特性之前,我能够有条件地在列表中添加小部件,如下所示: 是一个自制的过滤器,可以过滤掉空对象... 现在使用空安全性是不可能的,因为小部件列表严格来说必须是非空的。什么是更好的方法?

  • 我在组件的列表中显示了一个项目数组。项目的属性之一是描述字段,其范围可以从一个单词到几个句子。 当描述太长,我想截断它,并显示一个按钮,将显示点击时的完整文本。是否截断和显示按钮的条件基于返回布尔值的函数: 然后我从组件的模板端使用这个函数,如下所示(ngFor的一小部分): 这里使用的CSS很简单: 目前,该行为非常偶然,我在控制台中收到错误: expressionchangedafterith

  • 小部件是在视图中使用的可重用单元, 使用面向对象方式创建复杂和可配置用户界面单元。 例如,日期选择器小部件可生成一个精致的允许用户选择日期的日期选择器, 你只需要在视图中插入如下代码: <?php use yii\jui\DatePicker; ?> <?= DatePicker::widget(['name' => 'date']) ?> Yii提供许多优秀的小部件,比如 active for