Flutter: игнорировать события касания на виджете

Я хочу, чтобы поверх других моих виджетов было размытое изображение, однако при этом я не могу взаимодействовать с виджетами под ним.

Ответ 1

Решение

Вы можете решить проблему взаимодействия (не имея возможности взаимодействовать с Widget под размытым изображением), окружив свой BackdropFilter IgnorePointer.

Это означает, что IgnorePointer является решением здесь, потому что он будет игнорировать все сенсорные события для Widget переданного как его дочерний IgnorePointer.

IgnorePointer(child: BackdropFilter(...),)

Вы можете настроить этот атрибут, изменив значение bool ignoring:

IgnorePointer(ignoring: false, ...)

Это включит все сенсорные события снова.

поглощающий

Что-то интересное, но не связанное с проблемой, - это Widget AbsorbPointer, который можно использовать для отражения всех событий касания, которые происходят с его дочерним AbsorbPointer, на себя.

Ответ 2

Вы можете использовать IgnorePointer или AbsorbPointer.

Пример (IgnorePointer)

IgnorePointer(
  child: RaisedButton(
    onPressed: () {},
    child: Text("Unclickable button"),
  ),
);

Пример (AbsorbPointer)

AbsorbPointer(
  child: RaisedButton(
    onPressed: () {},
    child: Text("Unclickable button"),
  ),
);

Какая разница?

Если под вашим основным виджетом есть виджет, который также способен принимать события щелчка, и вы используете IgnorePointer в родительском виджете, дочерний виджет все равно будет получать события щелчка.

Но использование AbsorbPointer на главном виджете не позволит другому виджету (ниже основного виджета) получать события щелчка.

Пример, показывающий разницу.

@override
Widget build(BuildContext context) {
  return SizedBox(
    width: double.infinity,
    child: Stack(
      children: <Widget>[
        Positioned(
          left: 0,
          width: 250,
          child: RaisedButton(
            color: Colors.red,
            onPressed: () => print("Button 1"),
            child: Text("Button 1"),
          ),
        ),
        Positioned(
          right: 0,
          width: 250,
          child: IgnorePointer( // replace this with AbsorbPointer and button 1 won't receive click
            child: RaisedButton(
              onPressed: () => print("Button 2"),
              child: Text("Button 2"),
            ),
          ),
        ),
      ],
    ),
  );
}