Navigator.push()和Navigator.pop()的内部实现是什么?

时间:2019-01-23 18:51:15

标签: flutter navigator statefulwidget

在State类中,尽管未调用setState()调用,但当从Navigator.pop()返回小部件时,它会用新项重建。这怎么可能呢?

在下面的简化代码中,每当我单击按钮并弹出按下的窗口小部件时,ListView就会重新构建。

是因为Navigator.push()放置了当前窗口小部件,并且在Navigator.pop()之后重新渲染了该窗口小部件吗?

class _TestState extends State<Test> {
  List<int> initialList = [];
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FlatButton(
        onPressed: () async {
          var nothing = await Navigator.of(context).push(
            MaterialPageRoute(builder: (_context) => PushedWidget()),
          );
          // the State is rebuilt without calling setState()
          initialList.add(1);
        },
        child: Text('test'),
      ),
      body: Container(
        child: ListView.builder(
          itemCount: initialList.length,
          itemBuilder: (context, idx) {
            return Text('${initialList[idx]}');
          },
        ),
      ),
    );
  }
}

class PushedWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(leading: IconButton(onPressed: () => _pop(context), icon: Icon(Icons.close))),
    );
  }
  void _pop(BuildContext context) {
    Navigator.of(context).pop('popped');
  }
}

我已阅读文档和实施代码。但是我找不到这个问题的答案。

1 个答案:

答案 0 :(得分:0)

Navigator维护子窗口小部件的基于堆栈的历史记录。我认为您已经了解数据结构堆栈。 Navigator.pushNavigator.push的工作原理与Stack相同。当导航到另一个屏幕时,我们使用push方法,并且Navigator小部件将新屏幕添加到堆栈顶部。而pop方法会从堆栈中删除该屏幕。