📘
ActionのinvokeでKeyEventResult.ignoredを返す
FlutterのActionのinvokeはnullを返そうが、KeyEventResult.ignoredを返そうが、ショートカットとして検知されてしまうため、それ以降の親のActionやネイティブ側のショートカットが検知されなくなってしまいます。
FocusのonKeyではKeyEventResult.ignoredを返せば検知されなかったことになるのですが、これをinvokeメソッドでも行う方法の記事です。
結論
toKeyEventResultをoverrideしてあげ、KeyEventResult.ignoredを返すようにしてあげるだけです。
class HogeAction extends Action<HogeIntent> {
@override
KeyEventResult toKeyEventResult(
Intent intent,
covariant Object? invokeResult,
) {
// invokeResultがKeyEventResultの場合はそのまま返す
if (invokeResult is KeyEventResult) {
return invokeResult;
}
return super.toKeyEventResult(intent, invokeResult);
}
@override
Object? invoke(...) {
return KeyEventResult.ignored;
}
}
説明
toKeyEventResultメソッドは内部コード的には以下のようになっています。
consumesKeyは必ずtrueを返すようになっているので、handledが検知されているようです。(consumesKeyはoverrideする前提だと思います)
KeyEventResult toKeyEventResult(T intent, covariant Object? invokeResult) {
return consumesKey(intent)
? KeyEventResult.handled
: KeyEventResult.skipRemainingHandlers;
}
invokeResultはinvokeメソッドの戻り値なので、これがKeyEventResultだったらその値を返すようにしてあげればinvokeでKeyEventResult.ignoredを返してあげればそのアクションが未検知となります。
締め
毎回overrideをするのも面倒なので、私の個人開発のリポジトリではCustomActionというのを作っています。
Discussion