Navigator.push() 和 Navigator.pop() 的内部实现是什么?
What are the internal implementations of Navigator.push() and Navigator.pop()?
在状态 class 中,尽管未调用 setState() 调用,但当小部件从 Navigator.pop() 返回时,它会用新项目重建。怎么会这样?
在我下面的简化代码中,每当我单击一个按钮并弹出推送的小部件时,ListView
就会重建。
是不是因为 Navigator.push()
处理了一个当前的 widget 并且这个 widget 在 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');
}
}
我已阅读文档和实施代码。但是我找不到这个问题的答案。
Navigator 维护基于堆栈的子窗口小部件历史记录。我认为您已经了解数据结构 Stack。 Navigator.push
和 Navigator.push
的工作方式与 Stack 相同。当我们导航到另一个屏幕时,我们使用 push 方法,Navigator 小部件将新屏幕添加到堆栈的顶部。然而,pop 方法将从堆栈中删除该屏幕。
在状态 class 中,尽管未调用 setState() 调用,但当小部件从 Navigator.pop() 返回时,它会用新项目重建。怎么会这样?
在我下面的简化代码中,每当我单击一个按钮并弹出推送的小部件时,ListView
就会重建。
是不是因为 Navigator.push()
处理了一个当前的 widget 并且这个 widget 在 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');
}
}
我已阅读文档和实施代码。但是我找不到这个问题的答案。
Navigator 维护基于堆栈的子窗口小部件历史记录。我认为您已经了解数据结构 Stack。 Navigator.push
和 Navigator.push
的工作方式与 Stack 相同。当我们导航到另一个屏幕时,我们使用 push 方法,Navigator 小部件将新屏幕添加到堆栈的顶部。然而,pop 方法将从堆栈中删除该屏幕。