Repository: flutter
Issue: iOS VoiceOver gets into buggy state when animating elevation to 0
Labels: platform-ios,framework,a: accessibility,customer: google,has reproducible steps,P2,found in release: 3.3,found in release: 3.6,team-ios,triaged-ios

The following code will produce a buggy state of iOS VoiceOver when run on a real iOS device.

Not reproducible on Android.

1. Open the app on a real iOS 
2. Turn on VoiceOver
3. Tap the FAB
4. Observe it getting into this strange state where swiping does not go to the next element:

![Screenshot 2019-10-08 at 1 33 32 PM](https://user-images.githubusercontent.com/591699/66418975-3baad980-e9d1-11e9-9182-14d4bd8d555d.png)

Strangely, if the elevation is lerped to 1, or even 1e-6, instead of 0, the VoiceOver works as intended. Also, this only seems to affect buttons. Changing the children to text also does not reproduce. Finally, if 1 item is used in the row, the bug does also not reproduce.

```
import 'dart:ui';

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'iOS Semantics Bug Demo',
      home: MyHomePage(),
    );
  }
}


class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text('Push the FAB with iOS voice over on to reproduce bug'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.of(context).push(FooPageRoute());
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

class FooPageRoute<T> extends PageRoute<T> {
  @override
  bool get opaque => false;

  @override
  Color get barrierColor => null;

  @override
  String get barrierLabel => null;

  @override
  Duration get transitionDuration => Duration(milliseconds: 1000);

  @override
  bool get maintainState => false;

  @override
  Widget buildPage(
    BuildContext context,
    Animation<double> animation,
    Animation<double> secondaryAnimation,
  ) {
    return FooPage(animation);
  }
}

class FooPage extends StatefulWidget {
  FooPage(this.animation);

  final Animation<double> animation;

  @override
  State<StatefulWidget> createState() => _FooPageState();
}

class _FooPageState extends State<FooPage> {
  @override
  Widget build(BuildContext context) {
    final animation = widget.animation;
    return Scaffold(
      body: SafeArea(
        child: SizedBox.expand(
          child: AnimatedBuilder(
            animation: animation,
            builder: (context, child) {
              // Animating the Padding is necessary to produce the voiceover bug.
              return Padding(
                padding: EdgeInsets.lerp(
                  EdgeInsets.only(
                    left: 100,
                    right: 100,
                    top: 100,
                    bottom: 100,
                  ),
                  EdgeInsets.zero,
                  animation.value,
                ),
                // Animated the elevation by using a Material with
                // animationDuration zero, or using a PhysicalShape, both
                // result in the voiceover bug.
                child: Material(
                  // Lerping from 20 to 0 causes a voiceover bug.
                  // Lerping from 20 to 1 will not result in a voiceover bug.
                  elevation: lerpDouble(20, 0, animation.value),
                  animationDuration: Duration.zero,
                  child: Row(
                    // If the children are Buttons, then the bug persists.
                    // If there is only 1 child, the bug does not persist.
                    // If the children are 2 Texts, the bug does not persist.
                    children: [
                      IconButton(
                        icon: Icon(Icons.person),
                        onPressed: () {},
                      ),
                      IconButton(
                        icon: Icon(Icons.chat),
                        onPressed: () {},
                      ),
                    ],
                  ),
                ),
              );
            },
          ),
        ),
      ),
    );
  }
}
```