Flutter Navigator 的构成

688 阅读1分钟

某天发现 Overlay 源码里写了如下信息:

/// Although you can create an [Overlay] directly, it's most common to use the
/// overlay created by the [Navigator] in a [WidgetsApp] or a [MaterialApp]. The
/// navigator uses its overlay to manage the visual appearance of its routes.

尽管您可以直接创建一个 Overlay, 但最常见的是使用 WidgetsAppMaterialAppNavigator 创建的 Overlay.

Navigator 对象使用其 Overlay 对象来管理其路由的视觉外观。

可以发现的信息是: Flutter App 的页面是使用 Overlay "层叠"出来的.

源码

去查看源码确认一下.

WidgetsApp

MaterialAppCupertinoApp 都是使用 WidgetsApp 构造出来的,那我们进入 WidgetsApp 的源码,可以发现它有一个顶级成员: _navigator:

GlobalKey<NavigatorState> _navigator;   // <----- 声明
// ...
@override
void initState() {
  super.initState();
  _updateNavigator();                   // <----- 初始化
  // ...
}
// ...
void _updateNavigator() {
  _navigator = widget.navigatorKey ?? GlobalObjectKey<NavigatorState>(this);
}

_navigator 的类型为 GlobalKey<NavigatorState> ,而 NavigatorState 就是 Navigator 的状态对象.

Navigator 用于管理页面之间如何跳转,通常也可被称为导航管理,如果用户没有传入navigatorKey,它会自动创建一个.

结论: MaterialApp 是Flutter App 最最顶层的 Widget, 每个 App 都会有一个用于路由管理的 Navigator 对象.

Navigator

继续到 Navigator 源码里,发现了个 Overlay 类型成员 _overlayKey:

// 1478 行
final GlobalKey<OverlayState> _overlayKey = GlobalKey<OverlayState>();
// ...
// 1576行
/// The overlay this navigator uses for its visual presentation.
OverlayState get overlay => _overlayKey.currentState;
// ...
// 2214行
@override
  Widget build(BuildContext context) {
    // ...
    return Listener(
      onPointerDown: _handlePointerDown,
      onPointerUp: _handlePointerUpOrCancel,
      onPointerCancel: _handlePointerUpOrCancel,
      child: AbsorbPointer(
        absorbing: false,
        child: FocusScope(
          node: focusScopeNode,
          autofocus: true,
          child: Overlay(       // <----- 0.0
            key: _overlayKey,   // <----- ^.^
          ),
        ),
      ),
    );
  }

Navigatorbuild()方法里发现Navigator就是用 Overlay 做子布局的!

现在就证明了文章开始的那个结论: Flutter App 的页面都是使用 Overlay "层叠"出来的.

下一篇再简单看看 Overlay