Flutter中文网

Flutter中文网

Flutter Widget组件库:AbsorbPointer

181
2024-07-04

来自Flutter组件库

描述

一个在hit testing中吸收点击事件的控件。

absorbing 吸收属性为true时,该小部件会终止对自身的hit testing,从而防止其子树接收到点击事件。它在布局期间仍然会占用空间,并正常为其子元素进行绘制。它只是防止其子元素成为点击事件的目标。

ignoringSemanticstrue时,子树将不会在语义层(以及例如辅助工具)中可见。

class

/// 该部件可以在hit testing期间吸收点击事件,阻止子树点击事件,并对语义层不可见。
class AbsorbPointer extends SingleChildRenderObjectWidget {
  /// 创建一个在hit testing期间吸收点击的小部件。
  const AbsorbPointer({
    super.key,
    this.absorbing = true,
    @Deprecated(
      '请改用ExcludeSemantics或创建自定义的吸收指针小部件。'
      '此功能在v3.8.0-12.0.pre版本后被弃用。'
    )
    this.ignoringSemantics,
    super.child,
  });

  /// 这个小部件在hit testing期间是否吸收点击事件。
  ///
  /// 无论这个渲染对象在hit testing期间是否吸收点击事件,它都会在布局时占用空间,并在绘制时可见。
  ///
  /// 默认值为true.
  final bool absorbing;

  /// 在编译无障碍语义树时,是否忽略此渲染对象的语义。
  ///
  /// 有关语义树的更多信息,请参阅[SemanticsNode]。
  @Deprecated(
    'Use ExcludeSemantics or create a custom absorb pointer widget instead. '
    '此功能在v3.8.0-12.0.pre版本后被弃用。'
  )
  final bool? ignoringSemantics;
}

使用

import 'package:flutter/material.dart';

class AbsorbPointerExample extends StatelessWidget {
  const AbsorbPointerExample({super.key});

  @override
  Widget build(BuildContext context) {
    return Stack(
      alignment: AlignmentDirectional.center,
      children: <Widget>[
        SizedBox(
          width: 200.0,
          height: 100.0,
          child: ElevatedButton(
            onPressed: () {},
            child: null,
          ),
        ),
        SizedBox(
          width: 100.0,
          height: 200.0,
          child: AbsorbPointer(
            child: ElevatedButton(
              style: ElevatedButton.styleFrom(
                backgroundColor: Colors.blue.shade200,
              ),
              onPressed: () {},
              child: null,
            ),
          ),
        ),
      ],
    );
  }
}

AbsorbPointer吸收了点击事件,导致其子Widget蓝色按钮不响应点击事件,同时Stack底层的按钮被遮挡部分也不响应点击事件。