Flutter Navigator的底层实现主要涉及到两个类:Navigator
和NavigatorState
。其中,Navigator
是一个StatefulWidget,它存储了当前页面堆栈,以及提供了一些方法用于管理页面堆栈;而NavigatorState
则是Navigator
的状态管理器,负责处理页面堆栈的操作和转换。
以下是Navigator的主要实现模块及其代码解读:
- 页面堆栈存储
Navigator
使用一个List类型的成员变量来存储页面堆栈,该变量名为_history
。通过对_history
进行添加和弹出操作,可以实现页面的“push”和“pop”。
class Navigator extends StatefulWidget {
...
final List<Page<dynamic>> _history = <Page<dynamic>>[];
...
}
- 构建、显示和隐藏页面
Navigator
使用Flutter的Overlay机制来构建、显示和隐藏页面,具体实现方式如下:
- 在
Navigator
的build方法中,创建一个Stack
widget,并在其中插入所有页面的widget。 - 在
NavigatorState
中,构建一个OverlayEntry
来表示当前页面(即栈顶元素),并将其插入到Overlay
中,这样就能够将当前页面显示在前台。 - 当需要执行“push”或“pop”操作时,从
Overlay
中移除当前页面对应的OverlayEntry
,并插入新页面的OverlayEntry
,从而实现页面的切换。
class Navigator extends StatefulWidget {
...
@override
_NavigatorState createState() => _NavigatorState();
}
class _NavigatorState extends State<Navigator> {
...
OverlayEntry _currentOverlayEntry;
void _updateOverlay() {
if (_history.isEmpty) {
_currentOverlayEntry?.remove();
_currentOverlayEntry = null;
return;
}
final Page<dynamic> topPage = _history.last;
final Widget widget = topPage.build(context);
_currentOverlayEntry = OverlayEntry(builder: (BuildContext context) {
return Positioned.fill(child: widget);
});
Overlay.of(context, rootOverlay: true).insert(_currentOverlayEntry);
}
...
}
- 使用PageRoute实现页面转换
Navigator
使用Flutter的PageRoute类来实现页面之间的转换,每个PageRoute对象均代表着一个页面,其中包含了页面的构建方法、转场动画等信息。当用户执行“push”或“pop”操作时,Navigator会调用对应的PageRoute对象来进行页面切换。
class Navigator extends StatefulWidget {
...
Future<T?> push<T extends Object?>(Route<T> route) async {
assert(() {
if (!debugCheckHasMaterialLocalizations(context)) {
throw FlutterError(
'Scaffold.of() called with a context that does not contain a Scaffold.\n'
'No Scaffold widget found.');
}
return true;
}());
final Completer<T?> completer = Completer<T?>();
final MaterialPageRoute<T?> pageRoute =
MaterialPageRoute<T?>(builder: route.builder);
pageRoute.setCompleter(completer);
setState(() {
_history.add(pageRoute);
});
await completer.future;
return null;
}
...
}
总之,通过使用上述底层功能,Navigator可以帮助开发者很方便地实现页面间的导航和栈管理。同时,这些底层功能也保证了Navigator的高效性和可靠性,使得在应用程序中使用Navigator时能够获得较好的性能和用户体验。