<p dir="auto">I noticed that the topmost widget in a Stack will always intercept touch events, even when its opacity is set to 0.0. From the doc <a href="https://docs.flutter.io/flutter/widgets/Opacity-class.html" rel="nofollow">https://docs.flutter.io/flutter/widgets/Opacity-class.html</a>,</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content=" For the value 0.0, the child is simply not painted at all. "><pre class="notranslate"><code class="notranslate"> For the value 0.0, the child is simply not painted at all. 
</code></pre></div>
<div class="highlight highlight-source-dart notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="import 'package:flutter/material.dart';

void main() {
  runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() =&gt; new _MyHomePageState();
}

class _MyHomePageState extends State&lt;MyHomePage&gt; {
  bool _visible = true;

  void _toggleLayerB() {
    setState(() {
      _visible = !_visible;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(title: new Text('Home')),
      body: new Stack(
        children: &lt;Widget&gt;[
          new Center(
              child: new RaisedButton(
                  onPressed: () =&gt; print('Layer A pressed!'),
                  child: new Text('Layer A')
              )
          ),
          new Opacity(
            opacity: _visible ? 1.0 : 0.0,
            child: new Center(
                child: new RaisedButton( // wrapped in Opacity widget
                    onPressed: () =&gt; print('Layer B pressed!'),
                    child: new Text('Layer B')
                )
            ),
          )
        ],
      ),
      floatingActionButton: new FloatingActionButton(
        onPressed: _toggleLayerB,
        tooltip: &quot;Toggle Layer B's visibility&quot;,
        child: new Icon(Icons.add),
      ),
    );
  }
}"><pre class="notranslate"><span class="pl-k">import</span> <span class="pl-s">'package:flutter/material.dart'</span>;

<span class="pl-k">void</span> <span class="pl-en">main</span>() {
  <span class="pl-en">runApp</span>(<span class="pl-k">new</span> <span class="pl-c1">MyApp</span>());
}

<span class="pl-k">class</span> <span class="pl-c1">MyApp</span> <span class="pl-k">extends</span> <span class="pl-c1">StatelessWidget</span> {
  <span class="pl-k">@override</span>
  <span class="pl-c1">Widget</span> <span class="pl-en">build</span>(<span class="pl-c1">BuildContext</span> context) {
    <span class="pl-k">return</span> <span class="pl-k">new</span> <span class="pl-c1">MaterialApp</span>(
      title<span class="pl-k">:</span> <span class="pl-s">'Flutter Demo'</span>,
      theme<span class="pl-k">:</span> <span class="pl-k">new</span> <span class="pl-c1">ThemeData</span>(
        primarySwatch<span class="pl-k">:</span> <span class="pl-c1">Colors</span>.blue,
      ),
      home<span class="pl-k">:</span> <span class="pl-k">new</span> <span class="pl-c1">MyHomePage</span>(),
    );
  }
}

<span class="pl-k">class</span> <span class="pl-c1">MyHomePage</span> <span class="pl-k">extends</span> <span class="pl-c1">StatefulWidget</span> {
  <span class="pl-c1">MyHomePage</span>({<span class="pl-c1">Key</span> key}) <span class="pl-k">:</span> <span class="pl-c1">super</span>(key<span class="pl-k">:</span> key);

  <span class="pl-k">@override</span>
  <span class="pl-c1">_MyHomePageState</span> <span class="pl-en">createState</span>() <span class="pl-k">=&gt;</span> <span class="pl-k">new</span> <span class="pl-c1">_MyHomePageState</span>();
}

<span class="pl-k">class</span> <span class="pl-c1">_MyHomePageState</span> <span class="pl-k">extends</span> <span class="pl-c1">State</span>&lt;<span class="pl-c1">MyHomePage</span>&gt; {
  <span class="pl-c1">bool</span> _visible <span class="pl-k">=</span> <span class="pl-c1">true</span>;

  <span class="pl-k">void</span> <span class="pl-en">_toggleLayerB</span>() {
    <span class="pl-en">setState</span>(() {
      _visible <span class="pl-k">=</span> <span class="pl-k">!</span>_visible;
    });
  }

  <span class="pl-k">@override</span>
  <span class="pl-c1">Widget</span> <span class="pl-en">build</span>(<span class="pl-c1">BuildContext</span> context) {
    <span class="pl-k">return</span> <span class="pl-k">new</span> <span class="pl-c1">Scaffold</span>(
      appBar<span class="pl-k">:</span> <span class="pl-k">new</span> <span class="pl-c1">AppBar</span>(title<span class="pl-k">:</span> <span class="pl-k">new</span> <span class="pl-c1">Text</span>(<span class="pl-s">'Home'</span>)),
      body<span class="pl-k">:</span> <span class="pl-k">new</span> <span class="pl-c1">Stack</span>(
        children<span class="pl-k">:</span> <span class="pl-k">&lt;</span><span class="pl-c1">Widget</span><span class="pl-k">&gt;</span>[
          <span class="pl-k">new</span> <span class="pl-c1">Center</span>(
              child<span class="pl-k">:</span> <span class="pl-k">new</span> <span class="pl-c1">RaisedButton</span>(
                  onPressed<span class="pl-k">:</span> () <span class="pl-k">=&gt;</span> <span class="pl-en">print</span>(<span class="pl-s">'Layer A pressed!'</span>),
                  child<span class="pl-k">:</span> <span class="pl-k">new</span> <span class="pl-c1">Text</span>(<span class="pl-s">'Layer A'</span>)
              )
          ),
          <span class="pl-k">new</span> <span class="pl-c1">Opacity</span>(
            opacity<span class="pl-k">:</span> _visible <span class="pl-k">?</span> <span class="pl-c1">1.0</span> <span class="pl-k">:</span> <span class="pl-c1">0.0</span>,
            child<span class="pl-k">:</span> <span class="pl-k">new</span> <span class="pl-c1">Center</span>(
                child<span class="pl-k">:</span> <span class="pl-k">new</span> <span class="pl-c1">RaisedButton</span>( <span class="pl-c">// wrapped in Opacity widget</span>
                    onPressed<span class="pl-k">:</span> () <span class="pl-k">=&gt;</span> <span class="pl-en">print</span>(<span class="pl-s">'Layer B pressed!'</span>),
                    child<span class="pl-k">:</span> <span class="pl-k">new</span> <span class="pl-c1">Text</span>(<span class="pl-s">'Layer B'</span>)
                )
            ),
          )
        ],
      ),
      floatingActionButton<span class="pl-k">:</span> <span class="pl-k">new</span> <span class="pl-c1">FloatingActionButton</span>(
        onPressed<span class="pl-k">:</span> _toggleLayerB,
        tooltip<span class="pl-k">:</span> <span class="pl-s">"Toggle Layer B's visibility"</span>,
        child<span class="pl-k">:</span> <span class="pl-k">new</span> <span class="pl-c1">Icon</span>(<span class="pl-c1">Icons</span>.add),
      ),
    );
  }
}</pre></div>
<p dir="auto">Result:<br>
The topmost widget (Layer B) will always register button presses, even if not visible/painted on screen. Seems wrong to me.</p>
<p dir="auto">This will prevent stacked items which are not visible from blocking items which are nevertheless "behind" them.</p>