Repository: flutter
Issue: Pixel-snapping in font rendering leads to jittery font scaling animations even when using optical sizing
Labels: engine,a: animation,f: material design,a: typography,has reproducible steps,P2,found in release: 1.22,found in release: 3.1,team-engine,triaged-engine

![tabbar](https://user-images.githubusercontent.com/22696085/48684883-c08cd900-ebee-11e8-926b-5d2fcb184e72.gif)

It's a very magical question and it looks like they're shaking, I think my code logic is fine.

```dart
class DataConfig {
  static int dataTargetIndex = 0;
}

const List<String> _titleList = [
  DataScreenType.basic,
  DataScreenType.promotion
];

class _DataViewModel {
  String targetDataTitle;

  _DataViewModel(this.targetDataTitle);

  static _DataViewModel fromStore(Store<AppState> store) {
    return _DataViewModel(store.state.manager.targetDataTitle);
  }

  @override
  int get hashCode => targetDataTitle.hashCode;

  @override
  bool operator ==(other) =>
      identical(this, other) ||
      other is _DataViewModel && targetDataTitle == other.targetDataTitle;
}

class DataScreen extends StatefulWidget {
  static const String routeName = '/data/data_screen';

  const DataScreen({Key key}) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    return _DataScreenState();
  }
}

class _DataScreenState extends State<DataScreen>
    with SingleTickerProviderStateMixin {
  TabController _tabController;

  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }

  @override
  void initState() {
    super.initState();
    DataConnectApi.promotionData(
        intervalType: StoreContainer.access.interval,
        isBusinessGroup: StoreContainer.access.isBusinessGroup);
    DataConnectApi.basicData(DateTime.now(), StoreContainer.access.interval);
    _tabController = TabController(length: _titleList.length, vsync: this);
    _tabController.index = DataConfig.dataTargetIndex;
    _tabController.addListener(() {
      DataConfig.dataTargetIndex = _tabController.index;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: TitleBar(
            hasBackward: false,
            child: DataCommon.buildBusinessList(context, BusinessListType.data),
            action: DataCommon.buildDataTitleBarAction(context,
                isDetailScreen: false, onDateChanged: () {
              DataConnectApi.promotionData(
                  intervalType: StoreContainer.access.interval,
                  isBusinessGroup: StoreContainer.access.isBusinessGroup);
              DataConnectApi.basicData(
                  DateTime.now(), StoreContainer.access.interval);
            })),
        body: _buildDataScreenBody(context));
  }

  Widget _buildDataScreenBody(BuildContext context) {
    return StoreConnector<AppState, _DataViewModel>(
        distinct: true,
        converter: (store) => _DataViewModel.fromStore(store),
        builder: (context, vm) {
          if (vm.targetDataTitle.isNotEmpty) {
            _tabController.index =
                _titleList.indexWhere((item) => item == vm.targetDataTitle);
            StoreContainer.global
                .dispatch(SwitchBusinessDataAction(targetDataTitle: ''));
          }
          return Column(children: <Widget>[
            Container(
                color: HColors.primary,
                height: 30.0,
                width: double.infinity,
                child: Align(
                    alignment: Alignment.center,
                    child: TabBar(
                        controller: _tabController,
                        indicatorSize: TabBarIndicatorSize.label,
                        indicatorColor: Colors.white,
                        indicatorWeight: HStyles.borderStyle.borderWidth,
                        isScrollable: true,
                        labelColor: Colors.white,
                        labelStyle: TextStyle(fontSize: HFontSizes.medium),
                        unselectedLabelColor: Colors.white.withOpacity(0.5),
                        unselectedLabelStyle:
                            TextStyle(fontSize: HFontSizes.normal),
                        tabs: _titleList
                            .map((test) => Tab(text: test))
                            .toList()))),
            Expanded(
                child: TabBarView(
                    controller: _tabController,
                    physics: NeverScrollableScrollPhysics(),
                    children: [DataBasic(), DataCampaign()]))
          ]);
        });
  }
}

```

flutter doctor -v

```
[✓] Flutter (Channel beta, v0.11.3, on Mac OS X 10.14 18A391, locale en-CN)
    • Flutter version 0.11.3 at /Users/dpuntu/flutter
    • Framework revision 72bf075e8d (9 days ago), 2018-11-09 20:36:17 -0800
    • Engine revision 5646e86a6f
    • Dart version 2.1.0 (build 2.1.0-dev.9.3 9c07fb64c4)

[✓] Android toolchain - develop for Android devices (Android SDK 28.0.3)
    • Android SDK at /Users/dpuntu/Library/Android/sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-28, build-tools 28.0.3
    • ANDROID_HOME = /Users/dpuntu/Library/Android/sdk
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1024-b01)
    • All Android licenses accepted.

[✓] iOS toolchain - develop for iOS devices (Xcode 10.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 10.1, Build version 10B61
    • ios-deploy 1.9.2
    • CocoaPods version 1.5.3

[✓] Android Studio (version 3.1)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 28.0.1
    • Dart plugin version 173.4700
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1024-b01)

[!] IntelliJ IDEA Community Edition (version 2017.3)
    • IntelliJ at /Applications/IntelliJ IDEA CE.app
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
    • For information about installing plugins, see
      https://flutter.io/intellij-setup/#installing-the-plugins

[✓] VS Code (version 1.28.2)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 2.19.0

[✓] Connected device (2 available)
    • Redmi 6A  • 4e2396217d22                         • android-arm • Android 8.1.0 (API 27)
    • iPhone XS • 05E5BE17-A9E5-4830-8699-E28E09B7772D • ios         • iOS 12.1 (simulator)

```