当前位置: 首页 > 知识库问答 >
问题:

生成导航器时引发了以下断言

邵子平
2023-03-14
 class Screen0 extends StatefulWidget {
  @override
  _Screen0State createState() => _Screen0State();
}

class _Screen0State extends State<Screen0> {
  @override
  void initState() {
    changeScreen();
    super.initState();
  }

  void changeScreen() {
    Navigator.push(context, MaterialPageRoute(builder: (context) {
      return MyHomePage(title: 'Flutter Demo Home Page');
    }));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold();
  }
}


--------------------- my other screen -----------------------------
import 'package:flutter/material.dart';

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

我在changeScreen方法中使用以下导航器代码修复了它:

Future(() {
        Navigator.push(
            context, MaterialPageRoute(builder: (context) => CityScreen()));
      });

谢谢大家的帮助!

共有1个答案

爱繁
2023-03-14

您需要更多地了解Flutter中小部件的生命周期。当调用initState时,框架正忙着将小部件呈现到小部件树中。它在initState中所做的一切就是收集以某种方式呈现小部件所需的信息。

在initState中调用changescreen()所做的是,在flutter已经构建另一个小部件时,告诉它构建另一个小部件。它给出了一个错误。

只有在构建第一个小部件时,您才能导航到(或构建)另一个小部件。

  changeRoute() async {
    await Future.delayed(Duration(seconds: 1), () {
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => SecondRoute()),
      );
    });
  }

这里发生的事情是,事件循环等待1秒钟(由我们在Future.Delayed方法中定义),然后ChangesCreen()中的所有事情都发生了。在这1秒结束时,flutter会呈现它的主部件并查找剩下的部件。剩下什么?我们的changescreen()!!

因此,就在一秒钟后。屏幕导航。

PS:这个答案可能有争议,因为我们不知道flutter会花多少时间来呈现主部件。如果超过一秒钟(非常罕见),那么错误将持续存在。

 类似资料:
  • sp_get_menu($id,$menu_root_ul_id,$filetpl,$foldertpl,$ul_class,$li_class,$menu_root_ul_class,$showlevel,$dropdown) 功能: 生成指定ID的导航 参数: $id:导航id $menu_root_ul_id:菜单根节点ul标签的id属性值 $filetpl:没有子菜单的菜单的html模

  • 在我的Twitter引导网站,我有一个导航栏。 我为它们添加btn-成功或btn-危险类用于颜色标记。 我这样做是因为当用户更改主题(css)时,按钮会显示在该主题上。 我使用的是。所以背景是黑色的。我将按钮链接的颜色更改为白色。但问题是,当用户将鼠标悬停在按钮上时,按钮变为透明,颜色无法读取。 所以我需要导航栏按钮是可见的,即使用户在上面悬停。我希望悬停与否时按钮颜色相同。 我的小提琴:http

  • 因此,我刚刚从bootswatch复制了navbar表单的代码片段,并直接导入了所需的JQuery、bootstrap css和js文件,如下面的代码片段所示。当浏览器调整大小时,它会做出响应,但当我单击按钮以获取导航栏的下拉菜单时,它会出现故障,不会下降并停留在那里,而是自动切换回原来的状态。 代码中没有任何调整或更改,它在bootswatch网站上运行良好,但这里没有。有人能解释一下原因并给出

  • 当我试图实现React-导航中的导航器时,我遇到了一些奇怪的行为。 当你尝试简单的“hello world”时https://reactnavigation.org/docs/en/hello-react-navigation.html... 我得到这个错误: 不变违反:元素类型无效:预期为字符串(用于内置组件)或类/函数(用于复合组件),但得到了:对象。检查SceneView的渲染方法。 奇怪的

  • 问题内容: 我一直在尝试React Hooks,它们似乎确实简化了诸如存储状态之类的事情。但是,他们似乎通过魔术来做很多事情,而我找不到关于它们实际工作方式的好文章。 看起来很神奇的第一件事是,每次调用setXXX方法时,调用诸如useState()之类的函数如何导致功能组件的重新渲染? 当功能组件甚至没有能力在Mount / Unmount上运行代码时,诸如useEffect()之类的东西如何伪

  • 本文向大家介绍JavaScript导航脚本判断当前导航,包括了JavaScript导航脚本判断当前导航的使用技巧和注意事项,需要的朋友参考一下 废话不多说,直接给大家贴代码了。 以上所述是小编给大家介绍的JavaScript导航脚本判断当前导航,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!