【问题标题】:What are the internal implementations of Navigator.push() and Navigator.pop()?Navigator.push() 和 Navigator.pop() 的内部实现是什么?
【发布时间】:2019-01-23 18:51:14
【问题描述】:

在 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');
  }
}

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

【问题讨论】:

    标签: flutter navigator statefulwidget


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。我想知道push 是否会堆叠缓存的(已经渲染的)小部件 或者只是小部件的类型 所以重新渲染它。
    • maintainState 控制是否保留路由的小部件和渲染对象。如果在一个路由上将它设置为 false,那么当另一个路由被推到顶部时,整个子树将被丢弃,直到该路由被弹出。
    • 非常感谢!非常感谢!
    猜你喜欢
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    相关资源
    最近更新 更多