From dc84e882dfd6ebd1dead188e78acd85b952bcaf8 Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Fri, 28 Aug 2015 10:58:06 -0700 Subject: [PATCH] Use GestureDetector in the framework and examples We're now using it at the widget layer for everything except scrolling and flinging. --- examples/demo_launcher/lib/main.dart | 4 ++-- examples/fitness/lib/feed.dart | 7 ++----- examples/fitness/lib/meal.dart | 7 +++---- examples/fitness/lib/measurement.dart | 15 ++++++-------- examples/mine_digger/lib/main.dart | 20 +++++++++---------- examples/widgets/ensure_visible.dart | 8 +++----- examples/widgets/mixed_viewport.dart | 11 +++------- examples/widgets/pop_out_and_expand.dart | 4 ++-- examples/widgets/progress_indicator.dart | 8 +++----- packages/flutter/lib/widgets.dart | 1 + packages/flutter/lib/widgets/date_picker.dart | 20 +++++++++---------- packages/flutter/lib/widgets/dialog.dart | 5 +++-- packages/flutter/lib/widgets/drawer.dart | 14 ++++++------- packages/flutter/lib/widgets/drawer_item.dart | 11 ++++------ .../lib/widgets/floating_action_button.dart | 8 +++----- packages/flutter/lib/widgets/icon_button.dart | 5 +---- .../flutter/lib/widgets/material_button.dart | 7 ++++--- .../flutter/lib/widgets/modal_overlay.dart | 8 +++----- .../flutter/lib/widgets/popup_menu_item.dart | 8 +++----- packages/flutter/lib/widgets/radio.dart | 16 +++++++-------- packages/flutter/lib/widgets/snack_bar.dart | 13 +++++------- packages/flutter/lib/widgets/tabs.dart | 9 +++++---- packages/unit/test/widget/widget_tester.dart | 4 +++- 23 files changed, 92 insertions(+), 121 deletions(-) diff --git a/examples/demo_launcher/lib/main.dart b/examples/demo_launcher/lib/main.dart index c2b44cc28ef..02264828427 100644 --- a/examples/demo_launcher/lib/main.dart +++ b/examples/demo_launcher/lib/main.dart @@ -162,9 +162,9 @@ class DemoList extends Component { } Widget buildDemo(SkyDemo demo) { - return new Listener( + return new GestureDetector( key: demo.key, - onGestureTap: (_) => launch(demo.href, demo.bundle), + onTap: () => launch(demo.href, demo.bundle), child: new Container( height: kCardHeight, child: new Card( diff --git a/examples/fitness/lib/feed.dart b/examples/fitness/lib/feed.dart index a139aeffe23..24b2d476194 100644 --- a/examples/fitness/lib/feed.dart +++ b/examples/fitness/lib/feed.dart @@ -39,11 +39,8 @@ class DialogMenuItem extends ButtonBase { } Widget buildContent() { - return new Listener( - onGestureTap: (_) { - if (onPressed != null) - onPressed(); - }, + return new GestureDetector( + onTap: onPressed, child: new Container( height: 48.0, child: new InkWell( diff --git a/examples/fitness/lib/meal.dart b/examples/fitness/lib/meal.dart index 051fa8742d4..e18e418878e 100644 --- a/examples/fitness/lib/meal.dart +++ b/examples/fitness/lib/meal.dart @@ -56,10 +56,9 @@ class MealFragment extends StatefulComponent { String _description = ""; - EventDisposition _handleSave() { + void _handleSave() { onCreated(new Meal(when: new DateTime.now(), description: _description)); navigator.pop(); - return EventDisposition.processed; } Widget buildToolBar() { @@ -69,8 +68,8 @@ class MealFragment extends StatefulComponent { onPressed: navigator.pop), center: new Text('New Meal'), right: [new InkWell( - child: new Listener( - onGestureTap: (_) => _handleSave(), + child: new GestureDetector( + onTap: _handleSave, child: new Text('SAVE') ) )] diff --git a/examples/fitness/lib/measurement.dart b/examples/fitness/lib/measurement.dart index 5d027d6198e..63dcbf8a838 100644 --- a/examples/fitness/lib/measurement.dart +++ b/examples/fitness/lib/measurement.dart @@ -119,7 +119,7 @@ class MeasurementFragment extends StatefulComponent { DateTime _when = new DateTime.now(); String _errorMessage = null; - EventDisposition _handleSave() { + void _handleSave() { double parsedWeight; try { parsedWeight = double.parse(_weight); @@ -128,11 +128,9 @@ class MeasurementFragment extends StatefulComponent { setState(() { _errorMessage = "Save failed"; }); - return EventDisposition.processed; } onCreated(new Measurement(when: _when, weight: parsedWeight)); navigator.pop(); - return EventDisposition.processed; } Widget buildToolBar() { @@ -142,8 +140,8 @@ class MeasurementFragment extends StatefulComponent { onPressed: navigator.pop), center: new Text('New Measurement'), right: [new InkWell( - child: new Listener( - onGestureTap: (_) => _handleSave(), + child: new GestureDetector( + onTap: _handleSave, child: new Text('SAVE') ) )] @@ -158,7 +156,7 @@ class MeasurementFragment extends StatefulComponent { static final GlobalKey weightKey = new GlobalKey(); - EventDisposition _handleDatePressed(_) { + void _handleDatePressed() { showDialog(navigator, (navigator) { return new MeasurementDateDialog(navigator: navigator, previousDate: _when); }).then((DateTime value) { @@ -168,7 +166,6 @@ class MeasurementFragment extends StatefulComponent { _when = value; }); }); - return EventDisposition.processed; } Widget buildBody() { @@ -179,8 +176,8 @@ class MeasurementFragment extends StatefulComponent { child: new Container( padding: const EdgeDims.all(20.0), child: new Column([ - new Listener( - onGestureTap: _handleDatePressed, + new GestureDetector( + onTap: _handleDatePressed, child: new Container( height: 50.0, child: new Column([ diff --git a/examples/mine_digger/lib/main.dart b/examples/mine_digger/lib/main.dart index ede98ad244b..3b8e561f66c 100644 --- a/examples/mine_digger/lib/main.dart +++ b/examples/mine_digger/lib/main.dart @@ -107,19 +107,19 @@ class MineDiggerApp extends App { state = cells[iy][ix] ? CellState.shown : state; } if (state == CellState.covered) { - row.add(new Listener( - onPointerDown: _pointerDownHandlerFor(ix, iy), - onGestureTap: (_) { - probe(ix, iy); - }, - onGestureLongPress: (_) { + row.add(new GestureDetector( + onTap: () => probe(ix, iy), + onLongPress: () { activity.userFeedback.performHapticFeedback(activity.HapticFeedbackType_LONG_PRESS); flag(ix, iy); }, - child: new CoveredMineNode( - flagged: false, - posX: ix, - posY: iy + child: new Listener( + onPointerDown: _pointerDownHandlerFor(ix, iy), + child: new CoveredMineNode( + flagged: false, + posX: ix, + posY: iy + ) ) )); // Mutating |hasCoveredCell| here is hacky, but convenient, same diff --git a/examples/widgets/ensure_visible.dart b/examples/widgets/ensure_visible.dart index fb0e4171ad2..d1cc9a0a944 100644 --- a/examples/widgets/ensure_visible.dart +++ b/examples/widgets/ensure_visible.dart @@ -41,13 +41,11 @@ class EnsureVisibleApp extends App { super.initState(); } - EventDisposition handleTap(Widget card, CardModel cardModel) { + void handleTap(Widget card, CardModel cardModel) { ensureWidgetIsVisible(card, duration: const Duration(milliseconds: 200)) .then((_) { setState(() { selectedCardModel = cardModel; }); }); - - return EventDisposition.processed; } Widget builder(int index) { @@ -63,9 +61,9 @@ class EnsureVisibleApp extends App { child: new Center(child: new Text(cardModel.label, style: style)) ) ); - return new Listener( + return new GestureDetector( key: cardModel.key, - onGestureTap: (_) { return handleTap(card, cardModel); }, + onTap: () => handleTap(card, cardModel), child: card ); } diff --git a/examples/widgets/mixed_viewport.dart b/examples/widgets/mixed_viewport.dart index 645963291fa..d774d0528d2 100644 --- a/examples/widgets/mixed_viewport.dart +++ b/examples/widgets/mixed_viewport.dart @@ -106,17 +106,15 @@ class MixedViewportApp extends App { Widget builder(int index) { if (index >= lengths.length) return null; - return new Listener( + return new GestureDetector( key: new Key.stringify(lengths[index]), + onTap: () => removeBox(index), child: new Container( decoration: new BoxDecoration( backgroundColor: new Color((0xFF000000 + 0xFFFFFF * lengths[index] / kMaxLength).round()) ), height: lengths[index] + 12.0 - ), - onGestureTap: (_) { - removeBox(index); - } + ) ); } @@ -124,7 +122,4 @@ class MixedViewportApp extends App { void main() { runApp(new MixedViewportApp()); - // scheduler.addPersistentFrameCallback((_) { - // SkyBinding.instance.debugDumpRenderTree(); - // }); } diff --git a/examples/widgets/pop_out_and_expand.dart b/examples/widgets/pop_out_and_expand.dart index 9adc6bb59ce..9094900d77d 100644 --- a/examples/widgets/pop_out_and_expand.dart +++ b/examples/widgets/pop_out_and_expand.dart @@ -46,8 +46,8 @@ class ExampleApp extends App { GlobalKey _overlay; Widget _buildCard(CardData cardData) { - return new Listener( - onGestureTap: (_) { + return new GestureDetector( + onTap: () { setState(() { _overlay = cardData.key; }); diff --git a/examples/widgets/progress_indicator.dart b/examples/widgets/progress_indicator.dart index 06b4d41094b..a9be0488044 100644 --- a/examples/widgets/progress_indicator.dart +++ b/examples/widgets/progress_indicator.dart @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:sky' as sky; - import 'package:sky/animation/animation_performance.dart'; import 'package:sky/animation/animated_value.dart'; import 'package:sky/animation/curves.dart'; @@ -28,7 +26,7 @@ class ProgressIndicatorApp extends App { ); } - void handleTap(sky.GestureEvent event) { + void handleTap() { if (valueAnimation.isAnimating) valueAnimation.stop(); else @@ -73,8 +71,8 @@ class ProgressIndicatorApp extends App { } Widget build() { - Widget body = new Listener( - onGestureTap: (e) { handleTap(e); }, + Widget body = new GestureDetector( + onTap: handleTap, child: new Container( padding: const EdgeDims.symmetric(vertical: 12.0, horizontal: 8.0), decoration: new BoxDecoration(backgroundColor: Theme.of(this).cardColor), diff --git a/packages/flutter/lib/widgets.dart b/packages/flutter/lib/widgets.dart index e5d58418939..cf205b09934 100644 --- a/packages/flutter/lib/widgets.dart +++ b/packages/flutter/lib/widgets.dart @@ -23,6 +23,7 @@ export 'widgets/flat_button.dart'; export 'widgets/floating_action_button.dart'; export 'widgets/focus.dart'; export 'widgets/framework.dart'; +export 'widgets/gesture_detector.dart'; export 'widgets/icon.dart'; export 'widgets/icon_button.dart'; export 'widgets/ink_well.dart'; diff --git a/packages/flutter/lib/widgets/date_picker.dart b/packages/flutter/lib/widgets/date_picker.dart index 718faf12598..c95deff0ab8 100644 --- a/packages/flutter/lib/widgets/date_picker.dart +++ b/packages/flutter/lib/widgets/date_picker.dart @@ -140,21 +140,21 @@ class DatePickerHeader extends Component { return new Container( child: new BlockBody([ new Center( - child: new Listener( + child: new GestureDetector( child: new Text(new DateFormat("MMM").format(selectedDate).toUpperCase(), style: monthStyle), - onGestureTap: (_) => _handleChangeMode(DatePickerMode.day) + onTap: () => _handleChangeMode(DatePickerMode.day) ) ), new Center( - child: new Listener( + child: new GestureDetector( child: new Text(new DateFormat("d").format(selectedDate), style: dayStyle), - onGestureTap: (_) => _handleChangeMode(DatePickerMode.day) + onTap: () => _handleChangeMode(DatePickerMode.day) ) ), new Center( - child: new Listener( + child: new GestureDetector( child: new Text(new DateFormat("yyyy").format(selectedDate), style: yearStyle), - onGestureTap: (_) => _handleChangeMode(DatePickerMode.year) + onTap: () => _handleChangeMode(DatePickerMode.year) ) ) ]), @@ -244,8 +244,8 @@ class DayPicker extends Component { currentDate.day == day) itemStyle = itemStyle.copyWith(color: theme.primaryColor); - item = new Listener( - onGestureTap: (_) { + item = new GestureDetector( + onTap: () { DateTime result = new DateTime(year, month, day); onChanged(result); }, @@ -386,9 +386,9 @@ class YearPicker extends ScrollableWidgetList { for(int i = start; i < start + count; i++) { int year = firstDate.year + i; String label = year.toString(); - Widget item = new Listener( + Widget item = new GestureDetector( key: new Key(label), - onGestureTap: (_) { + onTap: () { DateTime result = new DateTime(year, selectedDate.month, selectedDate.day); onChanged(result); }, diff --git a/packages/flutter/lib/widgets/dialog.dart b/packages/flutter/lib/widgets/dialog.dart index 6add84afb23..11073148385 100644 --- a/packages/flutter/lib/widgets/dialog.dart +++ b/packages/flutter/lib/widgets/dialog.dart @@ -10,6 +10,7 @@ import 'package:sky/theme/colors.dart' as colors; import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/default_text_style.dart'; import 'package:sky/widgets/focus.dart'; +import 'package:sky/widgets/gesture_detector.dart'; import 'package:sky/widgets/material.dart'; import 'package:sky/widgets/navigator.dart'; import 'package:sky/widgets/scrollable.dart'; @@ -101,13 +102,13 @@ class Dialog extends Component { )); return new Stack([ - new Listener( + new GestureDetector( child: new Container( decoration: const BoxDecoration( backgroundColor: const Color(0x7F000000) ) ), - onGestureTap: (_) => onDismiss() + onTap: onDismiss ), new Center( child: new Container( diff --git a/packages/flutter/lib/widgets/drawer.dart b/packages/flutter/lib/widgets/drawer.dart index 400f4643033..b789d525d51 100644 --- a/packages/flutter/lib/widgets/drawer.dart +++ b/packages/flutter/lib/widgets/drawer.dart @@ -8,10 +8,11 @@ import 'dart:sky' as sky; import 'package:sky/animation/animated_value.dart'; import 'package:sky/animation/animation_performance.dart'; import 'package:sky/animation/forces.dart'; -import 'package:sky/theme/shadows.dart'; import 'package:sky/theme/colors.dart' as colors; +import 'package:sky/theme/shadows.dart'; import 'package:sky/widgets/animated_container.dart'; import 'package:sky/widgets/basic.dart'; +import 'package:sky/widgets/gesture_detector.dart'; import 'package:sky/widgets/navigator.dart'; import 'package:sky/widgets/scrollable.dart'; import 'package:sky/widgets/theme.dart'; @@ -84,14 +85,16 @@ class Drawer extends StatefulComponent { } Widget build() { - var mask = new Listener( + var mask = new GestureDetector( child: new ColorTransition( performance: _performance, direction: showing ? Direction.forward : Direction.reverse, color: new AnimatedColorValue(colors.transparent, end: const Color(0x7F000000)), child: new Container() ), - onGestureTap: handleMaskTap + onTap: () { + _performance.reverse(); + } ); Widget content = new SlideTransition( @@ -132,11 +135,6 @@ class Drawer extends StatefulComponent { void _settle() { _isMostlyClosed ? _performance.reverse() : _performance.play(); } - EventDisposition handleMaskTap(_) { - _performance.reverse(); - return EventDisposition.consumed; - } - // TODO(mpcomplete): Figure out how to generalize these handlers on a // "PannableThingy" interface. EventDisposition handlePointerDown(_) { diff --git a/packages/flutter/lib/widgets/drawer_item.dart b/packages/flutter/lib/widgets/drawer_item.dart index 919073977ff..84b87876375 100644 --- a/packages/flutter/lib/widgets/drawer_item.dart +++ b/packages/flutter/lib/widgets/drawer_item.dart @@ -9,10 +9,11 @@ import 'package:sky/theme/colors.dart' as colors; import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/button_base.dart'; import 'package:sky/widgets/default_text_style.dart'; +import 'package:sky/widgets/framework.dart'; +import 'package:sky/widgets/gesture_detector.dart'; import 'package:sky/widgets/icon.dart'; import 'package:sky/widgets/ink_well.dart'; import 'package:sky/widgets/theme.dart'; -import 'package:sky/widgets/framework.dart'; typedef EventDisposition OnPressedFunction(); @@ -81,12 +82,8 @@ class DrawerItem extends ButtonBase { ) ); - return new Listener( - onGestureTap: (_) { - if (onPressed != null) - return onPressed(); - return EventDisposition.ignored; - }, + return new GestureDetector( + onTap: onPressed, child: new Container( height: 48.0, decoration: new BoxDecoration(backgroundColor: _getBackgroundColor(themeData)), diff --git a/packages/flutter/lib/widgets/floating_action_button.dart b/packages/flutter/lib/widgets/floating_action_button.dart index 5375b78fd76..4f15df92009 100644 --- a/packages/flutter/lib/widgets/floating_action_button.dart +++ b/packages/flutter/lib/widgets/floating_action_button.dart @@ -4,6 +4,7 @@ import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/button_base.dart'; +import 'package:sky/widgets/gesture_detector.dart'; import 'package:sky/widgets/icon.dart'; import 'package:sky/widgets/ink_well.dart'; import 'package:sky/widgets/material.dart'; @@ -47,11 +48,8 @@ class FloatingActionButton extends ButtonBase { type: MaterialType.circle, level: highlight ? 3 : 2, child: new ClipOval( - child: new Listener( - onGestureTap: (_) { - if (onPressed != null) - onPressed(); - }, + child: new GestureDetector( + onTap: onPressed, child: new Container( width: _kSize, height: _kSize, diff --git a/packages/flutter/lib/widgets/icon_button.dart b/packages/flutter/lib/widgets/icon_button.dart index a66458bbd9a..af32206eb40 100644 --- a/packages/flutter/lib/widgets/icon_button.dart +++ b/packages/flutter/lib/widgets/icon_button.dart @@ -27,10 +27,7 @@ class IconButton extends Component { ); } return new GestureDetector( - onTap: () { - if (onPressed != null) - onPressed(); - }, + onTap: onPressed, child: new Padding( child: child, padding: const EdgeDims.all(8.0)) diff --git a/packages/flutter/lib/widgets/material_button.dart b/packages/flutter/lib/widgets/material_button.dart index 34a47b004ae..94873c058a7 100644 --- a/packages/flutter/lib/widgets/material_button.dart +++ b/packages/flutter/lib/widgets/material_button.dart @@ -4,6 +4,7 @@ import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/button_base.dart'; +import 'package:sky/widgets/gesture_detector.dart'; import 'package:sky/widgets/ink_well.dart'; import 'package:sky/widgets/material.dart'; @@ -36,7 +37,8 @@ abstract class MaterialButton extends ButtonBase { padding: new EdgeDims.symmetric(horizontal: 8.0), child: new Center(child: child) // TODO(ianh): figure out a way to compell the child to have gray text when disabled... ); - return new Listener( + return new GestureDetector( + onTap: enabled ? onPressed : null, child: new Container( height: 36.0, constraints: new BoxConstraints(minWidth: 88.0), @@ -47,8 +49,7 @@ abstract class MaterialButton extends ButtonBase { level: level, color: color ) - ), - onGestureTap: (_) { if (onPressed != null && enabled) onPressed(); } + ) ); } diff --git a/packages/flutter/lib/widgets/modal_overlay.dart b/packages/flutter/lib/widgets/modal_overlay.dart index 1669b49f509..35595a8c729 100644 --- a/packages/flutter/lib/widgets/modal_overlay.dart +++ b/packages/flutter/lib/widgets/modal_overlay.dart @@ -4,6 +4,7 @@ import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/framework.dart'; +import 'package:sky/widgets/gesture_detector.dart'; class ModalOverlay extends Component { @@ -13,11 +14,8 @@ class ModalOverlay extends Component { final Function onDismiss; Widget build() { - return new Listener( - onGestureTap: (_) { - if (onDismiss != null) - onDismiss(); - }, + return new GestureDetector( + onTap: onDismiss, child: new Stack(children) ); } diff --git a/packages/flutter/lib/widgets/popup_menu_item.dart b/packages/flutter/lib/widgets/popup_menu_item.dart index df20c058a04..1f5eb380171 100644 --- a/packages/flutter/lib/widgets/popup_menu_item.dart +++ b/packages/flutter/lib/widgets/popup_menu_item.dart @@ -5,6 +5,7 @@ import 'package:sky/painting/text_style.dart'; import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/default_text_style.dart'; +import 'package:sky/widgets/gesture_detector.dart'; import 'package:sky/widgets/ink_well.dart'; import 'package:sky/widgets/theme.dart'; @@ -24,11 +25,8 @@ class PopupMenuItem extends Component { TextStyle get textStyle => Theme.of(this).text.subhead; Widget build() { - return new Listener( - onGestureTap: (_) { - if (onPressed != null) - onPressed(); - }, + return new GestureDetector( + onTap: onPressed, child: new InkWell( child: new Container( height: kMenuItemHeight, diff --git a/packages/flutter/lib/widgets/radio.dart b/packages/flutter/lib/widgets/radio.dart index 277d20cb528..912e638b339 100644 --- a/packages/flutter/lib/widgets/radio.dart +++ b/packages/flutter/lib/widgets/radio.dart @@ -7,6 +7,7 @@ import 'dart:sky' as sky; import 'package:sky/rendering/object.dart'; import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/button_base.dart'; +import 'package:sky/widgets/gesture_detector.dart'; import 'package:sky/widgets/theme.dart'; const sky.Color _kLightOffColor = const sky.Color(0x8A000000); @@ -21,7 +22,9 @@ class Radio extends ButtonBase { this.value, this.groupValue, this.onChanged - }) : super(key: key); + }) : super(key: key) { + assert(onChanged != null); + } Object value; Object groupValue; @@ -45,7 +48,8 @@ class Radio extends ButtonBase { const double kDiameter = 16.0; const double kOuterRadius = kDiameter / 2; const double kInnerRadius = 5.0; - return new Listener( + return new GestureDetector( + onTap: () => onChanged(value), child: new Container( margin: const EdgeDims.symmetric(horizontal: 5.0), width: kDiameter, @@ -67,14 +71,8 @@ class Radio extends ButtonBase { } } ) - ), - onGestureTap: _handleTap + ) ); } - EventDisposition _handleTap(_) { - onChanged(value); - return EventDisposition.consumed; - } - } diff --git a/packages/flutter/lib/widgets/snack_bar.dart b/packages/flutter/lib/widgets/snack_bar.dart index d17f55233df..83ba2e20b4a 100644 --- a/packages/flutter/lib/widgets/snack_bar.dart +++ b/packages/flutter/lib/widgets/snack_bar.dart @@ -10,6 +10,7 @@ import 'package:sky/painting/text_style.dart'; import 'package:sky/theme/typography.dart' as typography; import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/default_text_style.dart'; +import 'package:sky/widgets/gesture_detector.dart'; import 'package:sky/widgets/material.dart'; import 'package:sky/widgets/theme.dart'; import 'package:sky/widgets/transitions.dart'; @@ -29,8 +30,8 @@ class SnackBarAction extends Component { final Function onPressed; Widget build() { - return new Listener( - onGestureTap: (_) => onPressed(), + return new GestureDetector( + onTap: onPressed, child: new Container( margin: const EdgeDims.only(left: 24.0), padding: const EdgeDims.only(top: 14.0, bottom: 14.0), @@ -39,6 +40,7 @@ class SnackBarAction extends Component { ); } } + class SnackBar extends Component { SnackBar({ @@ -58,11 +60,6 @@ class SnackBar extends Component { bool showing; SnackBarDismissedCallback onDismissed; - void _onDismissed() { - if (onDismissed != null) - onDismissed(); - } - Widget build() { List children = [ new Flexible( @@ -84,7 +81,7 @@ class SnackBar extends Component { position: new AnimatedValue(Point.origin, end: const Point(0.0, -52.0), curve: easeIn, reverseCurve: easeOut), - onDismissed: _onDismissed, + onDismissed: onDismissed, anchor: anchor, child: new Material( level: 2, diff --git a/packages/flutter/lib/widgets/tabs.dart b/packages/flutter/lib/widgets/tabs.dart index 5e5c704debc..0b78f857eb5 100644 --- a/packages/flutter/lib/widgets/tabs.dart +++ b/packages/flutter/lib/widgets/tabs.dart @@ -18,12 +18,13 @@ import 'package:sky/theme/colors.dart' as colors; import 'package:sky/theme/typography.dart' as typography; import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/default_text_style.dart'; +import 'package:sky/widgets/framework.dart'; +import 'package:sky/widgets/gesture_detector.dart'; import 'package:sky/widgets/icon.dart'; import 'package:sky/widgets/ink_well.dart'; import 'package:sky/widgets/scrollable.dart'; import 'package:sky/widgets/theme.dart'; import 'package:sky/widgets/transitions.dart'; -import 'package:sky/widgets/framework.dart'; typedef void SelectedIndexChanged(int selectedIndex); typedef void LayoutChanged(Size size, List widths); @@ -478,14 +479,14 @@ class TabBar extends Scrollable { } Widget _toTab(TabLabel label, int tabIndex, Color color, Color selectedColor) { - return new Listener( + return new GestureDetector( + onTap: () => _handleTap(tabIndex), child: new Tab( label: label, color: color, selected: tabIndex == selectedIndex, selectedColor: selectedColor - ), - onGestureTap: (_) => _handleTap(tabIndex) + ) ); } diff --git a/packages/unit/test/widget/widget_tester.dart b/packages/unit/test/widget/widget_tester.dart index 94e73be4952..c05a764b00b 100644 --- a/packages/unit/test/widget/widget_tester.dart +++ b/packages/unit/test/widget/widget_tester.dart @@ -84,7 +84,9 @@ class WidgetTester { } void tap(Widget widget) { - dispatchEvent(new TestGestureEvent(type: 'gesturetap'), getCenter(widget)); + Point location = getCenter(widget); + dispatchEvent(new TestPointerEvent(type: 'pointerdown', x: location.x, y: location.y), location); + dispatchEvent(new TestPointerEvent(type: 'pointerup', x: location.x, y: location.y), location); } void scroll(Widget widget, Offset offset) {