Flutter - 无法在路线之间保持焦点
Flutter - Trouble preserving focus between routes
我有一个表单,它使用 FocusNode
s 直观地指示表单的哪一部分处于活动状态。一个字段将 PopupRoute 扩展为一种弹出 'keyboard'。我的问题是,当我按下该字段时,键盘会弹出,但不会出现焦点的视觉效果。
FocusNode
的侦听器的一些调试显示它获得焦点但立即失去焦点。我想是因为新的PopupRoute
有了新的FocusScopeNode
,所以我的FocusNode
没有焦点了
如何在另一条路线上保持注意力集中?我试过:
- 在所有构建方法中使用
FocusScope.of(context).reparentIfNeeded(focusNode)
,但没有做任何事情(我不太了解这个功能 tbh)
- 将当前
FocusScope.of(context)
传递到我的自定义 PopupRoute
中使用。这确实有效,但弹出后,我无法再关注任何东西(我猜它被处理掉了?)
代码方面,我在现场点击时调用 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,
);
}
我有一个表单,它使用 FocusNode
s 直观地指示表单的哪一部分处于活动状态。一个字段将 PopupRoute 扩展为一种弹出 'keyboard'。我的问题是,当我按下该字段时,键盘会弹出,但不会出现焦点的视觉效果。
FocusNode
的侦听器的一些调试显示它获得焦点但立即失去焦点。我想是因为新的PopupRoute
有了新的FocusScopeNode
,所以我的FocusNode
没有焦点了
如何在另一条路线上保持注意力集中?我试过:
- 在所有构建方法中使用
FocusScope.of(context).reparentIfNeeded(focusNode)
,但没有做任何事情(我不太了解这个功能 tbh) - 将当前
FocusScope.of(context)
传递到我的自定义PopupRoute
中使用。这确实有效,但弹出后,我无法再关注任何东西(我猜它被处理掉了?)
代码方面,我在现场点击时调用 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,
);
}