Commit 7edec886 authored by Michael Goderbauer's avatar Michael Goderbauer Committed by GitHub

Allow tapping on TabBar indicator to switch tabs (#11525)

* Allow tapping on TabBar indicator to switch tabs

* fix semantics

* review comments
parent 8f57c67d
...@@ -737,8 +737,11 @@ class _TabBarState extends State<TabBar> { ...@@ -737,8 +737,11 @@ class _TabBarState extends State<TabBar> {
children: <Widget>[ children: <Widget>[
new InkWell( new InkWell(
onTap: () { _handleTap(index); }, onTap: () { _handleTap(index); },
child: new Padding(
padding: new EdgeInsets.only(bottom: widget.indicatorWeight),
child: wrappedTabs[index], child: wrappedTabs[index],
), ),
),
new Semantics( new Semantics(
selected: index == _currentIndex, selected: index == _currentIndex,
// TODO(goderbauer): I10N-ify // TODO(goderbauer): I10N-ify
...@@ -753,8 +756,6 @@ class _TabBarState extends State<TabBar> { ...@@ -753,8 +756,6 @@ class _TabBarState extends State<TabBar> {
Widget tabBar = new CustomPaint( Widget tabBar = new CustomPaint(
painter: _indicatorPainter, painter: _indicatorPainter,
child: new Padding(
padding: new EdgeInsets.only(bottom: widget.indicatorWeight),
child: new _TabStyle( child: new _TabStyle(
animation: kAlwaysDismissedAnimation, animation: kAlwaysDismissedAnimation,
selected: false, selected: false,
...@@ -767,7 +768,6 @@ class _TabBarState extends State<TabBar> { ...@@ -767,7 +768,6 @@ class _TabBarState extends State<TabBar> {
children: wrappedTabs, children: wrappedTabs,
), ),
), ),
),
); );
if (widget.isScrollable) { if (widget.isScrollable) {
......
...@@ -7,6 +7,7 @@ import 'dart:ui' show SemanticsFlags, SemanticsAction; ...@@ -7,6 +7,7 @@ import 'dart:ui' show SemanticsFlags, SemanticsAction;
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/physics.dart'; import 'package:flutter/physics.dart';
import '../rendering/mock_canvas.dart'; import '../rendering/mock_canvas.dart';
...@@ -1007,14 +1008,14 @@ void main() { ...@@ -1007,14 +1008,14 @@ void main() {
actions: SemanticsAction.tap.index, actions: SemanticsAction.tap.index,
flags: SemanticsFlags.isSelected.index, flags: SemanticsFlags.isSelected.index,
label: 'TAB #0\nTab 1 of 2', label: 'TAB #0\nTab 1 of 2',
rect: new Rect.fromLTRB(0.0, 0.0, 108.0, 46.0), rect: new Rect.fromLTRB(0.0, 0.0, 108.0, kTextTabBarHeight),
transform: new Matrix4.translationValues(0.0, 276.0, 0.0), transform: new Matrix4.translationValues(0.0, 276.0, 0.0),
), ),
new TestSemantics( new TestSemantics(
id: 5, id: 5,
actions: SemanticsAction.tap.index, actions: SemanticsAction.tap.index,
label: 'TAB #1\nTab 2 of 2', label: 'TAB #1\nTab 2 of 2',
rect: new Rect.fromLTRB(0.0, 0.0, 108.0, 46.0), rect: new Rect.fromLTRB(0.0, 0.0, 108.0, kTextTabBarHeight),
transform: new Matrix4.translationValues(108.0, 276.0, 0.0), transform: new Matrix4.translationValues(108.0, 276.0, 0.0),
), ),
]), ]),
...@@ -1120,4 +1121,40 @@ void main() { ...@@ -1120,4 +1121,40 @@ void main() {
expect(find.text('PAGE'), findsOneWidget); expect(find.text('PAGE'), findsOneWidget);
}); });
testWidgets('can tap on indicator at very bottom of TabBar to switch tabs', (WidgetTester tester) async {
final TabController controller = new TabController(
vsync: const TestVSync(),
length: 2,
initialIndex: 0,
);
await tester.pumpWidget(
new Material(
child: new Column(
children: <Widget>[
new TabBar(
controller: controller,
indicatorWeight: 30.0,
tabs: const <Widget>[const Tab(text: 'TAB1'), const Tab(text: 'TAB2')],
),
new Flexible(
child: new TabBarView(
controller: controller,
children: const <Widget>[const Text('PAGE1'), const Text('PAGE2')],
),
),
],
),
),
);
expect(controller.index, 0);
final Offset bottomRight = tester.getBottomRight(find.byType(TabBar)) - const Offset(1.0, 1.0);
final TestGesture gesture = await tester.startGesture(bottomRight);
await gesture.up();
await tester.pumpAndSettle();
expect(controller.index, 1);
});
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment