Flutter では、配置されたウィジェットが親スタック領域の外側のタップを感知するにはどうすればよいでしょうか? 質問する

Flutter では、配置されたウィジェットが親スタック領域の外側のタップを感知するにはどうすればよいでしょうか? 質問する

A はa の内部にStack含まれています。MyWidgetPositioned

Stack(
  overflow: Overflow.visible,
  children: [
    Positioned(
    top: 0.0,
    left: 0.0,
    child: MyWidget(),
  )],
);

オーバーフローは でありOverflow.visibleMyWidgetより大きいためStack、 の外側に表示されますStack。これが私の希望どおりです。

MyWidgetただし、エリア外のエリアをタップすることはできませんStack。タップしても無視されます。

MyWidgetそこでジェスチャーを確実に受け入れるにはどうすればいいでしょうか?

ベストアンサー1

この動作は、スタックが子がヒットしたかどうかを確認する前に、ポインターがその境界内にあるかどうかを確認するために発生します。

クラス: RenderBox (RenderStack が拡張)

bool hitTest(BoxHitTestResult result, { @required Offset position }) {

    ...

    if (_size.contains(position)) {
      if (hitTestChildren(result, position: position) || hitTestSelf(position)) {
        result.add(BoxHitTestEntry(this, position));
        return true;
      }
    }
    return false;
}

私の回避策は、

if (_size.contains(position))

チェック。残念ながら、フレームワークからコードをコピーしなければこれは不可能です。

私がやったことは次のとおりです:

  • StackクラスをコピーしてStack2と名付けました
  • RenderStackをコピーしてRenderStack2と名付けました
  • Stack2 リファレンス RenderStack2 を作成しました
  • _size.contains チェックなしで上記の hitTest メソッドを追加しました
  • PositionedをコピーしてPositioned2という名前を付け、汎用パラメータとしてStack2を参照するようにしました。
  • コード内でStack2とPositioned2を使用

このソリューションは決して最適ではありませんが、目的の動作を実現します。

おすすめ記事