📘
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> {
KeyEventResult toKeyEventResult(
Intent intent,
covariant Object? invokeResult,
) {
// invokeResultがKeyEventResultの場合はそのまま返す
if (invokeResult is KeyEventResult) {
return invokeResult;
}
return super.toKeyEventResult(intent, invokeResult);
}
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