Flutter - 无法在路线之间保持焦点

Flutter - Trouble preserving focus between routes

我有一个表单,它使用 FocusNodes 直观地指示表单的哪一部分处于活动状态。一个字段将 PopupRoute 扩展为一种弹出 'keyboard'。我的问题是,当我按下该字段时,键盘会弹出,但不会出现焦点的视觉效果。

FocusNode 的侦听器的一些调试显示它获得焦点但立即失去焦点。我想是因为新的PopupRoute有了新的FocusScopeNode,所以我的FocusNode没有焦点了

如何在另一条路线上保持注意力集中?我试过:

代码方面,我在现场点击时调用 requestFocus,并在 initState 中添加此侦听器:

    widget.focusNode.addListener(() {
      print(widget.focusNode);
      if (widget.focusNode.hasFocus) {
        Navigator.of(context).push(
          CustomKeyboardPopupRoute(
            state: widget.state,
            position: //position stuff,
            focusScopeNode: FocusScope.of(context), //the second of my ideas which didn't quite work above
          )
        ).then((_) {
           widget.focusNode.unfocus();
        });
    }); 

你走在正确的轨道上,确实发生这种情况是因为 FocusScopeNode

让你的键盘路线延伸 TransitionRoute:

class CustomKeyboardPopupRoute extends TransitionRoute {
  @override
  bool get opaque => false;

  @override
  Duration get transitionDuration => Duration(milliseconds: 300);

  @override
  Iterable<OverlayEntry> createOverlayEntries() sync* {
    yield OverlayEntry(
      opaque: false,
      maintainState: true,
      builder: _buildKeyboard,
    );
  }

  Widget _buildKeyboard(BuildContext context) {
    final positionAnimation = Tween(begin: Offset(0.0, 1.0), end: Offset.zero).animate(animation);
    return SlideTransition(position: positionAnimation, child: Align(
      alignment: Alignment.bottomCenter,
      child: ...
    ),);
  }
}

非常感谢。

Iterable<OverlayEntry> createOverlayEntries() sync* {
    yield OverlayEntry(
      opaque: false,
      maintainState: true,
      builder: (content) {
        return ModalBarrier(dismissible: true);
      }
    );
    yield OverlayEntry(
      opaque: false,
      maintainState: true,
      builder: _buildContent,
    );
  }