From 797e27edd3d4c778b20b7a56d4f1fbd663e957d2 Mon Sep 17 00:00:00 2001 From: Hixie Date: Mon, 14 Mar 2016 13:31:43 -0700 Subject: [PATCH] Add @override annotations to flutter framework --- dev/manual_tests/card_collection.dart | 3 + dev/manual_tests/drag_and_drop.dart | 15 ++ dev/manual_tests/mozart.dart | 7 + dev/manual_tests/overlay_geometry.dart | 6 + dev/manual_tests/pageable_list.dart | 3 + dev/manual_tests/raw_keyboard.dart | 2 + examples/layers/rendering/autolayout.dart | 2 + .../layers/rendering/src/sector_layout.dart | 38 ++++++ .../layers/rendering/src/solid_color_box.dart | 6 + examples/layers/rendering/touch_input.dart | 5 + examples/layers/services/media_service.dart | 1 + examples/layers/widgets/autolayout.dart | 4 + .../layers/widgets/custom_render_box.dart | 5 + examples/layers/widgets/gestures.dart | 4 + examples/layers/widgets/media_query.dart | 3 + examples/layers/widgets/sectors.dart | 2 + examples/layers/widgets/spinning_mixed.dart | 3 + examples/layers/widgets/spinning_square.dart | 3 + examples/layers/widgets/styled_text.dart | 4 + .../lib/demo/buttons_demo.dart | 5 + .../material_gallery/lib/demo/cards_demo.dart | 2 + .../material_gallery/lib/demo/chip_demo.dart | 2 + .../lib/demo/colors_demo.dart | 3 + .../lib/demo/date_picker_demo.dart | 2 + .../lib/demo/dialog_demo.dart | 3 + .../lib/demo/drop_down_demo.dart | 2 + .../lib/demo/fitness_demo.dart | 11 ++ .../lib/demo/flexible_space_demo.dart | 4 + .../lib/demo/full_screen_dialog_demo.dart | 3 + .../lib/demo/grid_list_demo.dart | 7 + .../material_gallery/lib/demo/icons_demo.dart | 2 + .../lib/demo/leave_behind_demo.dart | 3 + .../material_gallery/lib/demo/list_demo.dart | 2 + .../material_gallery/lib/demo/menu_demo.dart | 3 + .../lib/demo/modal_bottom_sheet_demo.dart | 1 + .../lib/demo/page_selector_demo.dart | 1 + .../demo/persistent_bottom_sheet_demo.dart | 1 + .../lib/demo/progress_indicator_demo.dart | 3 + .../lib/demo/scrolling_techniques_demo.dart | 3 + .../lib/demo/slider_demo.dart | 2 + .../lib/demo/snack_bar_demo.dart | 1 + .../material_gallery/lib/demo/tabs_demo.dart | 1 + .../lib/demo/tabs_fab_demo.dart | 3 + .../lib/demo/text_field_demo.dart | 2 + .../lib/demo/time_picker_demo.dart | 2 + .../lib/demo/toggle_controls_demo.dart | 2 + .../lib/demo/tooltip_demo.dart | 1 + .../lib/demo/two_level_list_demo.dart | 1 + .../lib/demo/typography_demo.dart | 2 + .../lib/demo/weather_demo.dart | 8 ++ .../material_gallery/lib/gallery/app.dart | 2 + .../material_gallery/lib/gallery/drawer.dart | 1 + .../material_gallery/lib/gallery/home.dart | 2 + .../material_gallery/lib/gallery/section.dart | 1 + examples/stocks/lib/main.dart | 3 + examples/stocks/lib/stock_arrow.dart | 3 + examples/stocks/lib/stock_home.dart | 5 + examples/stocks/lib/stock_list.dart | 1 + examples/stocks/lib/stock_row.dart | 8 ++ examples/stocks/lib/stock_settings.dart | 2 + examples/stocks/lib/stock_symbol_viewer.dart | 3 + packages/cassowary/lib/expression.dart | 3 + packages/cassowary/lib/param.dart | 3 + packages/cassowary/lib/parser_exception.dart | 1 + packages/cassowary/lib/row.dart | 1 + packages/cassowary/lib/solver.dart | 1 + packages/cassowary/lib/symbol.dart | 1 + packages/cassowary/lib/term.dart | 4 + .../flutter/lib/src/animation/animation.dart | 1 + .../src/animation/animation_controller.dart | 10 ++ .../flutter/lib/src/animation/animations.dart | 50 +++++++ .../flutter/lib/src/animation/curves.dart | 25 ++++ .../flutter/lib/src/animation/forces.dart | 1 + .../lib/src/animation/listener_helpers.dart | 8 ++ packages/flutter/lib/src/animation/tween.dart | 11 ++ .../flutter/lib/src/gestures/binding.dart | 3 + packages/flutter/lib/src/gestures/drag.dart | 23 ++++ packages/flutter/lib/src/gestures/events.dart | 1 + .../flutter/lib/src/gestures/hit_test.dart | 2 + .../flutter/lib/src/gestures/long_press.dart | 3 + .../flutter/lib/src/gestures/lsq_solver.dart | 2 + .../flutter/lib/src/gestures/multidrag.dart | 21 +++ .../flutter/lib/src/gestures/multitap.dart | 11 ++ .../flutter/lib/src/gestures/recognizer.dart | 11 ++ packages/flutter/lib/src/gestures/scale.dart | 5 + packages/flutter/lib/src/gestures/tap.dart | 6 + .../lib/src/gestures/velocity_tracker.dart | 7 + packages/flutter/lib/src/material/app.dart | 5 +- .../flutter/lib/src/material/app_bar.dart | 1 + .../lib/src/material/bottom_sheet.dart | 14 ++ packages/flutter/lib/src/material/button.dart | 3 + packages/flutter/lib/src/material/card.dart | 1 + .../flutter/lib/src/material/checkbox.dart | 4 + packages/flutter/lib/src/material/chip.dart | 1 + .../lib/src/material/circle_avatar.dart | 1 + .../flutter/lib/src/material/date_picker.dart | 10 ++ .../lib/src/material/date_picker_dialog.dart | 3 + packages/flutter/lib/src/material/dialog.dart | 8 ++ .../flutter/lib/src/material/divider.dart | 1 + packages/flutter/lib/src/material/drawer.dart | 5 + .../lib/src/material/drawer_header.dart | 1 + .../flutter/lib/src/material/drawer_item.dart | 1 + .../flutter/lib/src/material/dropdown.dart | 20 +++ .../flutter/lib/src/material/flat_button.dart | 6 +- .../lib/src/material/flexible_space_bar.dart | 3 +- .../src/material/floating_action_button.dart | 4 + .../flutter/lib/src/material/grid_tile.dart | 1 + .../lib/src/material/grid_tile_bar.dart | 1 + packages/flutter/lib/src/material/icon.dart | 2 + .../flutter/lib/src/material/icon_button.dart | 2 + .../flutter/lib/src/material/icon_theme.dart | 2 + .../lib/src/material/icon_theme_data.dart | 3 + packages/flutter/lib/src/material/icons.dart | 5 + .../flutter/lib/src/material/ink_well.dart | 4 + packages/flutter/lib/src/material/input.dart | 2 + packages/flutter/lib/src/material/list.dart | 2 + .../flutter/lib/src/material/list_item.dart | 1 + .../flutter/lib/src/material/material.dart | 24 ++++ packages/flutter/lib/src/material/page.dart | 9 ++ .../flutter/lib/src/material/popup_menu.dart | 28 ++++ .../lib/src/material/progress_indicator.dart | 13 ++ packages/flutter/lib/src/material/radio.dart | 5 + .../lib/src/material/raised_button.dart | 6 +- .../flutter/lib/src/material/scaffold.dart | 16 +++ .../lib/src/material/scrollbar_painter.dart | 4 + packages/flutter/lib/src/material/slider.dart | 6 + .../flutter/lib/src/material/snack_bar.dart | 2 + packages/flutter/lib/src/material/switch.dart | 5 + packages/flutter/lib/src/material/tabs.dart | 43 ++++++ packages/flutter/lib/src/material/theme.dart | 7 + .../flutter/lib/src/material/theme_data.dart | 4 + .../flutter/lib/src/material/time_picker.dart | 12 ++ .../lib/src/material/time_picker_dialog.dart | 3 + .../flutter/lib/src/material/toggleable.dart | 16 +++ .../flutter/lib/src/material/tooltip.dart | 10 ++ .../lib/src/material/two_level_list.dart | 5 + .../flutter/lib/src/painting/box_painter.dart | 43 ++++++ packages/flutter/lib/src/painting/colors.dart | 3 + .../flutter/lib/src/painting/decoration.dart | 2 + .../flutter/lib/src/painting/edge_insets.dart | 3 + .../lib/src/painting/text_editing.dart | 6 + .../lib/src/painting/text_painter.dart | 4 + .../flutter/lib/src/painting/text_style.dart | 3 + .../lib/src/rendering/auto_layout.dart | 8 ++ .../flutter/lib/src/rendering/binding.dart | 2 + packages/flutter/lib/src/rendering/block.dart | 26 ++++ packages/flutter/lib/src/rendering/box.dart | 28 +++- .../flutter/lib/src/rendering/child_view.dart | 10 ++ .../lib/src/rendering/custom_layout.dart | 10 ++ .../lib/src/rendering/editable_line.dart | 10 ++ packages/flutter/lib/src/rendering/error.dart | 8 ++ packages/flutter/lib/src/rendering/flex.dart | 13 ++ packages/flutter/lib/src/rendering/grid.dart | 20 +++ packages/flutter/lib/src/rendering/image.dart | 8 ++ packages/flutter/lib/src/rendering/layer.dart | 21 +++ packages/flutter/lib/src/rendering/list.dart | 6 + .../flutter/lib/src/rendering/object.dart | 33 +++++ .../flutter/lib/src/rendering/overflow.dart | 23 ++++ .../flutter/lib/src/rendering/paragraph.dart | 11 ++ .../src/rendering/performance_overlay.dart | 9 ++ .../flutter/lib/src/rendering/proxy_box.dart | 93 +++++++++++++ .../lib/src/rendering/rotated_box.dart | 8 ++ .../flutter/lib/src/rendering/semantics.dart | 20 +++ .../lib/src/rendering/shifted_box.dart | 34 +++++ packages/flutter/lib/src/rendering/stack.dart | 17 +++ packages/flutter/lib/src/rendering/view.dart | 11 ++ .../flutter/lib/src/rendering/viewport.dart | 20 +++ .../flutter/lib/src/scheduler/scheduler.dart | 1 + .../flutter/lib/src/services/assertions.dart | 3 + .../lib/src/services/asset_bundle.dart | 9 ++ .../flutter/lib/src/services/binding.dart | 2 + .../flutter/lib/src/services/image_cache.dart | 3 + .../lib/src/services/image_resource.dart | 4 + packages/flutter/lib/src/widgets/app.dart | 8 ++ .../flutter/lib/src/widgets/asset_vendor.dart | 11 ++ .../flutter/lib/src/widgets/auto_layout.dart | 3 + packages/flutter/lib/src/widgets/basic.dart | 128 ++++++++++++++++++ packages/flutter/lib/src/widgets/binding.dart | 15 ++ .../lib/src/widgets/checked_mode_banner.dart | 5 + .../flutter/lib/src/widgets/child_view.dart | 3 + .../flutter/lib/src/widgets/dismissable.dart | 4 + .../flutter/lib/src/widgets/drag_target.dart | 14 ++ .../flutter/lib/src/widgets/editable.dart | 15 ++ packages/flutter/lib/src/widgets/focus.dart | 6 + .../flutter/lib/src/widgets/framework.dart | 104 ++++++++++++++ .../lib/src/widgets/gesture_detector.dart | 9 ++ .../flutter/lib/src/widgets/gridpaper.dart | 4 + packages/flutter/lib/src/widgets/heroes.dart | 10 ++ .../lib/src/widgets/implicit_animations.dart | 18 +++ .../flutter/lib/src/widgets/locale_query.dart | 2 + .../flutter/lib/src/widgets/media_query.dart | 5 + packages/flutter/lib/src/widgets/mimic.dart | 3 + .../lib/src/widgets/mixed_viewport.dart | 20 +++ .../lib/src/widgets/modal_barrier.dart | 2 + .../flutter/lib/src/widgets/navigator.dart | 6 + .../src/widgets/notification_listener.dart | 1 + packages/flutter/lib/src/widgets/overlay.dart | 10 ++ .../flutter/lib/src/widgets/page_storage.dart | 8 ++ .../lib/src/widgets/pageable_list.dart | 30 ++++ packages/flutter/lib/src/widgets/pages.dart | 9 ++ .../lib/src/widgets/performance_overlay.dart | 2 + .../flutter/lib/src/widgets/placeholder.dart | 2 + .../src/widgets/raw_keyboard_listener.dart | 6 + packages/flutter/lib/src/widgets/routes.dart | 32 +++++ .../lib/src/widgets/scroll_behavior.dart | 19 +++ .../flutter/lib/src/widgets/scrollable.dart | 18 +++ .../lib/src/widgets/scrollable_grid.dart | 18 +++ .../lib/src/widgets/scrollable_list.dart | 31 +++++ .../lib/src/widgets/semantics_debugger.dart | 16 +++ .../lib/src/widgets/status_transitions.dart | 5 + packages/flutter/lib/src/widgets/title.dart | 2 + .../flutter/lib/src/widgets/transitions.dart | 14 ++ .../lib/src/widgets/unique_widget.dart | 1 + .../lib/src/widgets/virtual_viewport.dart | 19 +++ .../flutter/test/gestures/arena_test.dart | 4 + .../test/gestures/double_tap_test.dart | 4 + packages/flutter/test/gestures/tap_test.dart | 3 + .../test/painting/paint_image_test.dart | 5 + .../flutter/test/rendering/block_test.dart | 1 + .../flutter/test/rendering/image_test.dart | 15 ++ .../test/rendering/intrinsic_width_test.dart | 7 + .../test/rendering/mutations_test.dart | 7 + .../test/rendering/rendering_tester.dart | 6 + .../test/widget/asset_vendor_test.dart | 13 ++ .../flutter/test/widget/build_scope_test.dart | 10 ++ .../custom_multi_child_layout_test.dart | 7 + .../widget/custom_one_child_layout_test.dart | 5 + .../test/widget/custom_paint_test.dart | 2 + .../flutter/test/widget/dismissable_test.dart | 3 + .../test/widget/duplicate_key_test.dart | 9 ++ packages/flutter/test/widget/focus_test.dart | 1 + .../flutter/test/widget/init_state_test.dart | 3 + packages/flutter/test/widget/input_test.dart | 4 + .../test/widget/modal_barrier_test.dart | 2 + .../flutter/test/widget/navigator_test.dart | 4 + .../widget/page_forward_transitions_test.dart | 8 ++ .../test/widget/page_transitions_test.dart | 1 + .../widget/remember_scroll_position_test.dart | 1 + .../widget/render_object_widget_test.dart | 3 + .../test/widget/reparent_state_test.dart | 2 + packages/flutter/test/widget/routes_test.dart | 8 ++ .../flutter/test/widget/set_state_3_test.dart | 6 + .../flutter/test/widget/set_state_test.dart | 6 + .../test/widget/stateful_components_test.dart | 6 + .../flutter/test/widget/syncing_test.dart | 4 + .../flutter/test/widget/test_matchers.dart | 16 +++ .../flutter/test/widget/test_semantics.dart | 3 + .../flutter/test/widget/test_widgets.dart | 3 + packages/flutter_driver/lib/src/error.dart | 2 + packages/flutter_driver/lib/src/find.dart | 11 ++ packages/flutter_driver/lib/src/gesture.dart | 6 + packages/flutter_driver/lib/src/health.dart | 3 + .../flutter_driver/lib/src/matcher_util.dart | 6 + packages/flutter_driver/lib/src/message.dart | 2 + .../flutter_markdown/lib/src/markdown.dart | 2 + .../lib/src/markdown_raw.dart | 11 ++ packages/flutter_sprites/lib/src/action.dart | 13 ++ .../lib/src/action_spline.dart | 1 + .../flutter_sprites/lib/src/constraint.dart | 4 + .../flutter_sprites/lib/src/effect_line.dart | 2 + packages/flutter_sprites/lib/src/label.dart | 1 + packages/flutter_sprites/lib/src/layer.dart | 2 + packages/flutter_sprites/lib/src/node3d.dart | 1 + .../lib/src/node_with_size.dart | 1 + .../lib/src/particle_system.dart | 2 + .../lib/src/physics_debug.dart | 9 ++ .../lib/src/physics_group.dart | 10 ++ .../lib/src/physics_joint.dart | 9 ++ .../lib/src/physics_shape.dart | 7 + .../lib/src/physics_world.dart | 8 ++ packages/flutter_sprites/lib/src/sprite.dart | 1 + .../flutter_sprites/lib/src/sprite_box.dart | 5 + .../lib/src/sprite_widget.dart | 2 + .../lib/src/textured_line.dart | 1 + .../lib/src/virtual_joystick.dart | 2 + .../flutter_test/lib/src/widget_tester.dart | 2 + packages/flutter_tools/.analysis_options | 2 +- .../flutter_tools/lib/src/android/adb.dart | 3 + .../lib/src/android/android_device.dart | 21 +++ .../lib/src/android/android_sdk.dart | 3 + .../lib/src/android/android_workflow.dart | 6 + .../lib/src/application_package.dart | 2 + .../flutter_tools/lib/src/base/logger.dart | 17 +++ packages/flutter_tools/lib/src/base/os.dart | 4 + .../flutter_tools/lib/src/base/process.dart | 6 +- .../lib/src/commands/analyze.dart | 7 + .../flutter_tools/lib/src/commands/apk.dart | 3 + .../flutter_tools/lib/src/commands/build.dart | 4 + .../lib/src/commands/create.dart | 6 + .../lib/src/commands/daemon.dart | 12 ++ .../lib/src/commands/devices.dart | 7 + .../lib/src/commands/doctor.dart | 5 + .../flutter_tools/lib/src/commands/drive.dart | 5 + .../lib/src/commands/install.dart | 4 + .../lib/src/commands/listen.dart | 7 + .../flutter_tools/lib/src/commands/logs.dart | 6 + .../lib/src/commands/refresh.dart | 5 + .../flutter_tools/lib/src/commands/run.dart | 6 + .../lib/src/commands/run_mojo.dart | 6 + .../flutter_tools/lib/src/commands/stop.dart | 4 + .../flutter_tools/lib/src/commands/test.dart | 5 + .../flutter_tools/lib/src/commands/trace.dart | 7 + .../lib/src/commands/update_packages.dart | 5 + .../lib/src/commands/upgrade.dart | 3 + packages/flutter_tools/lib/src/device.dart | 10 ++ packages/flutter_tools/lib/src/doctor.dart | 3 + .../flutter_tools/lib/src/ios/devices.dart | 20 +++ .../lib/src/ios/ios_workflow.dart | 6 + .../flutter_tools/lib/src/ios/simulators.dart | 19 +++ .../lib/src/runner/flutter_command.dart | 2 + .../src/runner/flutter_command_runner.dart | 3 + .../lib/src/test/flutter_platform.dart | 1 + packages/flutter_tools/lib/src/zip.dart | 2 + packages/flutter_tools/test/src/context.dart | 7 + packages/flutter_tools/test/src/mocks.dart | 15 ++ .../newton/lib/src/clamped_simulation.dart | 5 + .../newton/lib/src/friction_simulation.dart | 4 + .../newton/lib/src/gravity_simulation.dart | 2 + .../newton/lib/src/scroll_simulation.dart | 1 + packages/newton/lib/src/simulation_group.dart | 2 + .../newton/lib/src/spring_simulation.dart | 13 ++ packages/newton/lib/src/tolerance.dart | 1 + 322 files changed, 2544 insertions(+), 9 deletions(-) diff --git a/dev/manual_tests/card_collection.dart b/dev/manual_tests/card_collection.dart index 602d3bf63a..1ea8b098b5 100644 --- a/dev/manual_tests/card_collection.dart +++ b/dev/manual_tests/card_collection.dart @@ -17,6 +17,7 @@ class CardModel { } class CardCollection extends StatefulWidget { + @override CardCollectionState createState() => new CardCollectionState(); } @@ -72,6 +73,7 @@ class CardCollectionState extends State { _initVariableSizedCardModels(); } + @override void initState() { super.initState(); _initCardModels(); @@ -403,6 +405,7 @@ class CardCollectionState extends State { .createShader(bounds); } + @override Widget build(BuildContext context) { Widget cardCollection; if (_fixedSizeCards) { diff --git a/dev/manual_tests/drag_and_drop.dart b/dev/manual_tests/drag_and_drop.dart index 832a01df4b..f7c5a761bf 100644 --- a/dev/manual_tests/drag_and_drop.dart +++ b/dev/manual_tests/drag_and_drop.dart @@ -7,6 +7,7 @@ import 'dart:math' as math; import 'package:flutter/material.dart'; class ExampleDragTarget extends StatefulWidget { + @override ExampleDragTargetState createState() => new ExampleDragTargetState(); } @@ -19,6 +20,7 @@ class ExampleDragTargetState extends State { }); } + @override Widget build(BuildContext context) { return new DragTarget( onAccept: _handleAccept, @@ -41,14 +43,19 @@ class ExampleDragTargetState extends State { class Dot extends StatefulWidget { Dot({ Key key, this.color, this.size, this.child, this.tappable: false }) : super(key: key); + final Color color; final double size; final Widget child; final bool tappable; + + @override DotState createState() => new DotState(); } class DotState extends State { int taps = 0; + + @override Widget build(BuildContext context) { return new GestureDetector( onTap: config.tappable ? () { setState(() { taps += 1; }); } : null, @@ -84,6 +91,7 @@ class ExampleDragSource extends StatelessWidget { static const double kHeavyMultiplier = 1.5; static const double kFingerSize = 50.0; + @override Widget build(BuildContext context) { double size = kDotSize; if (heavy) @@ -146,6 +154,7 @@ class DashOutlineCirclePainter extends CustomPainter { static const double segmentArc = deltaTheta / 2.0; // radians static const double startOffset = 1.0; // radians + @override void paint(Canvas canvas, Size size) { final double radius = size.shortestSide / 2.0; final Paint paint = new Paint() @@ -159,6 +168,7 @@ class DashOutlineCirclePainter extends CustomPainter { canvas.drawPath(path, paint); } + @override bool shouldRepaint(DashOutlineCirclePainter oldPainter) => false; } @@ -172,6 +182,7 @@ class MovableBall extends StatelessWidget { static final GlobalKey kBallKey = new GlobalKey(); static const double kBallSize = 50.0; + @override Widget build(BuildContext context) { Widget ball = new DefaultTextStyle( style: Theme.of(context).textTheme.body1.copyWith( @@ -213,14 +224,18 @@ class MovableBall extends StatelessWidget { } class DragAndDropApp extends StatefulWidget { + @override DragAndDropAppState createState() => new DragAndDropAppState(); } class DragAndDropAppState extends State { int position = 1; + void moveBall(int newPosition) { setState(() { position = newPosition; }); } + + @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( diff --git a/dev/manual_tests/mozart.dart b/dev/manual_tests/mozart.dart index 83840cf456..2521c38911 100644 --- a/dev/manual_tests/mozart.dart +++ b/dev/manual_tests/mozart.dart @@ -46,6 +46,7 @@ class WindowDecoration extends StatelessWidget { final GestureTapCallback onTap; final GesturePanUpdateCallback onPanUpdate; + @override Widget build(BuildContext context) { double top, right, bottom, left, width, height; @@ -93,6 +94,7 @@ class Window extends StatefulWidget { final ChildViewConnection child; final ValueChanged onClose; + @override _WindowState createState() => new _WindowState(); } @@ -119,6 +121,7 @@ class _WindowState extends State { config.onClose(config.child); } + @override Widget build(BuildContext context) { return new Positioned( left: _offset.dx, @@ -167,6 +170,7 @@ class LauncherItem extends StatelessWidget { final Widget child; final ValueChanged onLaunch; + @override Widget build(BuildContext context) { return new RaisedButton( onPressed: () { onLaunch(new ChildViewConnection(url: url)); }, @@ -180,6 +184,7 @@ class Launcher extends StatelessWidget { final List items; + @override Widget build(BuildContext context) { return new Row( mainAxisAlignment: MainAxisAlignment.center, @@ -189,6 +194,7 @@ class Launcher extends StatelessWidget { } class WindowManager extends StatefulWidget { + @override _WindowManagerState createState() => new _WindowManagerState(); } @@ -207,6 +213,7 @@ class _WindowManagerState extends State { }); } + @override Widget build(BuildContext context) { return new Material( child: new Stack( diff --git a/dev/manual_tests/overlay_geometry.dart b/dev/manual_tests/overlay_geometry.dart index 566f8e55aa..bcde679ab7 100644 --- a/dev/manual_tests/overlay_geometry.dart +++ b/dev/manual_tests/overlay_geometry.dart @@ -27,6 +27,7 @@ class _MarkerPainter extends CustomPainter { final double size; final MarkerType type; + @override void paint(Canvas canvas, _) { Paint paint = new Paint()..color = const Color(0x8000FF00); double r = size / 2.0; @@ -46,6 +47,7 @@ class _MarkerPainter extends CustomPainter { } } + @override bool shouldRepaint(_MarkerPainter oldPainter) { return oldPainter.size != size || oldPainter.type != type; @@ -64,6 +66,7 @@ class Marker extends StatelessWidget { final double size; final MarkerType type; + @override Widget build(BuildContext context) { return new Positioned( left: position.x - size / 2.0, @@ -83,6 +86,7 @@ class Marker extends StatelessWidget { } class OverlayGeometryApp extends StatefulWidget { + @override OverlayGeometryAppState createState() => new OverlayGeometryAppState(); } @@ -96,6 +100,7 @@ class OverlayGeometryAppState extends State { double markersScrollOffset; ScrollListener scrollListener; + @override void initState() { super.initState(); List cardHeights = [ @@ -151,6 +156,7 @@ class OverlayGeometryAppState extends State { ); } + @override Widget build(BuildContext context) { List layers = [ new Scaffold( diff --git a/dev/manual_tests/pageable_list.dart b/dev/manual_tests/pageable_list.dart index d13eaca5a1..fe2992d29c 100644 --- a/dev/manual_tests/pageable_list.dart +++ b/dev/manual_tests/pageable_list.dart @@ -14,10 +14,12 @@ class CardModel { } class PageableListApp extends StatefulWidget { + @override PageableListAppState createState() => new PageableListAppState(); } class PageableListAppState extends State { + @override void initState() { super.initState(); List cardSizes = [ @@ -122,6 +124,7 @@ class PageableListAppState extends State { ); } + @override Widget build(BuildContext context) { return new IconTheme( data: const IconThemeData(color: Colors.white), diff --git a/dev/manual_tests/raw_keyboard.dart b/dev/manual_tests/raw_keyboard.dart index 7960ac2975..df57d6dd52 100644 --- a/dev/manual_tests/raw_keyboard.dart +++ b/dev/manual_tests/raw_keyboard.dart @@ -33,6 +33,7 @@ void main() { class RawKeyboardDemo extends StatefulWidget { RawKeyboardDemo({ GlobalKey key }) : super(key: key); + @override _HardwareKeyDemoState createState() => new _HardwareKeyDemoState(); } @@ -45,6 +46,7 @@ class _HardwareKeyDemoState extends State { }); } + @override Widget build(BuildContext context) { bool focused = Focus.at(context); Widget child; diff --git a/examples/layers/rendering/autolayout.dart b/examples/layers/rendering/autolayout.dart index de29293c2a..2380cd347e 100644 --- a/examples/layers/rendering/autolayout.dart +++ b/examples/layers/rendering/autolayout.dart @@ -14,6 +14,7 @@ class _MyAutoLayoutDelegate extends AutoLayoutDelegate { AutoLayoutRect p3 = new AutoLayoutRect(); AutoLayoutRect p4 = new AutoLayoutRect(); + @override List getConstraints(AutoLayoutRect parent) { return [ // Sum of widths of each box must be equal to that of the container @@ -44,6 +45,7 @@ class _MyAutoLayoutDelegate extends AutoLayoutDelegate { ]; } + @override bool shouldUpdateConstraints(AutoLayoutDelegate oldDelegate) => true; } diff --git a/examples/layers/rendering/src/sector_layout.dart b/examples/layers/rendering/src/sector_layout.dart index d8b69f4768..069888c18f 100644 --- a/examples/layers/rendering/src/sector_layout.dart +++ b/examples/layers/rendering/src/sector_layout.dart @@ -36,9 +36,13 @@ class SectorConstraints extends Constraints { return deltaTheta.clamp(minDeltaTheta, maxDeltaTheta); } + @override bool get isTight => minDeltaTheta >= maxDeltaTheta && minDeltaTheta >= maxDeltaTheta; + @override bool get isNormalized => minDeltaRadius <= maxDeltaRadius && minDeltaTheta <= maxDeltaTheta; + + @override bool get debugAssertIsNormalized { assert(isNormalized); return isNormalized; @@ -69,6 +73,7 @@ class SectorParentData extends ParentData { abstract class RenderSector extends RenderObject { + @override void setupParentData(RenderObject child) { if (child.parentData is! SectorParentData) child.parentData = new SectorParentData(); @@ -76,13 +81,17 @@ abstract class RenderSector extends RenderObject { // RenderSectors always use SectorParentData subclasses, as they need to be // able to read their position information for painting and hit testing. + @override SectorParentData get parentData => super.parentData; SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double radius) { return new SectorDimensions.withConstraints(constraints); } + @override SectorConstraints get constraints => super.constraints; + + @override void debugAssertDoesMeetConstraints() { assert(constraints != null); assert(deltaRadius != null); @@ -94,11 +103,15 @@ abstract class RenderSector extends RenderObject { assert(constraints.minDeltaTheta <= deltaTheta); assert(deltaTheta <= math.max(constraints.minDeltaTheta, constraints.maxDeltaTheta)); } + + @override void performResize() { // default behavior for subclasses that have sizedByParent = true deltaRadius = constraints.constrainDeltaRadius(0.0); deltaTheta = constraints.constrainDeltaTheta(0.0); } + + @override void performLayout() { // descendants have to either override performLayout() to set both // the dimensions and lay out children, or, set sizedByParent to @@ -106,7 +119,10 @@ abstract class RenderSector extends RenderObject { assert(sizedByParent); } + @override Rect get paintBounds => new Rect.fromLTWH(0.0, 0.0, 2.0 * deltaRadius, 2.0 * deltaRadius); + + @override Rect get semanticBounds => new Rect.fromLTWH(-deltaRadius, -deltaRadius, 2.0 * deltaRadius, 2.0 * deltaRadius); bool hitTest(HitTestResult result, { double radius, double theta }) { @@ -137,6 +153,7 @@ abstract class RenderDecoratedSector extends RenderSector { } // offset must point to the center of the circle + @override void paint(PaintingContext context, Offset offset) { assert(deltaRadius != null); assert(deltaTheta != null); @@ -167,6 +184,7 @@ class SectorChildListParentData extends SectorParentData with ContainerParentDat class RenderSectorWithChildren extends RenderDecoratedSector with ContainerRenderObjectMixin { RenderSectorWithChildren(BoxDecoration decoration) : super(decoration); + @override void hitTestChildren(HitTestResult result, { double radius, double theta }) { RenderSector child = lastChild; while (child != null) { @@ -177,6 +195,7 @@ class RenderSectorWithChildren extends RenderDecoratedSector with ContainerRende } } + @override void visitChildren(RenderObjectVisitor visitor) { RenderSector child = lastChild; while (child != null) { @@ -217,12 +236,14 @@ class RenderSectorRing extends RenderSectorWithChildren { } } + @override void setupParentData(RenderObject child) { // TODO(ianh): avoid code duplication if (child.parentData is! SectorChildListParentData) child.parentData = new SectorChildListParentData(); } + @override SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double radius) { double outerDeltaRadius = constraints.constrainDeltaRadius(desiredDeltaRadius); double innerDeltaRadius = outerDeltaRadius - padding * 2.0; @@ -251,6 +272,7 @@ class RenderSectorRing extends RenderSectorWithChildren { deltaTheta: innerTheta); } + @override void performLayout() { assert(this.parentData is SectorParentData); deltaRadius = constraints.constrainDeltaRadius(desiredDeltaRadius); @@ -284,6 +306,7 @@ class RenderSectorRing extends RenderSectorWithChildren { // offset must point to the center of our circle // each sector then knows how to paint itself at its location + @override void paint(PaintingContext context, Offset offset) { // TODO(ianh): avoid code duplication super.paint(context, offset); @@ -327,12 +350,14 @@ class RenderSectorSlice extends RenderSectorWithChildren { } } + @override void setupParentData(RenderObject child) { // TODO(ianh): avoid code duplication if (child.parentData is! SectorChildListParentData) child.parentData = new SectorChildListParentData(); } + @override SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double radius) { assert(this.parentData is SectorParentData); double paddingTheta = math.atan(padding / this.parentData.radius); @@ -359,6 +384,7 @@ class RenderSectorSlice extends RenderSectorWithChildren { deltaTheta: outerDeltaTheta); } + @override void performLayout() { assert(this.parentData is SectorParentData); deltaTheta = constraints.constrainDeltaTheta(desiredDeltaTheta); @@ -389,6 +415,7 @@ class RenderSectorSlice extends RenderSectorWithChildren { // offset must point to the center of our circle // each sector then knows how to paint itself at its location + @override void paint(PaintingContext context, Offset offset) { // TODO(ianh): avoid code duplication super.paint(context, offset); @@ -417,29 +444,34 @@ class RenderBoxToRenderSectorAdapter extends RenderBox with RenderObjectWithChil markNeedsLayout(); } + @override void setupParentData(RenderObject child) { if (child.parentData is! SectorParentData) child.parentData = new SectorParentData(); } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { if (child == null) return super.getMinIntrinsicWidth(constraints); return getIntrinsicDimensions(constraints).width; } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { if (child == null) return super.getMaxIntrinsicWidth(constraints); return getIntrinsicDimensions(constraints).width; } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { if (child == null) return super.getMinIntrinsicHeight(constraints); return getIntrinsicDimensions(constraints).height; } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { if (child == null) return super.getMaxIntrinsicHeight(constraints); @@ -456,6 +488,7 @@ class RenderBoxToRenderSectorAdapter extends RenderBox with RenderObjectWithChil return constraints.constrain(new Size(dimension, dimension)); } + @override void performLayout() { if (child == null) { size = constraints.constrain(Size.zero); @@ -472,6 +505,7 @@ class RenderBoxToRenderSectorAdapter extends RenderBox with RenderObjectWithChil } } + @override void paint(PaintingContext context, Offset offset) { super.paint(context, offset); if (child != null) { @@ -481,6 +515,7 @@ class RenderBoxToRenderSectorAdapter extends RenderBox with RenderObjectWithChil } } + @override bool hitTest(HitTestResult result, { Point position }) { if (child == null) return false; @@ -516,15 +551,18 @@ class RenderSolidColor extends RenderDecoratedSector { double desiredDeltaTheta; final Color backgroundColor; + @override SectorDimensions getIntrinsicDimensions(SectorConstraints constraints, double radius) { return new SectorDimensions.withConstraints(constraints, deltaTheta: desiredDeltaTheta); } + @override void performLayout() { deltaRadius = constraints.constrainDeltaRadius(desiredDeltaRadius); deltaTheta = constraints.constrainDeltaTheta(desiredDeltaTheta); } + @override void handleEvent(PointerEvent event, HitTestEntry entry) { if (event is PointerDownEvent) { decoration = new BoxDecoration(backgroundColor: const Color(0xFFFF0000)); diff --git a/examples/layers/rendering/src/solid_color_box.dart b/examples/layers/rendering/src/solid_color_box.dart index d4dbcf098e..77dce23b8c 100644 --- a/examples/layers/rendering/src/solid_color_box.dart +++ b/examples/layers/rendering/src/solid_color_box.dart @@ -13,34 +13,40 @@ class RenderSolidColorBox extends RenderDecoratedBox { : backgroundColor = backgroundColor, super(decoration: new BoxDecoration(backgroundColor: backgroundColor)); + @override double getMinIntrinsicWidth(BoxConstraints constraints) { return constraints.constrainHeight( this.desiredSize == Size.infinite ? 0.0 : desiredSize.width ); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { return constraints.constrainWidth( this.desiredSize == Size.infinite ? 0.0 : desiredSize.width ); } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { return constraints.constrainHeight( this.desiredSize == Size.infinite ? 0.0 : desiredSize.height ); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { return constraints.constrainHeight( this.desiredSize == Size.infinite ? 0.0 : desiredSize.height ); } + @override void performLayout() { size = constraints.constrain(desiredSize); } + @override void handleEvent(PointerEvent event, BoxHitTestEntry entry) { if (event is PointerDownEvent) { decoration = new BoxDecoration(backgroundColor: const Color(0xFFFF0000)); diff --git a/examples/layers/rendering/touch_input.dart b/examples/layers/rendering/touch_input.dart index 05a50fcabb..c566949f9e 100644 --- a/examples/layers/rendering/touch_input.dart +++ b/examples/layers/rendering/touch_input.dart @@ -45,20 +45,24 @@ class RenderDots extends RenderBox { /// Indicates that the size of this render object depends only on the /// layout constraints provided by the parent. + @override bool get sizedByParent => true; /// By selecting the biggest value permitted by the incomming constraints /// during layout, this function makes this render object as large as /// possible (i.e., fills the entire screen). + @override void performResize() { size = constraints.biggest; } /// Makes this render object hittable so that it receives pointer events. + @override bool hitTestSelf(Point position) => true; /// Processes pointer events by mutating state and invalidating its previous /// painting commands. + @override void handleEvent(PointerEvent event, BoxHitTestEntry entry) { if (event is PointerDownEvent) { Color color = _kColors[event.pointer.remainder(_kColors.length)]; @@ -78,6 +82,7 @@ class RenderDots extends RenderBox { } /// Issues new painting commands. + @override void paint(PaintingContext context, Offset offset) { final Canvas canvas = context.canvas; // The "size" property indicates the size of that this render box was diff --git a/examples/layers/services/media_service.dart b/examples/layers/services/media_service.dart index 1bd51cec40..2bb0e4a7f1 100644 --- a/examples/layers/services/media_service.dart +++ b/examples/layers/services/media_service.dart @@ -74,6 +74,7 @@ class PianoApp extends StatelessWidget { } } + @override Widget build(BuildContext context) { List children = []; for (PianoKey key in keys) { diff --git a/examples/layers/widgets/autolayout.dart b/examples/layers/widgets/autolayout.dart index 3b4d02865a..11bd26726f 100644 --- a/examples/layers/widgets/autolayout.dart +++ b/examples/layers/widgets/autolayout.dart @@ -13,6 +13,7 @@ class _MyAutoLayoutDelegate extends AutoLayoutDelegate { AutoLayoutRect p3 = new AutoLayoutRect(); AutoLayoutRect p4 = new AutoLayoutRect(); + @override List getConstraints(AutoLayoutRect parent) { return [ // Sum of widths of each box must be equal to that of the container @@ -43,16 +44,19 @@ class _MyAutoLayoutDelegate extends AutoLayoutDelegate { ]; } + @override bool shouldUpdateConstraints(_MyAutoLayoutDelegate oldDelegate) => true; } class ColoredBoxes extends StatefulWidget { + @override _ColoredBoxesState createState() => new _ColoredBoxesState(); } class _ColoredBoxesState extends State { final _MyAutoLayoutDelegate delegate = new _MyAutoLayoutDelegate(); + @override Widget build(BuildContext context) { return new AutoLayout( delegate: delegate, diff --git a/examples/layers/widgets/custom_render_box.dart b/examples/layers/widgets/custom_render_box.dart index a938388484..f5ace579b3 100644 --- a/examples/layers/widgets/custom_render_box.dart +++ b/examples/layers/widgets/custom_render_box.dart @@ -9,10 +9,12 @@ class RenderDots extends RenderConstrainedBox { RenderDots() : super(additionalConstraints: const BoxConstraints.expand()); // Makes this render box hittable so that we'll get pointer events. + @override bool hitTestSelf(Point position) => true; final Map _dots = {}; + @override void handleEvent(PointerEvent event, BoxHitTestEntry entry) { if (event is PointerDownEvent || event is PointerMoveEvent) { _dots[event.pointer] = event.position; @@ -23,6 +25,7 @@ class RenderDots extends RenderConstrainedBox { } } + @override void paint(PaintingContext context, Offset offset) { final Canvas canvas = context.canvas; canvas.drawRect(offset & size, new Paint()..color = new Color(0xFF0000FF)); @@ -37,6 +40,8 @@ class RenderDots extends RenderConstrainedBox { class Dots extends SingleChildRenderObjectWidget { Dots({ Key key, Widget child }) : super(key: key, child: child); + + @override RenderDots createRenderObject(BuildContext context) => new RenderDots(); } diff --git a/examples/layers/widgets/gestures.dart b/examples/layers/widgets/gestures.dart index 7fa104265a..d44415d631 100644 --- a/examples/layers/widgets/gestures.dart +++ b/examples/layers/widgets/gestures.dart @@ -25,6 +25,7 @@ class _GesturePainter extends CustomPainter { final bool doubleTapEnabled; final bool longPressEnabled; + @override void paint(Canvas canvas, Size size) { Point center = (size.center(Point.origin).toOffset() * zoom + offset).toPoint(); double radius = size.width / 2.0 * zoom; @@ -42,6 +43,7 @@ class _GesturePainter extends CustomPainter { canvas.drawCircle(center, radius, paint); } + @override bool shouldRepaint(_GesturePainter oldPainter) { return oldPainter.zoom != zoom || oldPainter.offset != offset @@ -55,6 +57,7 @@ class _GesturePainter extends CustomPainter { } class GestureDemo extends StatefulWidget { + @override _GestureDemoState createState() => new _GestureDemoState(); } @@ -134,6 +137,7 @@ class _GestureDemoState extends State { }); } + @override Widget build(BuildContext context) { return new Stack( children: [ diff --git a/examples/layers/widgets/media_query.dart b/examples/layers/widgets/media_query.dart index 20120d0e78..5c50264ff1 100644 --- a/examples/layers/widgets/media_query.dart +++ b/examples/layers/widgets/media_query.dart @@ -9,6 +9,7 @@ class AdaptedListItem extends StatelessWidget { final String name; + @override Widget build(BuildContext context) { return new Row( children: [ @@ -31,6 +32,7 @@ class AdaptedGridItem extends StatelessWidget { final String name; + @override Widget build(BuildContext context) { return new Card( child: new Column( @@ -70,6 +72,7 @@ class AdaptiveContainer extends StatelessWidget { final List names; + @override Widget build(BuildContext context) { if (MediaQuery.of(context).size.width < _kGridViewBreakpoint) { return new ScrollableList( diff --git a/examples/layers/widgets/sectors.dart b/examples/layers/widgets/sectors.dart index e0580439af..33ac58437e 100644 --- a/examples/layers/widgets/sectors.dart +++ b/examples/layers/widgets/sectors.dart @@ -17,6 +17,7 @@ RenderBox initCircle() { } class SectorApp extends StatefulWidget { + @override SectorAppState createState() => new SectorAppState(); } @@ -147,6 +148,7 @@ class SectorAppState extends State { ); } + @override Widget build(BuildContext context) { return new MaterialApp( theme: new ThemeData.light(), diff --git a/examples/layers/widgets/spinning_mixed.dart b/examples/layers/widgets/spinning_mixed.dart index 2998e2c07e..9b4e5cf8aa 100644 --- a/examples/layers/widgets/spinning_mixed.dart +++ b/examples/layers/widgets/spinning_mixed.dart @@ -18,7 +18,10 @@ void addFlexChildSolidColor(RenderFlex parent, Color backgroundColor, { int flex // Solid colour, Widget version class Rectangle extends StatelessWidget { Rectangle(this.color, { Key key }) : super(key: key); + final Color color; + + @override Widget build(BuildContext context) { return new Flexible( child: new Container( diff --git a/examples/layers/widgets/spinning_square.dart b/examples/layers/widgets/spinning_square.dart index bf754c6a2c..8af6deb2ab 100644 --- a/examples/layers/widgets/spinning_square.dart +++ b/examples/layers/widgets/spinning_square.dart @@ -5,12 +5,14 @@ import 'package:flutter/widgets.dart'; class SpinningSquare extends StatefulWidget { + @override _SpinningSquareState createState() => new _SpinningSquareState(); } class _SpinningSquareState extends State { AnimationController _animation; + @override void initState() { super.initState(); // We use 3600 milliseconds instead of 1800 milliseconds because 0.0 -> 1.0 @@ -21,6 +23,7 @@ class _SpinningSquareState extends State { )..repeat(); } + @override Widget build(BuildContext context) { return new RotationTransition( turns: _animation, diff --git a/examples/layers/widgets/styled_text.dart b/examples/layers/widgets/styled_text.dart index 505e11b454..673126fff7 100644 --- a/examples/layers/widgets/styled_text.dart +++ b/examples/layers/widgets/styled_text.dart @@ -58,6 +58,7 @@ Widget toStyledText(String name, String text) { Widget toPlainText(String name, String text) => new Text(name + ":" + text); class SpeakerSeparator extends StatelessWidget { + @override Widget build(BuildContext context) { return new Container( constraints: const BoxConstraints.expand(height: 0.0), @@ -72,10 +73,12 @@ class SpeakerSeparator extends StatelessWidget { } class StyledTextDemo extends StatefulWidget { + @override _StyledTextDemoState createState() => new _StyledTextDemoState(); } class _StyledTextDemoState extends State { + @override void initState() { super.initState(); _toText = toStyledText; @@ -89,6 +92,7 @@ class _StyledTextDemoState extends State { }); } + @override Widget build(BuildContext context) { List lines = _kNameLines .map((List nameAndText) => Function.apply(_toText, nameAndText)) diff --git a/examples/material_gallery/lib/demo/buttons_demo.dart b/examples/material_gallery/lib/demo/buttons_demo.dart index b1e2ecf690..4ae9249d40 100644 --- a/examples/material_gallery/lib/demo/buttons_demo.dart +++ b/examples/material_gallery/lib/demo/buttons_demo.dart @@ -45,6 +45,7 @@ class _ButtonDemo { // to recover this demo's selected tab. To enable it to compare restored // _ButtonDemo objects with new ones, define hashCode and operator== . + @override bool operator==(Object other) { if (other.runtimeType != runtimeType) return false; @@ -52,16 +53,19 @@ class _ButtonDemo { return typedOther.title == title && typedOther.text == text; } + @override int get hashCode => hashValues(title.hashCode, text.hashCode); } class ButtonsDemo extends StatefulWidget { + @override _ButtonsDemoState createState() => new _ButtonsDemoState(); } class _ButtonsDemoState extends State { List<_ButtonDemo> demos; + @override void initState() { super.initState(); demos = <_ButtonDemo>[ @@ -192,6 +196,7 @@ class _ButtonsDemoState extends State { ); } + @override Widget build(BuildContext context) { return new TabBarSelection<_ButtonDemo>( values: demos, diff --git a/examples/material_gallery/lib/demo/cards_demo.dart b/examples/material_gallery/lib/demo/cards_demo.dart index f337a04902..b379e0fd2b 100644 --- a/examples/material_gallery/lib/demo/cards_demo.dart +++ b/examples/material_gallery/lib/demo/cards_demo.dart @@ -43,6 +43,7 @@ class TravelDestinationItem extends StatelessWidget { final TravelDestination destination; + @override Widget build(BuildContext context) { ThemeData theme = Theme.of(context); TextStyle titleStyle = theme.textTheme.headline.copyWith(color: Colors.white); @@ -115,6 +116,7 @@ class TravelDestinationItem extends StatelessWidget { } class CardsDemo extends StatelessWidget { + @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( diff --git a/examples/material_gallery/lib/demo/chip_demo.dart b/examples/material_gallery/lib/demo/chip_demo.dart index 2c1f331282..124cfa157f 100644 --- a/examples/material_gallery/lib/demo/chip_demo.dart +++ b/examples/material_gallery/lib/demo/chip_demo.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; class ChipDemo extends StatefulWidget { + @override _ChipDemoState createState() => new _ChipDemoState(); } @@ -17,6 +18,7 @@ class _ChipDemoState extends State { }); } + @override Widget build(BuildContext context) { List chips = [ new Chip( diff --git a/examples/material_gallery/lib/demo/colors_demo.dart b/examples/material_gallery/lib/demo/colors_demo.dart index 744f930541..601e49ec07 100644 --- a/examples/material_gallery/lib/demo/colors_demo.dart +++ b/examples/material_gallery/lib/demo/colors_demo.dart @@ -54,6 +54,7 @@ class ColorItem extends StatelessWidget { String colorString() => "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; + @override Widget build(BuildContext context) { return new Container( height: kColorItemHeight, @@ -80,6 +81,7 @@ class ColorSwatchTabView extends StatelessWidget { final TextStyle blackTextStyle = Typography.black.body1; final TextStyle whiteTextStyle = Typography.white.body1; + @override Widget build(BuildContext context) { List colorItems = swatch.colors.keys.map((int index) { return new DefaultTextStyle( @@ -107,6 +109,7 @@ class ColorSwatchTabView extends StatelessWidget { } class ColorsDemo extends StatelessWidget { + @override Widget build(BuildContext context) { return new TabBarSelection( values: colorSwatches, diff --git a/examples/material_gallery/lib/demo/date_picker_demo.dart b/examples/material_gallery/lib/demo/date_picker_demo.dart index a97716d474..a482af421a 100644 --- a/examples/material_gallery/lib/demo/date_picker_demo.dart +++ b/examples/material_gallery/lib/demo/date_picker_demo.dart @@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; class DatePickerDemo extends StatefulWidget { + @override _DatePickerDemoState createState() => new _DatePickerDemoState(); } @@ -28,6 +29,7 @@ class _DatePickerDemoState extends State { } } + @override Widget build(BuildContext context) { return new Scaffold( diff --git a/examples/material_gallery/lib/demo/dialog_demo.dart b/examples/material_gallery/lib/demo/dialog_demo.dart index caa6c08ebf..ad067117c5 100644 --- a/examples/material_gallery/lib/demo/dialog_demo.dart +++ b/examples/material_gallery/lib/demo/dialog_demo.dart @@ -28,6 +28,7 @@ class DialogDemoItem extends StatelessWidget { final String text; final VoidCallback onPressed; + @override Widget build(BuildContext context) { return new InkWell( onTap: onPressed, @@ -54,6 +55,7 @@ class DialogDemoItem extends StatelessWidget { } class DialogDemo extends StatefulWidget { + @override DialogDemoState createState() => new DialogDemoState(); } @@ -74,6 +76,7 @@ class DialogDemoState extends State { }); } + @override Widget build(BuildContext context) { final ThemeData theme = Theme.of(context); final TextStyle dialogTextStyle = theme.textTheme.subhead.copyWith(color: theme.textTheme.caption.color); diff --git a/examples/material_gallery/lib/demo/drop_down_demo.dart b/examples/material_gallery/lib/demo/drop_down_demo.dart index 91e017979d..fe5a7c6695 100644 --- a/examples/material_gallery/lib/demo/drop_down_demo.dart +++ b/examples/material_gallery/lib/demo/drop_down_demo.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; class DropDownDemo extends StatefulWidget { + @override _DropDownDemoState createState() => new _DropDownDemoState(); } @@ -18,6 +19,7 @@ class _DropDownDemoState extends State { .toList(); } + @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar(title: new Text("Dropdown Button")), diff --git a/examples/material_gallery/lib/demo/fitness_demo.dart b/examples/material_gallery/lib/demo/fitness_demo.dart index 43539f6e8d..962ad5eff0 100644 --- a/examples/material_gallery/lib/demo/fitness_demo.dart +++ b/examples/material_gallery/lib/demo/fitness_demo.dart @@ -16,6 +16,7 @@ SpriteSheet _sprites; class FitnessDemo extends StatelessWidget { FitnessDemo({ Key key }) : super(key: key); + @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( @@ -28,6 +29,8 @@ class FitnessDemo extends StatelessWidget { class _FitnessDemoContents extends StatefulWidget { _FitnessDemoContents({ Key key }) : super(key: key); + + @override _FitnessDemoContentsState createState() => new _FitnessDemoContentsState(); } @@ -43,6 +46,7 @@ class _FitnessDemoContentsState extends State<_FitnessDemoContents> { _sprites = new SpriteSheet(_images['packages/flutter_gallery_assets/jumpingjack.png'], json); } + @override void initState() { super.initState(); @@ -73,6 +77,7 @@ class _FitnessDemoContentsState extends State<_FitnessDemoContents> { _WorkoutAnimationNode workoutAnimation; + @override Widget build(BuildContext context) { if (!assetsLoaded) return new Container(); @@ -248,6 +253,7 @@ class _WorkoutAnimationNode extends NodeWithSize { _jumpingJack.neutralPose(); } + @override void update(double dt) { if (workingOut) { int millis = new DateTime.now().millisecondsSinceEpoch - _startTimeMillis; @@ -273,6 +279,7 @@ class _ProgressCircle extends NodeWithSize { double value; + @override void paint(Canvas canvas) { applyTransformForPivot(canvas); @@ -513,10 +520,12 @@ class _JumpingJackPart extends Sprite { class _Fireworks extends StatefulWidget { _Fireworks({ Key key }) : super(key: key); + @override _FireworksState createState() => new _FireworksState(); } class _FireworksState extends State<_Fireworks> { + @override void initState() { super.initState(); fireworks = new _FireworksNode(); @@ -524,6 +533,7 @@ class _FireworksState extends State<_Fireworks> { _FireworksNode fireworks; + @override Widget build(BuildContext context) { return new SpriteWidget(fireworks); } @@ -533,6 +543,7 @@ class _FireworksNode extends NodeWithSize { _FireworksNode() : super(const Size(1024.0, 1024.0)); double _countDown = 0.0; + @override void update(double dt) { if (_countDown <= 0.0) { _addExplosion(); diff --git a/examples/material_gallery/lib/demo/flexible_space_demo.dart b/examples/material_gallery/lib/demo/flexible_space_demo.dart index ec7eab3793..6cb365399c 100644 --- a/examples/material_gallery/lib/demo/flexible_space_demo.dart +++ b/examples/material_gallery/lib/demo/flexible_space_demo.dart @@ -11,6 +11,7 @@ class _ContactCategory extends StatelessWidget { final IconData icon; final List children; + @override Widget build(BuildContext context) { return new Container( padding: const EdgeInsets.symmetric(vertical: 16.0), @@ -41,6 +42,7 @@ class _ContactItem extends StatelessWidget { final IconData icon; final List lines; + @override Widget build(BuildContext context) { List columnChildren = lines.sublist(0, lines.length - 1).map((String line) => new Text(line)).toList(); columnChildren.add(new Text(lines.last, style: Theme.of(context).textTheme.caption)); @@ -68,6 +70,7 @@ class _ContactItem extends StatelessWidget { } class FlexibleSpaceDemo extends StatefulWidget { + @override FlexibleSpaceDemoState createState() => new FlexibleSpaceDemoState(); } @@ -77,6 +80,7 @@ class FlexibleSpaceDemoState extends State { final Key scrollableKey = new UniqueKey(); AppBarBehavior _appBarBehavior = AppBarBehavior.scroll; + @override Widget build(BuildContext context) { return new Theme( data: new ThemeData( diff --git a/examples/material_gallery/lib/demo/full_screen_dialog_demo.dart b/examples/material_gallery/lib/demo/full_screen_dialog_demo.dart index a179ce971d..b00807d7ec 100644 --- a/examples/material_gallery/lib/demo/full_screen_dialog_demo.dart +++ b/examples/material_gallery/lib/demo/full_screen_dialog_demo.dart @@ -27,6 +27,7 @@ class DateTimeItem extends StatelessWidget { final TimeOfDay time; final ValueChanged onChanged; + @override Widget build(BuildContext context) { final ThemeData theme = Theme.of(context); @@ -93,6 +94,7 @@ class DateTimeItem extends StatelessWidget { } class FullScreenDialogDemo extends StatefulWidget { + @override FullScreenDialogDemoState createState() => new FullScreenDialogDemoState(); } @@ -137,6 +139,7 @@ class FullScreenDialogDemoState extends State { ); } + @override Widget build(BuildContext context) { final ThemeData theme = Theme.of(context); diff --git a/examples/material_gallery/lib/demo/grid_list_demo.dart b/examples/material_gallery/lib/demo/grid_list_demo.dart index e36cf787cd..bcc2fdf7e9 100644 --- a/examples/material_gallery/lib/demo/grid_list_demo.dart +++ b/examples/material_gallery/lib/demo/grid_list_demo.dart @@ -55,6 +55,7 @@ class GridDemoPhotoItem extends StatelessWidget { )); } + @override Widget build(BuildContext context) { final Widget image = new GestureDetector( onTap: () { showPhoto(context); }, @@ -104,9 +105,12 @@ class GridListDemoGridDelegate extends FixedColumnCountGridDelegate { assert(tileHeightFactor != null && tileHeightFactor > 0.0); } + @override final int columnCount; + final double tileHeightFactor; + @override GridSpecification getGridSpecification(BoxConstraints constraints, int childCount) { assert(constraints.maxWidth < double.INFINITY); assert(constraints.maxHeight < double.INFINITY); @@ -121,6 +125,7 @@ class GridListDemoGridDelegate extends FixedColumnCountGridDelegate { ); } + @override bool shouldRelayout(GridListDemoGridDelegate oldDelegate) { return columnCount != oldDelegate.columnCount || tileHeightFactor != oldDelegate.tileHeightFactor @@ -131,6 +136,7 @@ class GridListDemoGridDelegate extends FixedColumnCountGridDelegate { class GridListDemo extends StatefulWidget { GridListDemo({ Key key }) : super(key: key); + @override GridListDemoState createState() => new GridListDemoState(); } @@ -169,6 +175,7 @@ class GridListDemoState extends State { // When the ScrollableGrid first appears we want the last row to only be // partially visible, to help the user recognize that the grid is scrollable. // The GridListDemoGridDelegate's tileHeightFactor is used for this. + @override Widget build(BuildContext context) { final Orientation orientation = MediaQuery.of(context).orientation; return new Scaffold( diff --git a/examples/material_gallery/lib/demo/icons_demo.dart b/examples/material_gallery/lib/demo/icons_demo.dart index 051da2004e..b42ae7d6a5 100644 --- a/examples/material_gallery/lib/demo/icons_demo.dart +++ b/examples/material_gallery/lib/demo/icons_demo.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; class IconsDemo extends StatefulWidget { + @override IconsDemoState createState() => new IconsDemoState(); } @@ -61,6 +62,7 @@ class IconsDemoState extends State { ); } + @override Widget build(BuildContext context) { final ThemeData theme = Theme.of(context); final TextStyle textStyle = theme.textTheme.subhead.copyWith(color: theme.textTheme.caption.color); diff --git a/examples/material_gallery/lib/demo/leave_behind_demo.dart b/examples/material_gallery/lib/demo/leave_behind_demo.dart index 01a064f87f..26cbbd2313 100644 --- a/examples/material_gallery/lib/demo/leave_behind_demo.dart +++ b/examples/material_gallery/lib/demo/leave_behind_demo.dart @@ -28,6 +28,7 @@ class LeaveBehindItem { class LeaveBehindDemo extends StatefulWidget { LeaveBehindDemo({ Key key }) : super(key: key); + @override LeaveBehindDemoState createState() => new LeaveBehindDemoState(); } @@ -47,6 +48,7 @@ class LeaveBehindDemoState extends State { }); } + @override void initState() { super.initState(); initListItems(); @@ -122,6 +124,7 @@ class LeaveBehindDemoState extends State { ); } + @override Widget build(BuildContext context) { return new Scaffold( key: _scaffoldKey, diff --git a/examples/material_gallery/lib/demo/list_demo.dart b/examples/material_gallery/lib/demo/list_demo.dart index eec78f213b..daa92ff82d 100644 --- a/examples/material_gallery/lib/demo/list_demo.dart +++ b/examples/material_gallery/lib/demo/list_demo.dart @@ -13,6 +13,7 @@ enum ListDemoItemSize { class ListDemo extends StatefulWidget { ListDemo({ Key key }) : super(key: key); + @override ListDemoState createState() => new ListDemoState(); } @@ -153,6 +154,7 @@ class ListDemoState extends State { ); } + @override Widget build(BuildContext context) { final String layoutText = _dense ? " \u2013 Dense" : ""; String itemSizeText; diff --git a/examples/material_gallery/lib/demo/menu_demo.dart b/examples/material_gallery/lib/demo/menu_demo.dart index 24a4eb9e57..c357e36527 100644 --- a/examples/material_gallery/lib/demo/menu_demo.dart +++ b/examples/material_gallery/lib/demo/menu_demo.dart @@ -7,6 +7,7 @@ import 'package:flutter/material.dart'; class MenuDemo extends StatefulWidget { MenuDemo({ Key key }) : super(key: key); + @override MenuDemoState createState() => new MenuDemoState(); } @@ -24,6 +25,7 @@ class MenuDemoState extends State { final String _checkedValue4 = 'Four'; List _checkedValues; + @override void initState() { super.initState(); _simpleValue = _simpleValue2; @@ -53,6 +55,7 @@ class MenuDemoState extends State { bool isChecked(String value) => _checkedValues.contains(value); + @override Widget build(BuildContext context) { return new Scaffold( key: _scaffoldKey, diff --git a/examples/material_gallery/lib/demo/modal_bottom_sheet_demo.dart b/examples/material_gallery/lib/demo/modal_bottom_sheet_demo.dart index 295fe4b550..d347967c66 100644 --- a/examples/material_gallery/lib/demo/modal_bottom_sheet_demo.dart +++ b/examples/material_gallery/lib/demo/modal_bottom_sheet_demo.dart @@ -11,6 +11,7 @@ class ModalBottomSheetDemo extends StatelessWidget { textAlign: TextAlign.center ); + @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar(title: new Text("Modal Bottom Sheet")), diff --git a/examples/material_gallery/lib/demo/page_selector_demo.dart b/examples/material_gallery/lib/demo/page_selector_demo.dart index 3afe4794f5..d0d6747568 100644 --- a/examples/material_gallery/lib/demo/page_selector_demo.dart +++ b/examples/material_gallery/lib/demo/page_selector_demo.dart @@ -12,6 +12,7 @@ class PageSelectorDemo extends StatelessWidget { selection.value = selection.values[(selection.index + delta).clamp(0, selection.values.length - 1)]; } + @override Widget build(BuildContext notUsed) { // Can't find the TabBarSelection from this context. final List icons = [ Icons.event, diff --git a/examples/material_gallery/lib/demo/persistent_bottom_sheet_demo.dart b/examples/material_gallery/lib/demo/persistent_bottom_sheet_demo.dart index b003d5fa6e..5709593f8d 100644 --- a/examples/material_gallery/lib/demo/persistent_bottom_sheet_demo.dart +++ b/examples/material_gallery/lib/demo/persistent_bottom_sheet_demo.dart @@ -26,6 +26,7 @@ class PersistentBottomSheetDemo extends StatelessWidget { }); } + @override Widget build(BuildContext notUsed) { // Can't find the Scaffold from this context. return new Scaffold( appBar: new AppBar(title: new Text("Persistent Bottom Sheet")), diff --git a/examples/material_gallery/lib/demo/progress_indicator_demo.dart b/examples/material_gallery/lib/demo/progress_indicator_demo.dart index ef65d09800..4409615eb2 100644 --- a/examples/material_gallery/lib/demo/progress_indicator_demo.dart +++ b/examples/material_gallery/lib/demo/progress_indicator_demo.dart @@ -5,11 +5,13 @@ import 'package:flutter/material.dart'; class ProgressIndicatorDemo extends StatefulWidget { + @override _ProgressIndicatorDemoState createState() => new _ProgressIndicatorDemoState(); } class _ProgressIndicatorDemoState extends State { + @override void initState() { super.initState(); controller = new AnimationController( @@ -81,6 +83,7 @@ class _ProgressIndicatorDemoState extends State { ); } + @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar(title: new Text('Progress Indicators')), diff --git a/examples/material_gallery/lib/demo/scrolling_techniques_demo.dart b/examples/material_gallery/lib/demo/scrolling_techniques_demo.dart index d1c01e46fc..6c2cf91252 100644 --- a/examples/material_gallery/lib/demo/scrolling_techniques_demo.dart +++ b/examples/material_gallery/lib/demo/scrolling_techniques_demo.dart @@ -19,6 +19,7 @@ class _BarGraphic extends StatelessWidget { final String leftText; final String rightText; + @override Widget build(BuildContext context) { return new Container( height: height, @@ -85,6 +86,7 @@ class _TechniqueItem extends StatelessWidget { Navigator.push(context, new MaterialPageRoute(builder: builder)); } + @override Widget build(BuildContext context) { return new Card( child: new InkWell( @@ -111,6 +113,7 @@ const String _introText = "specified it is stacked on top of the ToolBar."; class ScrollingTechniquesDemo extends StatelessWidget { + @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar(title: new Text('Scrolling Techniques')), diff --git a/examples/material_gallery/lib/demo/slider_demo.dart b/examples/material_gallery/lib/demo/slider_demo.dart index 623e7940ed..0475476424 100644 --- a/examples/material_gallery/lib/demo/slider_demo.dart +++ b/examples/material_gallery/lib/demo/slider_demo.dart @@ -5,12 +5,14 @@ import 'package:flutter/material.dart'; class SliderDemo extends StatefulWidget { + @override _SliderDemoState createState() => new _SliderDemoState(); } class _SliderDemoState extends State { double _value = 25.0; + @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar(title: new Text("Sliders")), diff --git a/examples/material_gallery/lib/demo/snack_bar_demo.dart b/examples/material_gallery/lib/demo/snack_bar_demo.dart index d487c2a1fd..c5affd3907 100644 --- a/examples/material_gallery/lib/demo/snack_bar_demo.dart +++ b/examples/material_gallery/lib/demo/snack_bar_demo.dart @@ -56,6 +56,7 @@ class SnackBarDemo extends StatelessWidget { ); } + @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( diff --git a/examples/material_gallery/lib/demo/tabs_demo.dart b/examples/material_gallery/lib/demo/tabs_demo.dart index 3764670605..2292888b5e 100644 --- a/examples/material_gallery/lib/demo/tabs_demo.dart +++ b/examples/material_gallery/lib/demo/tabs_demo.dart @@ -23,6 +23,7 @@ class TabsDemo extends StatelessWidget { Icons.language: 'LANGUAGE', }; + @override Widget build(BuildContext context) { final Color iconColor = Theme.of(context).accentColor; return new TabBarSelection( diff --git a/examples/material_gallery/lib/demo/tabs_fab_demo.dart b/examples/material_gallery/lib/demo/tabs_fab_demo.dart index 723c4e9bcd..517e61d7bf 100644 --- a/examples/material_gallery/lib/demo/tabs_fab_demo.dart +++ b/examples/material_gallery/lib/demo/tabs_fab_demo.dart @@ -26,6 +26,7 @@ const String _explanatoryText = "by its key."; class TabsFabDemo extends StatefulWidget { + @override _TabsFabDemoState createState() => new _TabsFabDemoState(); } @@ -41,6 +42,7 @@ class _TabsFabDemoState extends State { ]; _Page selectedPage; + @override void initState() { super.initState(); selectedPage = pages[0]; @@ -88,6 +90,7 @@ class _TabsFabDemoState extends State { ); } + @override Widget build(BuildContext context) { return new TabBarSelection<_Page>( values: pages, diff --git a/examples/material_gallery/lib/demo/text_field_demo.dart b/examples/material_gallery/lib/demo/text_field_demo.dart index 417a4aa243..a5bf2d992d 100644 --- a/examples/material_gallery/lib/demo/text_field_demo.dart +++ b/examples/material_gallery/lib/demo/text_field_demo.dart @@ -7,6 +7,7 @@ import 'package:flutter/material.dart'; class TextFieldDemo extends StatefulWidget { TextFieldDemo({ Key key }) : super(key: key); + @override TextFieldDemoState createState() => new TextFieldDemoState(); } @@ -59,6 +60,7 @@ class TextFieldDemoState extends State { return null; } + @override Widget build(BuildContext context) { return new Scaffold( key: _scaffoldKey, diff --git a/examples/material_gallery/lib/demo/time_picker_demo.dart b/examples/material_gallery/lib/demo/time_picker_demo.dart index 99891d9bed..adf49832ff 100644 --- a/examples/material_gallery/lib/demo/time_picker_demo.dart +++ b/examples/material_gallery/lib/demo/time_picker_demo.dart @@ -7,6 +7,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; class TimePickerDemo extends StatefulWidget { + @override _TimePickerDemoState createState() => new _TimePickerDemoState(); } @@ -25,6 +26,7 @@ class _TimePickerDemoState extends State { } } + @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar(title: new Text("Time Picker")), diff --git a/examples/material_gallery/lib/demo/toggle_controls_demo.dart b/examples/material_gallery/lib/demo/toggle_controls_demo.dart index 56a87d44dc..2b3759b5f5 100644 --- a/examples/material_gallery/lib/demo/toggle_controls_demo.dart +++ b/examples/material_gallery/lib/demo/toggle_controls_demo.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; class ToggleControlsDemo extends StatefulWidget { + @override _ToggleControlsDemoState createState() => new _ToggleControlsDemoState(); } @@ -31,6 +32,7 @@ class _ToggleControlsDemoState extends State { }); } + @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar(title: new Text("Selection Controls")), diff --git a/examples/material_gallery/lib/demo/tooltip_demo.dart b/examples/material_gallery/lib/demo/tooltip_demo.dart index 085f0cb18c..2dfb457772 100644 --- a/examples/material_gallery/lib/demo/tooltip_demo.dart +++ b/examples/material_gallery/lib/demo/tooltip_demo.dart @@ -10,6 +10,7 @@ const String _introText = "apps accessible, like screen readers."; class TooltipDemo extends StatelessWidget { + @override Widget build(BuildContext context) { final ThemeData theme = Theme.of(context); return new Scaffold( diff --git a/examples/material_gallery/lib/demo/two_level_list_demo.dart b/examples/material_gallery/lib/demo/two_level_list_demo.dart index b0d141f8cc..7799592d85 100644 --- a/examples/material_gallery/lib/demo/two_level_list_demo.dart +++ b/examples/material_gallery/lib/demo/two_level_list_demo.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; class TwoLevelListDemo extends StatelessWidget { + @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar(title: new Text('Expand/Collapse List Control')), diff --git a/examples/material_gallery/lib/demo/typography_demo.dart b/examples/material_gallery/lib/demo/typography_demo.dart index f03bd4dd06..a1072f5037 100644 --- a/examples/material_gallery/lib/demo/typography_demo.dart +++ b/examples/material_gallery/lib/demo/typography_demo.dart @@ -16,6 +16,7 @@ class TextStyleItem extends StatelessWidget { final TextStyle style; final String text; + @override Widget build(BuildContext context) { final ThemeData theme = Theme.of(context); final TextStyle nameStyle = theme.textTheme.body1.copyWith(color: theme.textTheme.caption.color); @@ -38,6 +39,7 @@ class TextStyleItem extends StatelessWidget { } class TypographyDemo extends StatelessWidget { + @override Widget build(BuildContext context) { final TextTheme textTheme = Theme.of(context).textTheme; final List styleItems = [ diff --git a/examples/material_gallery/lib/demo/weather_demo.dart b/examples/material_gallery/lib/demo/weather_demo.dart index 4c91fbe7bc..e111d6805c 100644 --- a/examples/material_gallery/lib/demo/weather_demo.dart +++ b/examples/material_gallery/lib/demo/weather_demo.dart @@ -19,6 +19,8 @@ enum WeatherType { class WeatherDemo extends StatefulWidget { WeatherDemo({ Key key }) : super(key: key); + + @override _WeatherDemoState createState() => new _WeatherDemoState(); } @@ -42,6 +44,7 @@ class _WeatherDemoState extends State { _sprites = new SpriteSheet(_images['packages/flutter_gallery_assets/weathersprites.png'], json); } + @override void initState() { super.initState(); @@ -58,6 +61,7 @@ class _WeatherDemoState extends State { WeatherWorld weatherWorld; + @override Widget build(BuildContext context) { if (!assetsLoaded) { return new Scaffold( @@ -132,6 +136,7 @@ class WeatherButton extends StatelessWidget { final bool selected; final VoidCallback onPressed; + @override Widget build(BuildContext context) { Color color; if (selected) @@ -262,6 +267,7 @@ class WeatherWorld extends NodeWithSize { _snow.active = weatherType == WeatherType.snow; } + @override void spriteBoxPerformedLayout() { _sun.position = spriteBox.visibleArea.topLeft + const Offset(350.0, 180.0); } @@ -273,6 +279,7 @@ class GradientNode extends NodeWithSize { Color colorTop; Color colorBottom; + @override void paint(Canvas canvas) { applyTransformForPivot(canvas); @@ -426,6 +433,7 @@ class Ray extends Sprite { )); } + @override void update(double dt) { rotation += dt * _rotationSpeed; } diff --git a/examples/material_gallery/lib/gallery/app.dart b/examples/material_gallery/lib/gallery/app.dart index 642c0ba981..57a5d818de 100644 --- a/examples/material_gallery/lib/gallery/app.dart +++ b/examples/material_gallery/lib/gallery/app.dart @@ -11,6 +11,7 @@ class GalleryApp extends StatefulWidget { static GalleryAppState of(BuildContext context) => context.ancestorStateOfType(const TypeMatcher()); + @override GalleryAppState createState() => new GalleryAppState(); } @@ -23,6 +24,7 @@ class GalleryAppState extends State { }); } + @override Widget build(BuildContext context) { return new MaterialApp( title: 'Flutter Material Gallery', diff --git a/examples/material_gallery/lib/gallery/drawer.dart b/examples/material_gallery/lib/gallery/drawer.dart index 1509e854de..9e484a4c3a 100644 --- a/examples/material_gallery/lib/gallery/drawer.dart +++ b/examples/material_gallery/lib/gallery/drawer.dart @@ -21,6 +21,7 @@ class GalleryDrawer extends StatelessWidget { }); } + @override Widget build(BuildContext context) { return new Drawer( child: new Block( diff --git a/examples/material_gallery/lib/gallery/home.dart b/examples/material_gallery/lib/gallery/home.dart index af6c4807d1..3d4ddbf280 100644 --- a/examples/material_gallery/lib/gallery/home.dart +++ b/examples/material_gallery/lib/gallery/home.dart @@ -42,10 +42,12 @@ import '../demo/weather_demo.dart'; class GalleryHome extends StatefulWidget { GalleryHome({ Key key }) : super(key: key); + @override GalleryHomeState createState() => new GalleryHomeState(); } class GalleryHomeState extends State { + @override Widget build(BuildContext context) { return new Scaffold( appBarHeight: 128.0, diff --git a/examples/material_gallery/lib/gallery/section.dart b/examples/material_gallery/lib/gallery/section.dart index 2670c2d271..fa9f95dd3c 100644 --- a/examples/material_gallery/lib/gallery/section.dart +++ b/examples/material_gallery/lib/gallery/section.dart @@ -61,6 +61,7 @@ class GallerySection extends StatelessWidget { )); } + @override Widget build (BuildContext context) { final ThemeData theme = new ThemeData( brightness: Theme.of(context).brightness, diff --git a/examples/stocks/lib/main.dart b/examples/stocks/lib/main.dart index 663f63f27c..ec828c5174 100644 --- a/examples/stocks/lib/main.dart +++ b/examples/stocks/lib/main.dart @@ -24,6 +24,7 @@ import 'stock_symbol_viewer.dart'; import 'stock_types.dart'; class StocksApp extends StatefulWidget { + @override StocksAppState createState() => new StocksAppState(); } @@ -45,6 +46,7 @@ class StocksAppState extends State { showSemanticsDebugger: false ); + @override void initState() { super.initState(); new StockDataFetcher((StockData data) { @@ -99,6 +101,7 @@ class StocksAppState extends State { return StockStrings.instance; } + @override Widget build(BuildContext context) { assert(() { debugPaintSizeEnabled = _configuration.debugShowSizes; diff --git a/examples/stocks/lib/stock_arrow.dart b/examples/stocks/lib/stock_arrow.dart index 84ce41a351..cbc91f08c5 100644 --- a/examples/stocks/lib/stock_arrow.dart +++ b/examples/stocks/lib/stock_arrow.dart @@ -12,6 +12,7 @@ class StockArrowPainter extends CustomPainter { final Color color; final double percentChange; + @override void paint(Canvas canvas, Size size) { Paint paint = new Paint()..color = color; paint.strokeWidth = 1.0; @@ -44,6 +45,7 @@ class StockArrowPainter extends CustomPainter { canvas.drawCircle(new Point(centerX, centerY), r, paint); } + @override bool shouldRepaint(StockArrowPainter oldPainter) { return oldPainter.color != color || oldPainter.percentChange != percentChange; @@ -67,6 +69,7 @@ class StockArrow extends StatelessWidget { return Colors.red[_colorIndexForPercentChange(percentChange)]; } + @override Widget build(BuildContext context) { return new Container( width: 40.0, diff --git a/examples/stocks/lib/stock_home.dart b/examples/stocks/lib/stock_home.dart index 093fc9e1cf..e40cb4a4eb 100644 --- a/examples/stocks/lib/stock_home.dart +++ b/examples/stocks/lib/stock_home.dart @@ -19,6 +19,7 @@ enum _StockMenuItem { autorefresh, refresh, speedUp, speedDown } enum StockHomeTab { market, portfolio } class _NotImplementedDialog extends StatelessWidget { + @override Widget build(BuildContext context) { return new Dialog( title: new Text('Not Implemented'), @@ -58,6 +59,7 @@ class StockHome extends StatefulWidget { final StockConfiguration configuration; final ValueChanged updater; + @override StockHomeState createState() => new StockHomeState(); } @@ -336,6 +338,7 @@ class StockHomeState extends State { ); } + @override Widget build(BuildContext context) { return new TabBarSelection( values: [StockHomeTab.market, StockHomeTab.portfolio], @@ -356,6 +359,7 @@ class StockHomeState extends State { } class _CreateCompanySheet extends StatefulWidget { + @override _CreateCompanySheetState createState() => new _CreateCompanySheetState(); } @@ -368,6 +372,7 @@ class _CreateCompanySheetState extends State<_CreateCompanySheet> { }); } + @override Widget build(BuildContext context) { // TODO(ianh): Fill this out. return new Column( diff --git a/examples/stocks/lib/stock_list.dart b/examples/stocks/lib/stock_list.dart index 8ffadaab24..ba41051a8e 100644 --- a/examples/stocks/lib/stock_list.dart +++ b/examples/stocks/lib/stock_list.dart @@ -16,6 +16,7 @@ class StockList extends StatelessWidget { final StockRowActionCallback onShow; final StockRowActionCallback onAction; + @override Widget build(BuildContext context) { return new ScrollableList( key: const ValueKey('stock-list'), diff --git a/examples/stocks/lib/stock_row.dart b/examples/stocks/lib/stock_row.dart index 1e79ea398c..bc69a22d6c 100644 --- a/examples/stocks/lib/stock_row.dart +++ b/examples/stocks/lib/stock_row.dart @@ -11,9 +11,12 @@ enum StockRowPartKind { arrow } class StockRowPartKey extends Key { const StockRowPartKey(this.keySalt, this.stock, this.part) : super.constructor(); + final Object keySalt; final Stock stock; final StockRowPartKind part; + + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -24,7 +27,11 @@ class StockRowPartKey extends Key { && stock == typedOther.stock && part == typedOther.part; } + + @override int get hashCode => hashValues(keySalt, stock, part); + + @override String toString() => '[$runtimeType ${keySalt.toString().split(".")[1]}:${stock.symbol}:${part.toString().split(".")[1]}]'; } @@ -54,6 +61,7 @@ class StockRow extends StatelessWidget { return callback == null ? null : () => callback(stock, _arrowKey); } + @override Widget build(BuildContext context) { final String lastSale = "\$${stock.lastSale.toStringAsFixed(2)}"; String changeInPrice = "${stock.percentChange.toStringAsFixed(2)}%"; diff --git a/examples/stocks/lib/stock_settings.dart b/examples/stocks/lib/stock_settings.dart index 23f33c7373..f21f0fd3de 100644 --- a/examples/stocks/lib/stock_settings.dart +++ b/examples/stocks/lib/stock_settings.dart @@ -12,6 +12,7 @@ class StockSettings extends StatefulWidget { final StockConfiguration configuration; final ValueChanged updater; + @override StockSettingsState createState() => new StockSettingsState(); } @@ -245,6 +246,7 @@ class StockSettingsState extends State { ); } + @override Widget build(BuildContext context) { return new Scaffold( appBar: buildAppBar(context), diff --git a/examples/stocks/lib/stock_symbol_viewer.dart b/examples/stocks/lib/stock_symbol_viewer.dart index adff7a9817..5f2ff07bd0 100644 --- a/examples/stocks/lib/stock_symbol_viewer.dart +++ b/examples/stocks/lib/stock_symbol_viewer.dart @@ -13,6 +13,7 @@ class StockSymbolView extends StatelessWidget { final Stock stock; + @override Widget build(BuildContext context) { String lastSale = "\$${stock.lastSale.toStringAsFixed(2)}"; String changeInPrice = "${stock.percentChange.toStringAsFixed(2)}%"; @@ -71,6 +72,7 @@ class StockSymbolPage extends StatelessWidget { final Stock stock; + @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( @@ -93,6 +95,7 @@ class StockSymbolBottomSheet extends StatelessWidget { final Stock stock; + @override Widget build(BuildContext context) { return new Container( padding: new EdgeInsets.all(10.0), diff --git a/packages/cassowary/lib/expression.dart b/packages/cassowary/lib/expression.dart index 03e23daf13..98c264c3af 100644 --- a/packages/cassowary/lib/expression.dart +++ b/packages/cassowary/lib/expression.dart @@ -153,6 +153,7 @@ class Expression extends _EquationMember { return null; } + @override _EquationMember operator *(_EquationMember m) { _Pair args = _findMulitplierAndMultiplicand(m); @@ -166,6 +167,7 @@ class Expression extends _EquationMember { return args.first._applyMultiplicand(args.second); } + @override _EquationMember operator /(_EquationMember m) { if (!m.isConstant) { throw new ParserException( @@ -176,6 +178,7 @@ class Expression extends _EquationMember { return this._applyMultiplicand(1.0 / m.value); } + @override String toString() { StringBuffer buffer = new StringBuffer(); diff --git a/packages/cassowary/lib/param.dart b/packages/cassowary/lib/param.dart index cd912f4c18..add1a6d0fe 100644 --- a/packages/cassowary/lib/param.dart +++ b/packages/cassowary/lib/param.dart @@ -18,12 +18,15 @@ class Param extends _EquationMember { dynamic context; + @override bool get isConstant => false; + @override double get value => variable.value; String get name => variable.name; void set name(String name) { variable.name = name; } + @override Expression asExpression() => new Expression([new Term(variable, 1.0)], 0.0); } diff --git a/packages/cassowary/lib/parser_exception.dart b/packages/cassowary/lib/parser_exception.dart index 979533caa4..e0316360b5 100644 --- a/packages/cassowary/lib/parser_exception.dart +++ b/packages/cassowary/lib/parser_exception.dart @@ -9,6 +9,7 @@ class ParserException implements Exception { List<_EquationMember> members; ParserException(this.message, this.members); + @override String toString() { if (message == null) return "Error while parsing constraint or expression"; return "Error: '$message' while trying to parse constraint or expression"; diff --git a/packages/cassowary/lib/row.dart b/packages/cassowary/lib/row.dart index d9806e93a1..513fb9d7bb 100644 --- a/packages/cassowary/lib/row.dart +++ b/packages/cassowary/lib/row.dart @@ -65,6 +65,7 @@ class _Row { insertRow(row, coefficient); } + @override String toString() { StringBuffer buffer = new StringBuffer(); diff --git a/packages/cassowary/lib/solver.dart b/packages/cassowary/lib/solver.dart index 4688e9fb15..de348be121 100644 --- a/packages/cassowary/lib/solver.dart +++ b/packages/cassowary/lib/solver.dart @@ -588,6 +588,7 @@ class Solver { return entering ?? new _Symbol(_SymbolType.invalid, 0); } + @override String toString() { StringBuffer buffer = new StringBuffer(); String separator = "\n~~~~~~~~~"; diff --git a/packages/cassowary/lib/symbol.dart b/packages/cassowary/lib/symbol.dart index ab0531adb7..5b9d8286b0 100644 --- a/packages/cassowary/lib/symbol.dart +++ b/packages/cassowary/lib/symbol.dart @@ -12,6 +12,7 @@ class _Symbol { _Symbol(this.type, this.tick); + @override String toString() { String typeString = 'unknown'; switch (type) { diff --git a/packages/cassowary/lib/term.dart b/packages/cassowary/lib/term.dart index a402020f81..9845e1fd66 100644 --- a/packages/cassowary/lib/term.dart +++ b/packages/cassowary/lib/term.dart @@ -10,13 +10,17 @@ class Term extends _EquationMember { final Variable variable; final double coefficient; + @override bool get isConstant => false; + @override double get value => coefficient * variable.value; + @override Expression asExpression() => new Expression([new Term(this.variable, this.coefficient)], 0.0); + @override String toString() { StringBuffer buffer = new StringBuffer(); diff --git a/packages/flutter/lib/src/animation/animation.dart b/packages/flutter/lib/src/animation/animation.dart index cc2deb1b4d..dfd48a7f04 100644 --- a/packages/flutter/lib/src/animation/animation.dart +++ b/packages/flutter/lib/src/animation/animation.dart @@ -62,6 +62,7 @@ abstract class Animation { /// Whether this animation is stopped at the end. bool get isCompleted => status == AnimationStatus.completed; + @override String toString() { return '$runtimeType(${toStringDetails()})'; } diff --git a/packages/flutter/lib/src/animation/animation_controller.dart b/packages/flutter/lib/src/animation/animation_controller.dart index 4df50f1d70..5451216e13 100644 --- a/packages/flutter/lib/src/animation/animation_controller.dart +++ b/packages/flutter/lib/src/animation/animation_controller.dart @@ -99,6 +99,7 @@ class AnimationController extends Animation /// Setting this value also stops the controller if it is currently /// running; if this happens, it also notifies all the status /// listeners. + @override double get value => _value; double _value; void set value(double newValue) { @@ -114,6 +115,7 @@ class AnimationController extends Animation _AnimationDirection _direction; + @override AnimationStatus get status { if (!isAnimating && value == upperBound) return AnimationStatus.completed; @@ -202,6 +204,7 @@ class AnimationController extends Animation } /// Stops running this animation. + @override void dispose() { stop(); } @@ -224,6 +227,7 @@ class AnimationController extends Animation _checkStatusChanged(); } + @override String toStringDetails() { String paused = isAnimating ? '' : '; paused'; String label = debugLabel == null ? '' : '; for $debugLabel'; @@ -245,6 +249,7 @@ class _InterpolationSimulation extends Simulation { final double _end; final Curve _curve; + @override double x(double timeInSeconds) { assert(timeInSeconds >= 0.0); double t = (timeInSeconds / _durationInSeconds).clamp(0.0, 1.0); @@ -256,8 +261,10 @@ class _InterpolationSimulation extends Simulation { return _begin + (_end - _begin) * _curve.transform(t); } + @override double dx(double timeInSeconds) => 1.0; + @override bool isDone(double timeInSeconds) => timeInSeconds > _durationInSeconds; } @@ -272,13 +279,16 @@ class _RepeatingSimulation extends Simulation { final double _periodInSeconds; + @override double x(double timeInSeconds) { assert(timeInSeconds >= 0.0); final double t = (timeInSeconds / _periodInSeconds) % 1.0; return ui.lerpDouble(min, max, t); } + @override double dx(double timeInSeconds) => 1.0; + @override bool isDone(double timeInSeconds) => false; } diff --git a/packages/flutter/lib/src/animation/animations.dart b/packages/flutter/lib/src/animation/animations.dart index 5cd46c2bc2..8daca9aef7 100644 --- a/packages/flutter/lib/src/animation/animations.dart +++ b/packages/flutter/lib/src/animation/animations.dart @@ -11,11 +11,22 @@ import 'listener_helpers.dart'; class _AlwaysCompleteAnimation extends Animation { const _AlwaysCompleteAnimation(); + @override void addListener(VoidCallback listener) { } + + @override void removeListener(VoidCallback listener) { } + + @override void addStatusListener(AnimationStatusListener listener) { } + + @override void removeStatusListener(AnimationStatusListener listener) { } + + @override AnimationStatus get status => AnimationStatus.completed; + + @override double get value => 1.0; } @@ -29,11 +40,22 @@ const Animation kAlwaysCompleteAnimation = const _AlwaysCompleteAnimatio class _AlwaysDismissedAnimation extends Animation { const _AlwaysDismissedAnimation(); + @override void addListener(VoidCallback listener) { } + + @override void removeListener(VoidCallback listener) { } + + @override void addStatusListener(AnimationStatusListener listener) { } + + @override void removeStatusListener(AnimationStatusListener listener) { } + + @override AnimationStatus get status => AnimationStatus.dismissed; + + @override double get value => 0.0; } @@ -48,12 +70,22 @@ const Animation kAlwaysDismissedAnimation = const _AlwaysDismissedAnimat class AlwaysStoppedAnimation extends Animation { const AlwaysStoppedAnimation(this.value); + @override final T value; + @override void addListener(VoidCallback listener) { } + + @override void removeListener(VoidCallback listener) { } + + @override void addStatusListener(AnimationStatusListener listener) { } + + @override void removeStatusListener(AnimationStatusListener listener) { } + + @override AnimationStatus get status => AnimationStatus.forward; } @@ -123,6 +155,7 @@ class ProxyAnimation extends Animation } } + @override void didStartListening() { if (_parent != null) { _parent.addListener(notifyListeners); @@ -130,6 +163,7 @@ class ProxyAnimation extends Animation } } + @override void didStopListening() { if (_parent != null) { _parent.removeListener(notifyListeners); @@ -137,7 +171,10 @@ class ProxyAnimation extends Animation } } + @override AnimationStatus get status => _parent != null ? _parent.status : _status; + + @override double get value => _parent != null ? _parent.value : _value; } @@ -155,19 +192,24 @@ class ReverseAnimation extends Animation /// The animation whose value and direction this animation is reversing. final Animation parent; + @override void addListener(VoidCallback listener) { didRegisterListener(); parent.addListener(listener); } + + @override void removeListener(VoidCallback listener) { parent.removeListener(listener); didUnregisterListener(); } + @override void didStartListening() { parent.addStatusListener(_statusChangeHandler); } + @override void didStopListening() { parent.removeStatusListener(_statusChangeHandler); } @@ -176,7 +218,10 @@ class ReverseAnimation extends Animation notifyStatusListeners(_reverseStatus(status)); } + @override AnimationStatus get status => _reverseStatus(parent.status); + + @override double get value => 1.0 - parent.value; AnimationStatus _reverseStatus(AnimationStatus status) { @@ -206,6 +251,7 @@ class CurvedAnimation extends Animation with AnimationWithParentMixin parent; /// The curve to use in the forward direction. @@ -238,6 +284,7 @@ class CurvedAnimation extends Animation with AnimationWithParentMixin assert(_lastStatus != null); } + @override AnimationStatus get status => _currentTrain.status; double _lastValue; @@ -342,10 +390,12 @@ class TrainHoppingAnimation extends Animation onSwitchedTrain(); } + @override double get value => _currentTrain.value; /// Frees all the resources used by this performance. /// After this is called, this object is no longer usable. + @override void dispose() { assert(_currentTrain != null); _currentTrain.removeStatusListener(_statusChangeHandler); diff --git a/packages/flutter/lib/src/animation/curves.dart b/packages/flutter/lib/src/animation/curves.dart index 5deafa1900..07d4772784 100644 --- a/packages/flutter/lib/src/animation/curves.dart +++ b/packages/flutter/lib/src/animation/curves.dart @@ -31,13 +31,18 @@ abstract class Curve { /// The identity map over the unit interval. class Linear extends Curve { const Linear(); + + @override double transform(double t) => t; } /// A sawtooth curve that repeats a given number of times over the unit interval. class SawTooth extends Curve { const SawTooth(this.count); + final int count; + + @override double transform(double t) { t *= count; return t - t.truncateToDouble(); @@ -57,6 +62,7 @@ class Interval extends Curve { /// The curve to apply between [start] and [end]. final Curve curve; + @override double transform(double t) { assert(start >= 0.0); assert(start <= 1.0); @@ -79,6 +85,7 @@ class Cubic extends Curve { final double c; final double d; + @override double transform(double t) { double start = 0.0; double end = 1.0; @@ -112,13 +119,18 @@ double _bounce(double t) { /// A curve that is the reversed inversion of its given curve. class FlippedCurve extends Curve { FlippedCurve(this.curve); + final Curve curve; + + @override double transform(double t) => 1.0 - curve.transform(1.0 - t); } /// An oscillating curve that grows in magnitude. class BounceInCurve extends Curve { const BounceInCurve(); + + @override double transform(double t) { return 1.0 - _bounce(1.0 - t); } @@ -127,6 +139,8 @@ class BounceInCurve extends Curve { /// An oscillating curve that shrink in magnitude. class BounceOutCurve extends Curve { const BounceOutCurve(); + + @override double transform(double t) { return _bounce(t); } @@ -135,6 +149,8 @@ class BounceOutCurve extends Curve { /// An oscillating curve that first grows and then shrink in magnitude. class BounceInOutCurve extends Curve { const BounceInOutCurve(); + + @override double transform(double t) { if (t < 0.5) return (1.0 - _bounce(1.0 - t)) * 0.5; @@ -146,7 +162,10 @@ class BounceInOutCurve extends Curve { /// An oscillating curve that grows in magnitude while overshooting its bounds. class ElasticInCurve extends Curve { const ElasticInCurve([this.period = 0.4]); + final double period; + + @override double transform(double t) { double s = period / 4.0; t = t - 1.0; @@ -157,7 +176,10 @@ class ElasticInCurve extends Curve { /// An oscillating curve that shrinks in magnitude while overshooting its bounds. class ElasticOutCurve extends Curve { const ElasticOutCurve([this.period = 0.4]); + final double period; + + @override double transform(double t) { double s = period / 4.0; return math.pow(2.0, -10 * t) * math.sin((t - s) * (math.PI * 2.0) / period) + 1.0; @@ -167,7 +189,10 @@ class ElasticOutCurve extends Curve { /// An oscillating curve that grows and then shrinks in magnitude while overshooting its bounds. class ElasticInOutCurve extends Curve { const ElasticInOutCurve([this.period = 0.4]); + final double period; + + @override double transform(double t) { double s = period / 4.0; t = 2.0 * t - 1.0; diff --git a/packages/flutter/lib/src/animation/forces.dart b/packages/flutter/lib/src/animation/forces.dart index 1b428e48b8..a3d6389f3c 100644 --- a/packages/flutter/lib/src/animation/forces.dart +++ b/packages/flutter/lib/src/animation/forces.dart @@ -37,6 +37,7 @@ class SpringForce extends Force { distance: 0.01 ); + @override Simulation release(double position, double velocity) { double target = velocity < 0.0 ? this.left - tolerance.distance : this.right + tolerance.distance; diff --git a/packages/flutter/lib/src/animation/listener_helpers.dart b/packages/flutter/lib/src/animation/listener_helpers.dart index fb761e5726..6f2d937427 100644 --- a/packages/flutter/lib/src/animation/listener_helpers.dart +++ b/packages/flutter/lib/src/animation/listener_helpers.dart @@ -14,18 +14,23 @@ abstract class _ListenerMixin { /// A mixin that helps listen to another object only when this object has registered listeners. abstract class AnimationLazyListenerMixin implements _ListenerMixin { int _listenerCounter = 0; + + @override void didRegisterListener() { assert(_listenerCounter >= 0); if (_listenerCounter == 0) didStartListening(); _listenerCounter += 1; } + + @override void didUnregisterListener() { assert(_listenerCounter >= 1); _listenerCounter -= 1; if (_listenerCounter == 0) didStopListening(); } + void didStartListening(); void didStopListening(); bool get isListening => _listenerCounter > 0; @@ -34,7 +39,10 @@ abstract class AnimationLazyListenerMixin implements _ListenerMixin { /// A mixin that replaces the didRegisterListener/didUnregisterListener contract /// with a dispose contract. abstract class AnimationEagerListenerMixin implements _ListenerMixin { + @override void didRegisterListener() { } + + @override void didUnregisterListener() { } /// Release any resources used by this object. diff --git a/packages/flutter/lib/src/animation/tween.dart b/packages/flutter/lib/src/animation/tween.dart index 65991caeaa..6dd9c39c0b 100644 --- a/packages/flutter/lib/src/animation/tween.dart +++ b/packages/flutter/lib/src/animation/tween.dart @@ -32,10 +32,12 @@ class _AnimatedEvaluation extends Animation with AnimationWithParentMixin< _AnimatedEvaluation(this.parent, this._evaluatable); /// The animation from which this value is derived. + @override final Animation parent; final Animatable _evaluatable; + @override T get value => _evaluatable.evaluate(parent); } @@ -45,6 +47,7 @@ class _ChainedEvaluation extends Animatable { final Animatable _parent; final Animatable _evaluatable; + @override T evaluate(Animation animation) { double value = _parent.evaluate(animation); return _evaluatable.evaluate(new AlwaysStoppedAnimation(value)); @@ -65,6 +68,7 @@ class Tween extends Animatable { T lerp(double t) => begin + (end - begin) * t; /// Returns the interpolated value for the current value of the given animation. + @override T evaluate(Animation animation) { if (end == null) return begin; @@ -76,6 +80,7 @@ class Tween extends Animatable { return lerp(t); } + @override String toString() => '$runtimeType($begin \u2192 $end)'; } @@ -86,6 +91,7 @@ class Tween extends Animatable { class ColorTween extends Tween { ColorTween({ Color begin, Color end }) : super(begin: begin, end: end); + @override Color lerp(double t) => Color.lerp(begin, end, t); } @@ -96,6 +102,7 @@ class ColorTween extends Tween { class SizeTween extends Tween { SizeTween({ Size begin, Size end }) : super(begin: begin, end: end); + @override Size lerp(double t) => Size.lerp(begin, end, t); } @@ -106,6 +113,7 @@ class SizeTween extends Tween { class RectTween extends Tween { RectTween({ Rect begin, Rect end }) : super(begin: begin, end: end); + @override Rect lerp(double t) => Rect.lerp(begin, end, t); } @@ -123,6 +131,7 @@ class IntTween extends Tween { // The inherited lerp() function doesn't work with ints because it multiplies // the begin and end types by a double, and int * double returns a double. + @override int lerp(double t) => (begin + (end - begin) * t).round(); } @@ -140,6 +149,7 @@ class StepTween extends Tween { // The inherited lerp() function doesn't work with ints because it multiplies // the begin and end types by a double, and int * double returns a double. + @override int lerp(double t) => (begin + (end - begin) * t).floor(); } @@ -154,6 +164,7 @@ class CurveTween extends Animatable { /// The curve to use when transforming the value of the animation. Curve curve; + @override double evaluate(Animation animation) { double t = animation.value; if (t == 0.0 || t == 1.0) { diff --git a/packages/flutter/lib/src/gestures/binding.dart b/packages/flutter/lib/src/gestures/binding.dart index d8324bd359..d71c40168c 100644 --- a/packages/flutter/lib/src/gestures/binding.dart +++ b/packages/flutter/lib/src/gestures/binding.dart @@ -21,6 +21,7 @@ typedef void GesturerExceptionHandler(PointerEvent event, HitTestTarget target, /// A binding for the gesture subsystem. abstract class Gesturer extends BindingBase implements HitTestTarget, HitTestable { + @override void initInstances() { super.initInstances(); _instance = this; @@ -76,6 +77,7 @@ abstract class Gesturer extends BindingBase implements HitTestTarget, HitTestabl } /// Determine which [HitTestTarget] objects are located at a given position. + @override void hitTest(HitTestResult result, Point position) { result.add(new HitTestEntry(this)); } @@ -113,6 +115,7 @@ abstract class Gesturer extends BindingBase implements HitTestTarget, HitTestabl } } + @override void handleEvent(PointerEvent event, HitTestEntry entry) { pointerRouter.route(event); if (event is PointerDownEvent) { diff --git a/packages/flutter/lib/src/gestures/drag.dart b/packages/flutter/lib/src/gestures/drag.dart index fdd02e482d..0a75630e19 100644 --- a/packages/flutter/lib/src/gestures/drag.dart +++ b/packages/flutter/lib/src/gestures/drag.dart @@ -46,6 +46,7 @@ abstract class _DragGestureRecognizer extends OneSequenceGest Map _velocityTrackers = new Map(); + @override void addPointer(PointerEvent event) { startTrackingPointer(event.pointer); _velocityTrackers[event.pointer] = new VelocityTracker(); @@ -56,6 +57,7 @@ abstract class _DragGestureRecognizer extends OneSequenceGest } } + @override void handleEvent(PointerEvent event) { assert(_state != DragState.ready); if (event is PointerMoveEvent) { @@ -75,6 +77,7 @@ abstract class _DragGestureRecognizer extends OneSequenceGest stopTrackingIfPointerNoLongerDown(event); } + @override void acceptGesture(int pointer) { if (_state != DragState.accepted) { _state = DragState.accepted; @@ -87,6 +90,7 @@ abstract class _DragGestureRecognizer extends OneSequenceGest } } + @override void didStopTrackingLastPointer(int pointer) { if (_state == DragState.possible) { resolve(GestureDisposition.rejected); @@ -108,6 +112,7 @@ abstract class _DragGestureRecognizer extends OneSequenceGest _velocityTrackers.clear(); } + @override void dispose() { _velocityTrackers.clear(); super.dispose(); @@ -115,27 +120,45 @@ abstract class _DragGestureRecognizer extends OneSequenceGest } class VerticalDragGestureRecognizer extends _DragGestureRecognizer { + @override double get _initialPendingDragDelta => 0.0; + + @override double _getDragDelta(PointerEvent event) => event.delta.dy; + + @override bool get _hasSufficientPendingDragDeltaToAccept => _pendingDragDelta.abs() > kTouchSlop; + @override String toStringShort() => 'vertical drag'; } class HorizontalDragGestureRecognizer extends _DragGestureRecognizer { + @override double get _initialPendingDragDelta => 0.0; + + @override double _getDragDelta(PointerEvent event) => event.delta.dx; + + @override bool get _hasSufficientPendingDragDeltaToAccept => _pendingDragDelta.abs() > kTouchSlop; + @override String toStringShort() => 'horizontal drag'; } class PanGestureRecognizer extends _DragGestureRecognizer { + @override Offset get _initialPendingDragDelta => Offset.zero; + + @override Offset _getDragDelta(PointerEvent event) => event.delta; + + @override bool get _hasSufficientPendingDragDeltaToAccept { return _pendingDragDelta.distance > kPanSlop; } + @override String toStringShort() => 'pan'; } diff --git a/packages/flutter/lib/src/gestures/events.dart b/packages/flutter/lib/src/gestures/events.dart index c9dd414495..e8737daa68 100644 --- a/packages/flutter/lib/src/gestures/events.dart +++ b/packages/flutter/lib/src/gestures/events.dart @@ -171,6 +171,7 @@ abstract class PointerEvent { /// the stylus is flat on that surface). final double tilt; + @override String toString() => '$runtimeType($position)'; String toStringFull() { diff --git a/packages/flutter/lib/src/gestures/hit_test.dart b/packages/flutter/lib/src/gestures/hit_test.dart index b0ae5f4da9..047b4b0818 100644 --- a/packages/flutter/lib/src/gestures/hit_test.dart +++ b/packages/flutter/lib/src/gestures/hit_test.dart @@ -25,6 +25,7 @@ class HitTestEntry { /// The [HitTestTarget] encountered during the hit test. final HitTestTarget target; + @override String toString() => '$target'; } @@ -49,5 +50,6 @@ class HitTestResult { path.add(entry); } + @override String toString() => 'HitTestResult(${path.isEmpty ? "" : path.join(", ")})'; } diff --git a/packages/flutter/lib/src/gestures/long_press.dart b/packages/flutter/lib/src/gestures/long_press.dart index 67be3eb5cd..fb746215f2 100644 --- a/packages/flutter/lib/src/gestures/long_press.dart +++ b/packages/flutter/lib/src/gestures/long_press.dart @@ -15,16 +15,19 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer { GestureLongPressCallback onLongPress; + @override void didExceedDeadline() { resolve(GestureDisposition.accepted); if (onLongPress != null) onLongPress(); } + @override void handlePrimaryPointer(PointerEvent event) { if (event is PointerUpEvent) resolve(GestureDisposition.rejected); } + @override String toStringShort() => 'long press'; } diff --git a/packages/flutter/lib/src/gestures/lsq_solver.dart b/packages/flutter/lib/src/gestures/lsq_solver.dart index 25c8e9b3f5..2fe6f05565 100644 --- a/packages/flutter/lib/src/gestures/lsq_solver.dart +++ b/packages/flutter/lib/src/gestures/lsq_solver.dart @@ -36,6 +36,7 @@ class _Vector { double norm() => math.sqrt(this * this); + @override String toString() { String result = ""; for (int i = 0; i < _length; i++) { @@ -68,6 +69,7 @@ class _Matrix { _columns ); + @override String toString() { String result = ""; for (int i = 0; i < _rows; i++) { diff --git a/packages/flutter/lib/src/gestures/multidrag.dart b/packages/flutter/lib/src/gestures/multidrag.dart index 3f291cd577..bc27756cb6 100644 --- a/packages/flutter/lib/src/gestures/multidrag.dart +++ b/packages/flutter/lib/src/gestures/multidrag.dart @@ -125,6 +125,7 @@ abstract class MultiDragGestureRecognizer exten Map _pointers = {}; + @override void addPointer(PointerDownEvent event) { assert(_pointers != null); assert(event.pointer != null); @@ -163,6 +164,7 @@ abstract class MultiDragGestureRecognizer exten } } + @override void acceptGesture(int pointer) { assert(_pointers != null); T state = _pointers[pointer]; @@ -186,6 +188,7 @@ abstract class MultiDragGestureRecognizer exten return drag; } + @override void rejectGesture(int pointer) { assert(_pointers != null); if (_pointers.containsKey(pointer)) { @@ -204,6 +207,7 @@ abstract class MultiDragGestureRecognizer exten _pointers.remove(pointer); } + @override void dispose() { for (int pointer in _pointers.keys) _removeState(pointer); @@ -217,22 +221,26 @@ abstract class MultiDragGestureRecognizer exten class _ImmediatePointerState extends MultiDragPointerState { _ImmediatePointerState(Point initialPosition) : super(initialPosition); + @override void checkForResolutionAfterMove() { assert(pendingDelta != null); if (pendingDelta.distance > kTouchSlop) resolve(GestureDisposition.accepted); } + @override void accepted(GestureMultiDragStartCallback starter) { starter(initialPosition); } } class ImmediateMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_ImmediatePointerState> { + @override _ImmediatePointerState createNewPointerState(PointerDownEvent event) { return new _ImmediatePointerState(event.position); } + @override String toStringShort() => 'multidrag'; } @@ -240,22 +248,26 @@ class ImmediateMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_Im class _HorizontalPointerState extends MultiDragPointerState { _HorizontalPointerState(Point initialPosition) : super(initialPosition); + @override void checkForResolutionAfterMove() { assert(pendingDelta != null); if (pendingDelta.dx.abs() > kTouchSlop) resolve(GestureDisposition.accepted); } + @override void accepted(GestureMultiDragStartCallback starter) { starter(initialPosition); } } class HorizontalMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_HorizontalPointerState> { + @override _HorizontalPointerState createNewPointerState(PointerDownEvent event) { return new _HorizontalPointerState(event.position); } + @override String toStringShort() => 'horizontal multidrag'; } @@ -263,22 +275,26 @@ class HorizontalMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_H class _VerticalPointerState extends MultiDragPointerState { _VerticalPointerState(Point initialPosition) : super(initialPosition); + @override void checkForResolutionAfterMove() { assert(pendingDelta != null); if (pendingDelta.dy.abs() > kTouchSlop) resolve(GestureDisposition.accepted); } + @override void accepted(GestureMultiDragStartCallback starter) { starter(initialPosition); } } class VerticalMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_VerticalPointerState> { + @override _VerticalPointerState createNewPointerState(PointerDownEvent event) { return new _VerticalPointerState(event.position); } + @override String toStringShort() => 'vertical multidrag'; } @@ -306,6 +322,7 @@ class _DelayedPointerState extends MultiDragPointerState { assert(_starter == null); } + @override void accepted(GestureMultiDragStartCallback starter) { assert(_starter == null); if (_timer == null) @@ -314,6 +331,7 @@ class _DelayedPointerState extends MultiDragPointerState { _starter = starter; } + @override void checkForResolutionAfterMove() { assert(_timer != null); assert(pendingDelta != null); @@ -321,6 +339,7 @@ class _DelayedPointerState extends MultiDragPointerState { resolve(GestureDisposition.rejected); } + @override void dispose() { _timer?.cancel(); _timer = null; @@ -342,9 +361,11 @@ class DelayedMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_Dela _delay = value; } + @override _DelayedPointerState createNewPointerState(PointerDownEvent event) { return new _DelayedPointerState(event.position, _delay); } + @override String toStringShort() => 'long multidrag'; } diff --git a/packages/flutter/lib/src/gestures/multitap.dart b/packages/flutter/lib/src/gestures/multitap.dart index 97da6fda0e..f40e41015d 100644 --- a/packages/flutter/lib/src/gestures/multitap.dart +++ b/packages/flutter/lib/src/gestures/multitap.dart @@ -82,6 +82,7 @@ class DoubleTapGestureRecognizer extends GestureRecognizer { _TapTracker _firstTap; final Map _trackers = new Map(); + @override void addPointer(PointerEvent event) { // Ignore out-of-bounds second taps. if (_firstTap != null && @@ -112,8 +113,10 @@ class DoubleTapGestureRecognizer extends GestureRecognizer { } } + @override void acceptGesture(int pointer) { } + @override void rejectGesture(int pointer) { _TapTracker tracker = _trackers[pointer]; // If tracker isn't in the list, check if this is the first tap tracker @@ -138,6 +141,7 @@ class DoubleTapGestureRecognizer extends GestureRecognizer { _reset(); } + @override void dispose() { _reset(); } @@ -198,6 +202,7 @@ class DoubleTapGestureRecognizer extends GestureRecognizer { } } + @override String toStringShort() => 'double tap'; } @@ -255,6 +260,7 @@ class _TapGesture extends _TapTracker { } } + @override void stopTrackingPointer(PointerRoute route) { _timer?.cancel(); _timer = null; @@ -305,6 +311,7 @@ class MultiTapGestureRecognizer extends GestureRecognizer { final Map _gestureMap = new Map(); + @override void addPointer(PointerEvent event) { assert(!_gestureMap.containsKey(event.pointer)); _gestureMap[event.pointer] = new _TapGesture( @@ -316,12 +323,14 @@ class MultiTapGestureRecognizer extends GestureRecognizer { onTapDown(event.position, event.pointer); } + @override void acceptGesture(int pointer) { assert(_gestureMap.containsKey(pointer)); _gestureMap[pointer]?.accept(); assert(!_gestureMap.containsKey(pointer)); } + @override void rejectGesture(int pointer) { assert(_gestureMap.containsKey(pointer)); _gestureMap[pointer]?.reject(); @@ -347,6 +356,7 @@ class MultiTapGestureRecognizer extends GestureRecognizer { onLongTapDown(lastPosition, pointer); } + @override void dispose() { List<_TapGesture> localGestures = new List<_TapGesture>.from(_gestureMap.values); for (_TapGesture gesture in localGestures) @@ -355,5 +365,6 @@ class MultiTapGestureRecognizer extends GestureRecognizer { assert(_gestureMap.isEmpty); } + @override String toStringShort() => 'multitap'; } diff --git a/packages/flutter/lib/src/gestures/recognizer.dart b/packages/flutter/lib/src/gestures/recognizer.dart index 21bc125858..9db54cbff9 100644 --- a/packages/flutter/lib/src/gestures/recognizer.dart +++ b/packages/flutter/lib/src/gestures/recognizer.dart @@ -61,8 +61,13 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer { final Set _trackedPointers = new HashSet(); void handleEvent(PointerEvent event); + + @override void acceptGesture(int pointer) { } + + @override void rejectGesture(int pointer) { } + void didStopTrackingLastPointer(int pointer); void resolve(GestureDisposition disposition) { @@ -72,6 +77,7 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer { entry.resolve(disposition); } + @override void dispose() { resolve(GestureDisposition.rejected); for (int pointer in _trackedPointers) @@ -116,6 +122,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni Point initialPosition; Timer _timer; + @override void addPointer(PointerDownEvent event) { startTrackingPointer(event.pointer); if (state == GestureRecognizerState.ready) { @@ -127,6 +134,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni } } + @override void handleEvent(PointerEvent event) { assert(state != GestureRecognizerState.ready); if (state == GestureRecognizerState.possible && event.pointer == primaryPointer) { @@ -151,6 +159,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni assert(deadline == null); } + @override void rejectGesture(int pointer) { if (pointer == primaryPointer) { _stopTimer(); @@ -158,11 +167,13 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni } } + @override void didStopTrackingLastPointer(int pointer) { _stopTimer(); state = GestureRecognizerState.ready; } + @override void dispose() { _stopTimer(); super.dispose(); diff --git a/packages/flutter/lib/src/gestures/scale.dart b/packages/flutter/lib/src/gestures/scale.dart index e54eb4cc93..f6daf55e06 100644 --- a/packages/flutter/lib/src/gestures/scale.dart +++ b/packages/flutter/lib/src/gestures/scale.dart @@ -31,6 +31,7 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer { double get _scaleFactor => _initialSpan > 0.0 ? _currentSpan / _initialSpan : 1.0; + @override void addPointer(PointerEvent event) { startTrackingPointer(event.pointer); if (_state == ScaleState.ready) { @@ -41,6 +42,7 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer { } } + @override void handleEvent(PointerEvent event) { assert(_state != ScaleState.ready); bool configChanged = false; @@ -101,6 +103,7 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer { onUpdate(_scaleFactor, focalPoint); } + @override void acceptGesture(int pointer) { if (_state != ScaleState.accepted) { _state = ScaleState.accepted; @@ -108,6 +111,7 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer { } } + @override void didStopTrackingLastPointer(int pointer) { switch(_state) { case ScaleState.possible: @@ -125,5 +129,6 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer { _state = ScaleState.ready; } + @override String toStringShort() => 'scale'; } diff --git a/packages/flutter/lib/src/gestures/tap.dart b/packages/flutter/lib/src/gestures/tap.dart index 02fe31cc07..0744e46ff9 100644 --- a/packages/flutter/lib/src/gestures/tap.dart +++ b/packages/flutter/lib/src/gestures/tap.dart @@ -27,6 +27,7 @@ class TapGestureRecognizer extends PrimaryPointerGestureRecognizer { bool _wonArena = false; Point _finalPosition; + @override void handlePrimaryPointer(PointerEvent event) { if (event is PointerUpEvent) { _finalPosition = event.position; @@ -34,6 +35,7 @@ class TapGestureRecognizer extends PrimaryPointerGestureRecognizer { } } + @override void resolve(GestureDisposition disposition) { if (_wonArena && disposition == GestureDisposition.rejected) { if (onTapCancel != null) @@ -43,10 +45,12 @@ class TapGestureRecognizer extends PrimaryPointerGestureRecognizer { super.resolve(disposition); } + @override void didExceedDeadline() { _checkDown(); } + @override void acceptGesture(int pointer) { super.acceptGesture(pointer); if (pointer == primaryPointer) { @@ -56,6 +60,7 @@ class TapGestureRecognizer extends PrimaryPointerGestureRecognizer { } } + @override void rejectGesture(int pointer) { super.rejectGesture(pointer); if (pointer == primaryPointer) { @@ -91,5 +96,6 @@ class TapGestureRecognizer extends PrimaryPointerGestureRecognizer { _finalPosition = null; } + @override String toStringShort() => 'tap'; } diff --git a/packages/flutter/lib/src/gestures/velocity_tracker.dart b/packages/flutter/lib/src/gestures/velocity_tracker.dart index fe2ca13888..baac211a11 100644 --- a/packages/flutter/lib/src/gestures/velocity_tracker.dart +++ b/packages/flutter/lib/src/gestures/velocity_tracker.dart @@ -17,6 +17,7 @@ class _Estimate { final int degree; final double confidence; + @override String toString() { return 'Estimate(xCoefficients: $xCoefficients, ' 'yCoefficients: $yCoefficients, ' @@ -73,6 +74,7 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy { _WeightChooser _chooseWeight; int _index; + @override void addMovement(Duration timeStamp, Point position) { _index += 1; if (_index == kHistorySize) @@ -82,6 +84,7 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy { movement.position = position; } + @override _Estimate getEstimate() { // Iterate over movement samples in reverse time order and collect samples. List x = new List(); @@ -145,6 +148,7 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy { ); } + @override void clear() { _index = -1; } @@ -228,6 +232,7 @@ class Velocity { pixelsPerSecond: pixelsPerSecond + other.pixelsPerSecond); } + @override bool operator ==(dynamic other) { if (other is! Velocity) return false; @@ -235,8 +240,10 @@ class Velocity { return pixelsPerSecond == typedOther.pixelsPerSecond; } + @override int get hashCode => pixelsPerSecond.hashCode; + @override String toString() => 'Velocity(${pixelsPerSecond.dx.toStringAsFixed(1)}, ${pixelsPerSecond.dy.toStringAsFixed(1)})'; } diff --git a/packages/flutter/lib/src/material/app.dart b/packages/flutter/lib/src/material/app.dart index c5894e25c7..318bb1b3a2 100644 --- a/packages/flutter/lib/src/material/app.dart +++ b/packages/flutter/lib/src/material/app.dart @@ -71,14 +71,17 @@ class MaterialApp extends WidgetsApp { /// Only available in checked mode. final bool debugShowMaterialGrid; + @override _MaterialAppState createState() => new _MaterialAppState(); } class _MaterialAppState extends WidgetsAppState { - final HeroController _heroController = new HeroController(); + + @override NavigatorObserver get navigatorObserver => _heroController; + @override Widget build(BuildContext context) { ThemeData theme = config.theme ?? new ThemeData.fallback(); Widget result = new AnimatedTheme( diff --git a/packages/flutter/lib/src/material/app_bar.dart b/packages/flutter/lib/src/material/app_bar.dart index 596bcd83f7..cac114efde 100644 --- a/packages/flutter/lib/src/material/app_bar.dart +++ b/packages/flutter/lib/src/material/app_bar.dart @@ -67,6 +67,7 @@ class AppBar extends StatelessWidget { ); } + @override Widget build(BuildContext context) { Color color = backgroundColor; IconThemeData iconThemeData; diff --git a/packages/flutter/lib/src/material/bottom_sheet.dart b/packages/flutter/lib/src/material/bottom_sheet.dart index 21d750ca69..0a30c1e2d2 100644 --- a/packages/flutter/lib/src/material/bottom_sheet.dart +++ b/packages/flutter/lib/src/material/bottom_sheet.dart @@ -32,6 +32,7 @@ class BottomSheet extends StatefulWidget { final VoidCallback onClosing; final WidgetBuilder builder; + @override _BottomSheetState createState() => new _BottomSheetState(); static AnimationController createAnimationController() { @@ -75,6 +76,7 @@ class _BottomSheetState extends State { } } + @override Widget build(BuildContext context) { return new GestureDetector( onVerticalDragUpdate: _handleDragUpdate, @@ -99,6 +101,7 @@ class _ModalBottomSheetLayout extends SingleChildLayoutDelegate { final double progress; + @override BoxConstraints getConstraintsForChild(BoxConstraints constraints) { return new BoxConstraints( minWidth: constraints.maxWidth, @@ -108,10 +111,12 @@ class _ModalBottomSheetLayout extends SingleChildLayoutDelegate { ); } + @override Offset getPositionForChild(Size size, Size childSize) { return new Offset(0.0, size.height - childSize.height * progress); } + @override bool shouldRelayout(_ModalBottomSheetLayout oldDelegate) { return progress != oldDelegate.progress; } @@ -122,10 +127,12 @@ class _ModalBottomSheet extends StatefulWidget { final _ModalBottomSheetRoute route; + @override _ModalBottomSheetState createState() => new _ModalBottomSheetState(); } class _ModalBottomSheetState extends State<_ModalBottomSheet> { + @override Widget build(BuildContext context) { return new GestureDetector( onTap: () => Navigator.pop(context), @@ -156,14 +163,21 @@ class _ModalBottomSheetRoute extends PopupRoute { final WidgetBuilder builder; + @override Duration get transitionDuration => _kBottomSheetDuration; + + @override bool get barrierDismissable => true; + + @override Color get barrierColor => Colors.black54; + @override AnimationController createAnimationController() { return BottomSheet.createAnimationController(); } + @override Widget buildPage(BuildContext context, Animation animation, Animation forwardAnimation) { return new _ModalBottomSheet(route: this); } diff --git a/packages/flutter/lib/src/material/button.dart b/packages/flutter/lib/src/material/button.dart index 0fd126aef2..4a1eeb7fc8 100644 --- a/packages/flutter/lib/src/material/button.dart +++ b/packages/flutter/lib/src/material/button.dart @@ -31,6 +31,7 @@ class ButtonTheme extends InheritedWidget { return result?.color ?? ButtonColor.normal; } + @override bool updateShouldNotify(ButtonTheme old) => color != old.color; } @@ -63,6 +64,7 @@ abstract class MaterialButton extends StatefulWidget { /// enable a button, set its [onPressed] property to a non-null value. bool get enabled => onPressed != null; + @override void debugFillDescription(List description) { super.debugFillDescription(description); if (!enabled) @@ -110,6 +112,7 @@ abstract class MaterialButtonState extends State { }); } + @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); Widget contents = new InkWell( diff --git a/packages/flutter/lib/src/material/card.dart b/packages/flutter/lib/src/material/card.dart index 241d553c37..f289477447 100644 --- a/packages/flutter/lib/src/material/card.dart +++ b/packages/flutter/lib/src/material/card.dart @@ -17,6 +17,7 @@ class Card extends StatelessWidget { final Widget child; final Color color; + @override Widget build(BuildContext context) { return new Container( margin: _kCardMargins, diff --git a/packages/flutter/lib/src/material/checkbox.dart b/packages/flutter/lib/src/material/checkbox.dart index 54b1d4222d..c9e47b6fee 100644 --- a/packages/flutter/lib/src/material/checkbox.dart +++ b/packages/flutter/lib/src/material/checkbox.dart @@ -37,6 +37,7 @@ class Checkbox extends StatelessWidget { final Color activeColor; final ValueChanged onChanged; + @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); ThemeData themeData = Theme.of(context); @@ -67,6 +68,7 @@ class _CheckboxRenderObjectWidget extends LeafRenderObjectWidget { final Color inactiveColor; final ValueChanged onChanged; + @override _RenderCheckbox createRenderObject(BuildContext context) => new _RenderCheckbox( value: value, activeColor: activeColor, @@ -74,6 +76,7 @@ class _CheckboxRenderObjectWidget extends LeafRenderObjectWidget { onChanged: onChanged ); + @override void updateRenderObject(BuildContext context, _RenderCheckbox renderObject) { renderObject ..value = value @@ -103,6 +106,7 @@ class _RenderCheckbox extends RenderToggleable { size: const Size(2 * kRadialReactionRadius, 2 * kRadialReactionRadius) ); + @override void paint(PaintingContext context, Offset offset) { final Canvas canvas = context.canvas; final double offsetX = _kOffset + offset.dx; diff --git a/packages/flutter/lib/src/material/chip.dart b/packages/flutter/lib/src/material/chip.dart index 04e7a83255..e77080bdf8 100644 --- a/packages/flutter/lib/src/material/chip.dart +++ b/packages/flutter/lib/src/material/chip.dart @@ -33,6 +33,7 @@ class Chip extends StatelessWidget { final Widget label; final VoidCallback onDeleted; + @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); final bool deletable = onDeleted != null; diff --git a/packages/flutter/lib/src/material/circle_avatar.dart b/packages/flutter/lib/src/material/circle_avatar.dart index a10fbfd60f..46749808e3 100644 --- a/packages/flutter/lib/src/material/circle_avatar.dart +++ b/packages/flutter/lib/src/material/circle_avatar.dart @@ -19,6 +19,7 @@ class CircleAvatar extends StatelessWidget { final Color backgroundColor; final double radius; + @override Widget build(BuildContext context) { final ThemeData theme = Theme.of(context); final Color color = backgroundColor ?? theme.primaryColor; diff --git a/packages/flutter/lib/src/material/date_picker.dart b/packages/flutter/lib/src/material/date_picker.dart index 3024af3c28..1388462079 100644 --- a/packages/flutter/lib/src/material/date_picker.dart +++ b/packages/flutter/lib/src/material/date_picker.dart @@ -34,6 +34,7 @@ class DatePicker extends StatefulWidget { final DateTime firstDate; final DateTime lastDate; + @override _DatePickerState createState() => new _DatePickerState(); } @@ -64,6 +65,7 @@ class _DatePickerState extends State { static const double _calendarHeight = 210.0; + @override Widget build(BuildContext context) { Widget header = new _DatePickerHeader( selectedDate: config.selectedDate, @@ -120,6 +122,7 @@ class _DatePickerHeader extends StatelessWidget { onModeChanged(value); } + @override Widget build(BuildContext context) { ThemeData theme = Theme.of(context); TextTheme headerTheme = theme.primaryTextTheme; @@ -181,6 +184,7 @@ class DayPicker extends StatelessWidget { final ValueChanged onChanged; final DateTime displayedMonth; + @override Widget build(BuildContext context) { ThemeData themeData = Theme.of(context); TextStyle headerStyle = themeData.textTheme.caption.copyWith(fontWeight: FontWeight.w700); @@ -289,10 +293,12 @@ class MonthPicker extends StatefulWidget { final DateTime lastDate; final double itemExtent; + @override _MonthPickerState createState() => new _MonthPickerState(); } class _MonthPickerState extends State { + @override void initState() { super.initState(); _updateCurrentDate(); @@ -335,6 +341,7 @@ class _MonthPickerState extends State { return result; } + @override Widget build(BuildContext context) { return new ScrollableLazyList( itemExtent: config.itemExtent, @@ -343,6 +350,7 @@ class _MonthPickerState extends State { ); } + @override void dispose() { if (_timer != null) _timer.cancel(); @@ -369,6 +377,7 @@ class YearPicker extends StatefulWidget { final DateTime firstDate; final DateTime lastDate; + @override _YearPickerState createState() => new _YearPickerState(); } @@ -403,6 +412,7 @@ class _YearPickerState extends State { return items; } + @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); return new ScrollableLazyList( diff --git a/packages/flutter/lib/src/material/date_picker_dialog.dart b/packages/flutter/lib/src/material/date_picker_dialog.dart index 2d58f0b1d9..49696b2415 100644 --- a/packages/flutter/lib/src/material/date_picker_dialog.dart +++ b/packages/flutter/lib/src/material/date_picker_dialog.dart @@ -22,10 +22,12 @@ class _DatePickerDialog extends StatefulWidget { final DateTime firstDate; final DateTime lastDate; + @override _DatePickerDialogState createState() => new _DatePickerDialogState(); } class _DatePickerDialogState extends State<_DatePickerDialog> { + @override void initState() { super.initState(); _selectedDate = config.initialDate; @@ -47,6 +49,7 @@ class _DatePickerDialogState extends State<_DatePickerDialog> { Navigator.pop(context, _selectedDate); } + @override Widget build(BuildContext context) { return new Dialog( content: new DatePicker( diff --git a/packages/flutter/lib/src/material/dialog.dart b/packages/flutter/lib/src/material/dialog.dart index e8acc90044..078bba5fab 100644 --- a/packages/flutter/lib/src/material/dialog.dart +++ b/packages/flutter/lib/src/material/dialog.dart @@ -54,6 +54,7 @@ class Dialog extends StatelessWidget { } } + @override Widget build(BuildContext context) { List dialogBody = new List(); @@ -123,14 +124,21 @@ class _DialogRoute extends PopupRoute { final Widget child; + @override Duration get transitionDuration => const Duration(milliseconds: 150); + + @override bool get barrierDismissable => true; + + @override Color get barrierColor => Colors.black54; + @override Widget buildPage(BuildContext context, Animation animation, Animation forwardAnimation) { return child; } + @override Widget buildTransitions(BuildContext context, Animation animation, Animation forwardAnimation, Widget child) { return new FadeTransition( opacity: new CurvedAnimation( diff --git a/packages/flutter/lib/src/material/divider.dart b/packages/flutter/lib/src/material/divider.dart index d01968a955..75097f1380 100644 --- a/packages/flutter/lib/src/material/divider.dart +++ b/packages/flutter/lib/src/material/divider.dart @@ -15,6 +15,7 @@ class Divider extends StatelessWidget { final double indent; final Color color; + @override Widget build(BuildContext context) { final double bottom = (height ~/ 2.0).toDouble(); return new Container( diff --git a/packages/flutter/lib/src/material/drawer.dart b/packages/flutter/lib/src/material/drawer.dart index e3353e92e5..201a640e7f 100644 --- a/packages/flutter/lib/src/material/drawer.dart +++ b/packages/flutter/lib/src/material/drawer.dart @@ -36,6 +36,7 @@ class Drawer extends StatelessWidget { final int elevation; final Widget child; + @override Widget build(BuildContext context) { return new ConstrainedBox( constraints: const BoxConstraints.expand(width: _kWidth), @@ -55,10 +56,12 @@ class DrawerController extends StatefulWidget { final Widget child; + @override DrawerControllerState createState() => new DrawerControllerState(); } class DrawerControllerState extends State { + @override void initState() { super.initState(); _controller = new AnimationController(duration: _kBaseSettleDuration) @@ -66,6 +69,7 @@ class DrawerControllerState extends State { ..addStatusListener(_animationStatusChanged); } + @override void dispose() { _controller ..removeListener(_animationChanged) @@ -158,6 +162,7 @@ class DrawerControllerState extends State { final ColorTween _color = new ColorTween(begin: Colors.transparent, end: Colors.black54); final GlobalKey _gestureDetectorKey = new GlobalKey(); + @override Widget build(BuildContext context) { if (_controller.status == AnimationStatus.dismissed) { return new Align( diff --git a/packages/flutter/lib/src/material/drawer_header.dart b/packages/flutter/lib/src/material/drawer_header.dart index 4feb78b81d..a830dc8899 100644 --- a/packages/flutter/lib/src/material/drawer_header.dart +++ b/packages/flutter/lib/src/material/drawer_header.dart @@ -16,6 +16,7 @@ class DrawerHeader extends StatelessWidget { final Widget child; + @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); final double statusBarHeight = (MediaQuery.of(context)?.padding ?? EdgeInsets.zero).top; diff --git a/packages/flutter/lib/src/material/drawer_item.dart b/packages/flutter/lib/src/material/drawer_item.dart index 05942a0fa7..c82f2481bc 100644 --- a/packages/flutter/lib/src/material/drawer_item.dart +++ b/packages/flutter/lib/src/material/drawer_item.dart @@ -55,6 +55,7 @@ class DrawerItem extends StatelessWidget { return result; } + @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); ThemeData themeData = Theme.of(context); diff --git a/packages/flutter/lib/src/material/dropdown.dart b/packages/flutter/lib/src/material/dropdown.dart index 34550c2a05..44ec9c44b2 100644 --- a/packages/flutter/lib/src/material/dropdown.dart +++ b/packages/flutter/lib/src/material/dropdown.dart @@ -35,6 +35,7 @@ class _DropDownMenuPainter extends CustomPainter { final double menuBottom; final RenderBox renderBox; + @override void paint(Canvas canvas, Size size) { final BoxPainter painter = new BoxDecoration( backgroundColor: color, @@ -47,6 +48,7 @@ class _DropDownMenuPainter extends CustomPainter { painter.paint(canvas, new Rect.fromLTRB(0.0, top, size.width, bottom)); } + @override bool shouldRepaint(_DropDownMenuPainter oldPainter) { return oldPainter.color != color || oldPainter.elevation != elevation @@ -64,6 +66,7 @@ class _DropDownMenu extends StatusTransitionWidget { final _DropDownRoute route; + @override Widget build(BuildContext context) { // The menu is shown in three stages (unit timing in brackets): // [0s - 0.25s] - Fade in a rect-sized menu container with the selected item. @@ -152,13 +155,18 @@ class _DropDownMenu extends StatusTransitionWidget { // returning a real null value. class _DropDownRouteResult { const _DropDownRouteResult(this.result); + final T result; + + @override bool operator ==(dynamic other) { if (other is! _DropDownRouteResult) return false; final _DropDownRouteResult typedOther = other; return result == typedOther.result; } + + @override int get hashCode => result.hashCode; } @@ -176,10 +184,16 @@ class _DropDownRoute extends PopupRoute<_DropDownRouteResult> { final Rect rect; final int elevation; + @override Duration get transitionDuration => _kDropDownMenuDuration; + + @override bool get barrierDismissable => true; + + @override Color get barrierColor => null; + @override ModalPosition getPosition(BuildContext context) { RenderBox overlayBox = Overlay.of(context).context.findRenderObject(); assert(overlayBox != null); // can't be null; routes get inserted by Navigator which has its own Overlay @@ -192,6 +206,7 @@ class _DropDownRoute extends PopupRoute<_DropDownRouteResult> { ); } + @override Widget buildPage(BuildContext context, Animation animation, Animation forwardAnimation) { return new _DropDownMenu(route: this); } @@ -207,6 +222,7 @@ class DropDownMenuItem extends StatelessWidget { final Widget child; final T value; + @override Widget build(BuildContext context) { return new Container( height: _kMenuItemHeight, @@ -238,18 +254,21 @@ class DropDownButton extends StatefulWidget { final ValueChanged onChanged; final int elevation; + @override _DropDownButtonState createState() => new _DropDownButtonState(); } class _DropDownButtonState extends State> { final GlobalKey indexedStackKey = new GlobalKey(debugLabel: 'DropDownButton.IndexedStack'); + @override void initState() { super.initState(); _updateSelectedIndex(); assert(_selectedIndex != null); } + @override void didUpdateConfig(DropDownButton oldConfig) { if (config.items[_selectedIndex].value != config.value) _updateSelectedIndex(); @@ -285,6 +304,7 @@ class _DropDownButtonState extends State> { }); } + @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); return new GestureDetector( diff --git a/packages/flutter/lib/src/material/flat_button.dart b/packages/flutter/lib/src/material/flat_button.dart index d4695250ea..f3f54157e1 100644 --- a/packages/flutter/lib/src/material/flat_button.dart +++ b/packages/flutter/lib/src/material/flat_button.dart @@ -59,21 +59,23 @@ class FlatButton extends MaterialButton { /// Controls the default text color if the text color isn't explicit set. final ThemeBrightness colorBrightness; + @override _FlatButtonState createState() => new _FlatButtonState(); } class _FlatButtonState extends MaterialButtonState { - + @override int get elevation => 0; + @override Color getColor(BuildContext context) { if (!config.enabled) return config.disabledColor; return config.color; } + @override ThemeBrightness getColorBrightness(BuildContext context) { return config.colorBrightness ?? Theme.of(context).brightness; } - } diff --git a/packages/flutter/lib/src/material/flexible_space_bar.dart b/packages/flutter/lib/src/material/flexible_space_bar.dart index f61b63e810..7987f1012f 100644 --- a/packages/flutter/lib/src/material/flexible_space_bar.dart +++ b/packages/flutter/lib/src/material/flexible_space_bar.dart @@ -17,11 +17,12 @@ class FlexibleSpaceBar extends StatefulWidget { final Widget title; final Widget image; + @override _FlexibleSpaceBarState createState() => new _FlexibleSpaceBarState(); } class _FlexibleSpaceBarState extends State { - + @override Widget build(BuildContext context) { assert(debugCheckHasScaffold(context)); final double appBarHeight = Scaffold.of(context).appBarHeight; diff --git a/packages/flutter/lib/src/material/floating_action_button.dart b/packages/flutter/lib/src/material/floating_action_button.dart index edc81b5962..00be2e0a0a 100644 --- a/packages/flutter/lib/src/material/floating_action_button.dart +++ b/packages/flutter/lib/src/material/floating_action_button.dart @@ -57,6 +57,7 @@ class FloatingActionButton extends StatefulWidget { final int highlightElevation; final bool mini; + @override _FloatingActionButtonState createState() => new _FloatingActionButtonState(); } @@ -64,6 +65,7 @@ class _FloatingActionButtonState extends State { Animation _childSegue; AnimationController _childSegueController; + @override void initState() { super.initState(); _childSegueController = new AnimationController(duration: _kChildSegue) @@ -77,6 +79,7 @@ class _FloatingActionButtonState extends State { )); } + @override void didUpdateConfig(FloatingActionButton oldConfig) { super.didUpdateConfig(oldConfig); if (Widget.canUpdate(oldConfig.child, config.child) && config.backgroundColor == oldConfig.backgroundColor) @@ -94,6 +97,7 @@ class _FloatingActionButtonState extends State { }); } + @override Widget build(BuildContext context) { Color iconColor = Colors.white; Color materialColor = config.backgroundColor; diff --git a/packages/flutter/lib/src/material/grid_tile.dart b/packages/flutter/lib/src/material/grid_tile.dart index fefd8f8a32..65dc9a9946 100644 --- a/packages/flutter/lib/src/material/grid_tile.dart +++ b/packages/flutter/lib/src/material/grid_tile.dart @@ -15,6 +15,7 @@ class GridTile extends StatelessWidget { final Widget footer; final Widget child; + @override Widget build(BuildContext context) { if (header == null && footer == null) return child; diff --git a/packages/flutter/lib/src/material/grid_tile_bar.dart b/packages/flutter/lib/src/material/grid_tile_bar.dart index 87dfe9cf95..f35aa9d129 100644 --- a/packages/flutter/lib/src/material/grid_tile_bar.dart +++ b/packages/flutter/lib/src/material/grid_tile_bar.dart @@ -31,6 +31,7 @@ class GridTileBar extends StatelessWidget { final Widget subtitle; final Widget trailing; + @override Widget build(BuildContext context) { BoxDecoration decoration; if (backgroundColor != null) diff --git a/packages/flutter/lib/src/material/icon.dart b/packages/flutter/lib/src/material/icon.dart index 90a8bf4798..21ccb0cadf 100644 --- a/packages/flutter/lib/src/material/icon.dart +++ b/packages/flutter/lib/src/material/icon.dart @@ -56,6 +56,7 @@ class Icon extends StatelessWidget { return IconTheme.of(context)?.color ?? _getDefaultColorForThemeBrightness(Theme.of(context).brightness); } + @override Widget build(BuildContext context) { if (icon == null) return new SizedBox(width: size, height: size); @@ -84,6 +85,7 @@ class Icon extends StatelessWidget { ); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('$icon'); diff --git a/packages/flutter/lib/src/material/icon_button.dart b/packages/flutter/lib/src/material/icon_button.dart index 461dc75459..abada4dc26 100644 --- a/packages/flutter/lib/src/material/icon_button.dart +++ b/packages/flutter/lib/src/material/icon_button.dart @@ -53,6 +53,7 @@ class IconButton extends StatelessWidget { /// used for accessibility. final String tooltip; + @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); Widget result = new Padding( @@ -75,6 +76,7 @@ class IconButton extends StatelessWidget { ); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('$icon'); diff --git a/packages/flutter/lib/src/material/icon_theme.dart b/packages/flutter/lib/src/material/icon_theme.dart index e14c2e8a8f..e9e356239f 100644 --- a/packages/flutter/lib/src/material/icon_theme.dart +++ b/packages/flutter/lib/src/material/icon_theme.dart @@ -24,8 +24,10 @@ class IconTheme extends InheritedWidget { return result?.data; } + @override bool updateShouldNotify(IconTheme old) => data != old.data; + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('$data'); diff --git a/packages/flutter/lib/src/material/icon_theme_data.dart b/packages/flutter/lib/src/material/icon_theme_data.dart index 860a872cf2..f80c7d2ddc 100644 --- a/packages/flutter/lib/src/material/icon_theme_data.dart +++ b/packages/flutter/lib/src/material/icon_theme_data.dart @@ -23,6 +23,7 @@ class IconThemeData { ); } + @override bool operator ==(dynamic other) { if (other is! IconThemeData) return false; @@ -30,7 +31,9 @@ class IconThemeData { return color == typedOther.color && opacity == typedOther.opacity; } + @override int get hashCode => hashValues(color, opacity); + @override String toString() => '$color'; } diff --git a/packages/flutter/lib/src/material/icons.dart b/packages/flutter/lib/src/material/icons.dart index 485f441040..6a9f1afb5e 100644 --- a/packages/flutter/lib/src/material/icons.dart +++ b/packages/flutter/lib/src/material/icons.dart @@ -6,13 +6,18 @@ class IconData { const IconData(this.codePoint); final int codePoint; + @override bool operator ==(dynamic other) { if (other is! IconData) return false; final IconData typedOther = other; return codePoint == typedOther.codePoint; } + + @override int get hashCode => codePoint.hashCode; + + @override String toString() => 'IconData(codePoint: $codePoint)'; } diff --git a/packages/flutter/lib/src/material/ink_well.dart b/packages/flutter/lib/src/material/ink_well.dart index 1eff1e7f48..394959e468 100644 --- a/packages/flutter/lib/src/material/ink_well.dart +++ b/packages/flutter/lib/src/material/ink_well.dart @@ -44,6 +44,7 @@ class InkResponse extends StatefulWidget { final bool containedInWell; final BoxShape highlightShape; + @override _InkResponseState createState() => new _InkResponseState(); } @@ -133,6 +134,7 @@ class _InkResponseState extends State { config.onLongPress(); } + @override void deactivate() { if (_splashes != null) { Set splashes = _splashes; @@ -147,11 +149,13 @@ class _InkResponseState extends State { super.deactivate(); } + @override void dependenciesChanged(Type affectedWidgetType) { if (affectedWidgetType == Theme && _lastHighlight != null) _lastHighlight.color = Theme.of(context).highlightColor; } + @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); final bool enabled = config.onTap != null || config.onDoubleTap != null || config.onLongPress != null; diff --git a/packages/flutter/lib/src/material/input.dart b/packages/flutter/lib/src/material/input.dart index c3e09813d7..40bb04de48 100644 --- a/packages/flutter/lib/src/material/input.dart +++ b/packages/flutter/lib/src/material/input.dart @@ -67,6 +67,7 @@ class Input extends StatefulWidget { /// Called when the user indicates that they are done editing the text in the field. final ValueChanged onSubmitted; + @override _InputState createState() => new _InputState(); } @@ -78,6 +79,7 @@ class _InputState extends State { GlobalKey get focusKey => config.key is GlobalKey ? config.key : _rawInputLineKey; + @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); ThemeData themeData = Theme.of(context); diff --git a/packages/flutter/lib/src/material/list.dart b/packages/flutter/lib/src/material/list.dart index 507dd4a929..00be870b1f 100644 --- a/packages/flutter/lib/src/material/list.dart +++ b/packages/flutter/lib/src/material/list.dart @@ -39,12 +39,14 @@ class MaterialList extends StatefulWidget { final EdgeInsets scrollablePadding; final Key scrollableKey; + @override _MaterialListState createState() => new _MaterialListState(); } class _MaterialListState extends State { ScrollbarPainter _scrollbarPainter = new ScrollbarPainter(); + @override Widget build(BuildContext context) { return new ScrollableList( key: config.scrollableKey, diff --git a/packages/flutter/lib/src/material/list_item.dart b/packages/flutter/lib/src/material/list_item.dart index 4e2da07da1..714527e311 100644 --- a/packages/flutter/lib/src/material/list_item.dart +++ b/packages/flutter/lib/src/material/list_item.dart @@ -84,6 +84,7 @@ class ListItem extends StatelessWidget { return dense ? style.copyWith(color: color, fontSize: 12.0) : style.copyWith(color: color); } + @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); final bool isTwoLine = !isThreeLine && subtitle != null; diff --git a/packages/flutter/lib/src/material/material.dart b/packages/flutter/lib/src/material/material.dart index b2f2de7974..7658caa664 100644 --- a/packages/flutter/lib/src/material/material.dart +++ b/packages/flutter/lib/src/material/material.dart @@ -98,8 +98,10 @@ class Material extends StatefulWidget { return result; } + @override _MaterialState createState() => new _MaterialState(); + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('$type'); @@ -125,6 +127,7 @@ class _MaterialState extends State { } } + @override Widget build(BuildContext context) { Color backgroundColor = _getBackgroundColor(context); Widget contents = config.child; @@ -189,10 +192,12 @@ class RenderInkFeatures extends RenderProxyBox implements MaterialInkController // This is here to satisfy the MaterialInkController contract. // The actual painting of this color is done by a Container in the // MaterialState build method. + @override Color color; final List _inkFeatures = []; + @override InkSplash splashAt({ RenderBox referenceBox, Point position, @@ -228,6 +233,7 @@ class RenderInkFeatures extends RenderProxyBox implements MaterialInkController return math.max(math.max(d1, d2), math.max(d3, d4)).ceilToDouble(); } + @override InkHighlight highlightAt({ RenderBox referenceBox, Color color, @@ -245,6 +251,7 @@ class RenderInkFeatures extends RenderProxyBox implements MaterialInkController return highlight; } + @override void addInkFeature(InkFeature feature) { assert(!feature._debugDisposed); assert(feature.renderer == this); @@ -258,8 +265,10 @@ class RenderInkFeatures extends RenderProxyBox implements MaterialInkController markNeedsPaint(); } + @override bool hitTestSelf(Point position) => true; + @override void paint(PaintingContext context, Offset offset) { if (_inkFeatures.isNotEmpty) { final Canvas canvas = context.canvas; @@ -279,8 +288,10 @@ class InkFeatures extends SingleChildRenderObjectWidget { final Color color; + @override RenderInkFeatures createRenderObject(BuildContext context) => new RenderInkFeatures(color: color); + @override void updateRenderObject(BuildContext context, RenderInkFeatures renderObject) { renderObject.color = color; } @@ -328,6 +339,7 @@ abstract class InkFeature { void paintFeature(Canvas canvas, Matrix4 transform); + @override String toString() => "$runtimeType@$hashCode"; } @@ -371,6 +383,7 @@ class _InkSplash extends InkFeature implements InkSplash { Animation _alpha; AnimationController _alphaController; + @override void confirm() { int duration = (targetRadius / _kSplashConfirmedVelocity).floor(); _radiusController @@ -379,6 +392,7 @@ class _InkSplash extends InkFeature implements InkSplash { _alphaController.forward(); } + @override void cancel() { _alphaController.forward(); } @@ -388,12 +402,14 @@ class _InkSplash extends InkFeature implements InkSplash { dispose(); } + @override void dispose() { _radiusController.stop(); _alphaController.stop(); super.dispose(); } + @override void paintFeature(Canvas canvas, Matrix4 transform) { Paint paint = new Paint()..color = color.withAlpha(_alpha.value); Point center = position; @@ -440,8 +456,11 @@ class _InkHighlight extends InkFeature implements InkHighlight { ).animate(_alphaController); } + @override Color get color => _color; Color _color; + + @override void set color(Color value) { if (value == _color) return; @@ -451,17 +470,20 @@ class _InkHighlight extends InkFeature implements InkHighlight { final BoxShape shape; + @override bool get active => _active; bool _active = true; Animation _alpha; AnimationController _alphaController; + @override void activate() { _active = true; _alphaController.forward(); } + @override void deactivate() { _active = false; _alphaController.reverse(); @@ -472,6 +494,7 @@ class _InkHighlight extends InkFeature implements InkHighlight { dispose(); } + @override void dispose() { _alphaController.stop(); super.dispose(); @@ -484,6 +507,7 @@ class _InkHighlight extends InkFeature implements InkHighlight { canvas.drawCircle(rect.center, _kDefaultSplashRadius, paint); } + @override void paintFeature(Canvas canvas, Matrix4 transform) { Paint paint = new Paint()..color = color.withAlpha(_alpha.value); Offset originOffset = MatrixUtils.getAsTranslation(transform); diff --git a/packages/flutter/lib/src/material/page.dart b/packages/flutter/lib/src/material/page.dart index 303b0be982..59cb5f84a2 100644 --- a/packages/flutter/lib/src/material/page.dart +++ b/packages/flutter/lib/src/material/page.dart @@ -23,6 +23,7 @@ class _MaterialPageTransition extends AnimatedWidget { end: Point.origin ); + @override Widget build(BuildContext context) { Point position = _position.evaluate(animation); Matrix4 transform = new Matrix4.identity() @@ -52,10 +53,16 @@ class MaterialPageRoute extends PageRoute { final WidgetBuilder builder; + @override Duration get transitionDuration => kMaterialPageRouteTransitionDuration; + + @override Color get barrierColor => null; + + @override bool canTransitionFrom(TransitionRoute nextRoute) => false; + @override Widget buildPage(BuildContext context, Animation animation, Animation forwardAnimation) { Widget result = builder(context); assert(() { @@ -67,6 +74,7 @@ class MaterialPageRoute extends PageRoute { return result; } + @override Widget buildTransitions(BuildContext context, Animation animation, Animation forwardAnimation, Widget child) { return new _MaterialPageTransition( animation: animation, @@ -74,5 +82,6 @@ class MaterialPageRoute extends PageRoute { ); } + @override String get debugLabel => '${super.debugLabel}(${settings.name})'; } diff --git a/packages/flutter/lib/src/material/popup_menu.dart b/packages/flutter/lib/src/material/popup_menu.dart index de732a6b81..7326e10808 100644 --- a/packages/flutter/lib/src/material/popup_menu.dart +++ b/packages/flutter/lib/src/material/popup_menu.dart @@ -39,12 +39,15 @@ abstract class PopupMenuEntry extends StatefulWidget { class PopupMenuDivider extends PopupMenuEntry { PopupMenuDivider({ Key key, this.height: 16.0 }) : super(key: key); + @override final double height; + @override _PopupMenuDividerState createState() => new _PopupMenuDividerState(); } class _PopupMenuDividerState extends State { + @override Widget build(BuildContext context) => new Divider(height: config.height); } @@ -56,12 +59,18 @@ class PopupMenuItem extends PopupMenuEntry { this.child }) : super(key: key); + @override final T value; + + @override final bool enabled; + final Widget child; + @override double get height => _kMenuItemHeight; + @override _PopupMenuItemState> createState() => new _PopupMenuItemState>(); } @@ -73,6 +82,7 @@ class _PopupMenuItemState> extends State { Navigator.pop(context, config.value); } + @override Widget build(BuildContext context) { final ThemeData theme = Theme.of(context); TextStyle style = theme.textTheme.subhead; @@ -123,6 +133,7 @@ class CheckedPopupMenuItem extends PopupMenuItem { final bool checked; + @override _CheckedPopupMenuItemState createState() => new _CheckedPopupMenuItemState(); } @@ -131,6 +142,7 @@ class _CheckedPopupMenuItemState extends _PopupMenuItemState get _opacity => _controller.view; + @override void initState() { super.initState(); _controller = new AnimationController(duration: _kFadeDuration) @@ -138,6 +150,7 @@ class _CheckedPopupMenuItemState extends _PopupMenuItemState setState(() { /* animation changed */ })); } + @override void onTap() { // This fades the checkmark in or out when tapped. if (config.checked) @@ -147,6 +160,7 @@ class _CheckedPopupMenuItemState extends _PopupMenuItemState extends StatelessWidget { final _PopupMenuRoute route; + @override Widget build(BuildContext context) { double unit = 1.0 / (route.items.length + 1.5); // 1.0 for the width and 0.5 for the last item's fade. List children = []; @@ -239,6 +254,7 @@ class _PopupMenuRouteLayout extends SingleChildLayoutDelegate { final ModalPosition position; final double selectedItemOffset; + @override BoxConstraints getConstraintsForChild(BoxConstraints constraints) { return new BoxConstraints( minWidth: 0.0, @@ -251,6 +267,7 @@ class _PopupMenuRouteLayout extends SingleChildLayoutDelegate { // Put the child wherever position specifies, so long as it will fit within the // specified parent size padded (inset) by 8. If necessary, adjust the child's // position so that it fits. + @override Offset getPositionForChild(Size size, Size childSize) { double x = position?.left ?? (position?.right != null ? size.width - (position.right + childSize.width) : _kMenuScreenPadding); @@ -271,6 +288,7 @@ class _PopupMenuRouteLayout extends SingleChildLayoutDelegate { return new Offset(x, y); } + @override bool shouldRelayout(_PopupMenuRouteLayout oldDelegate) { return position != oldDelegate.position; } @@ -290,8 +308,10 @@ class _PopupMenuRoute extends PopupRoute { final dynamic initialValue; final int elevation; + @override ModalPosition getPosition(BuildContext context) => null; + @override Animation createAnimation() { return new CurvedAnimation( parent: super.createAnimation(), @@ -299,10 +319,16 @@ class _PopupMenuRoute extends PopupRoute { ); } + @override Duration get transitionDuration => _kMenuDuration; + + @override bool get barrierDismissable => true; + + @override Color get barrierColor => null; + @override Widget buildPage(BuildContext context, Animation animation, Animation forwardAnimation) { double selectedItemOffset; if (initialValue != null) { @@ -375,6 +401,7 @@ class PopupMenuButton extends StatefulWidget { final int elevation; final Widget child; + @override _PopupMenuButtonState createState() => new _PopupMenuButtonState(); } @@ -398,6 +425,7 @@ class _PopupMenuButtonState extends State> { }); } + @override Widget build(BuildContext context) { if (config.child == null) { return new IconButton( diff --git a/packages/flutter/lib/src/material/progress_indicator.dart b/packages/flutter/lib/src/material/progress_indicator.dart index 37bce7ca8e..ec6da26e57 100644 --- a/packages/flutter/lib/src/material/progress_indicator.dart +++ b/packages/flutter/lib/src/material/progress_indicator.dart @@ -25,6 +25,7 @@ abstract class ProgressIndicator extends StatefulWidget { Color _getBackgroundColor(BuildContext context) => Theme.of(context).backgroundColor; Color _getValueColor(BuildContext context) => Theme.of(context).primaryColor; + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('${(value.clamp(0.0, 1.0) * 100.0).toStringAsFixed(1)}%'); @@ -44,6 +45,7 @@ class _LinearProgressIndicatorPainter extends CustomPainter { final double value; final double animationValue; + @override void paint(Canvas canvas, Size size) { Paint paint = new Paint() ..color = backgroundColor @@ -63,6 +65,7 @@ class _LinearProgressIndicatorPainter extends CustomPainter { } } + @override bool shouldRepaint(_LinearProgressIndicatorPainter oldPainter) { return oldPainter.backgroundColor != backgroundColor || oldPainter.valueColor != valueColor @@ -77,6 +80,7 @@ class LinearProgressIndicator extends ProgressIndicator { double value }) : super(key: key, value: value); + @override _LinearProgressIndicatorState createState() => new _LinearProgressIndicatorState(); } @@ -84,6 +88,7 @@ class _LinearProgressIndicatorState extends State { Animation _animation; AnimationController _controller; + @override void initState() { super.initState(); _controller = new AnimationController( @@ -92,6 +97,7 @@ class _LinearProgressIndicatorState extends State { _animation = new CurvedAnimation(parent: _controller, curve: Curves.fastOutSlowIn); } + @override void dispose() { _controller.stop(); super.dispose(); @@ -114,6 +120,7 @@ class _LinearProgressIndicatorState extends State { ); } + @override Widget build(BuildContext context) { if (config.value != null) return _buildIndicator(context, _animation.value); @@ -150,6 +157,7 @@ class _CircularProgressIndicatorPainter extends CustomPainter { final int stepValue; final double rotationValue; + @override void paint(Canvas canvas, Size size) { Paint paint = new Paint() ..color = valueColor @@ -177,6 +185,7 @@ class _CircularProgressIndicatorPainter extends CustomPainter { } } + @override bool shouldRepaint(_CircularProgressIndicatorPainter oldPainter) { return oldPainter.valueColor != valueColor || oldPainter.value != value @@ -193,6 +202,7 @@ class CircularProgressIndicator extends ProgressIndicator { double value }) : super(key: key, value: value); + @override _CircularProgressIndicatorState createState() => new _CircularProgressIndicatorState(); } @@ -216,6 +226,7 @@ final Animatable _kRotationTween = new CurveTween(curve: new SawTooth(5) class _CircularProgressIndicatorState extends State { AnimationController _controller; + @override void initState() { super.initState(); _controller = new AnimationController( @@ -223,6 +234,7 @@ class _CircularProgressIndicatorState extends State { )..repeat(); } + @override void dispose() { _controller.stop(); super.dispose(); @@ -247,6 +259,7 @@ class _CircularProgressIndicatorState extends State { ); } + @override Widget build(BuildContext context) { if (config.value != null) return _buildIndicator(context, 0.0, 0.0, 0, 0.0); diff --git a/packages/flutter/lib/src/material/radio.dart b/packages/flutter/lib/src/material/radio.dart index 83b4bd3024..440e1b6bb5 100644 --- a/packages/flutter/lib/src/material/radio.dart +++ b/packages/flutter/lib/src/material/radio.dart @@ -39,6 +39,7 @@ class Radio extends StatelessWidget { onChanged(value); } + @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); ThemeData themeData = Theme.of(context); @@ -72,6 +73,7 @@ class _RadioRenderObjectWidget extends LeafRenderObjectWidget { final Color activeColor; final ValueChanged onChanged; + @override _RenderRadio createRenderObject(BuildContext context) => new _RenderRadio( value: selected, activeColor: activeColor, @@ -79,6 +81,7 @@ class _RadioRenderObjectWidget extends LeafRenderObjectWidget { onChanged: onChanged ); + @override void updateRenderObject(BuildContext context, _RenderRadio renderObject) { renderObject ..value = selected @@ -102,8 +105,10 @@ class _RenderRadio extends RenderToggleable { size: const Size(2 * kRadialReactionRadius, 2 * kRadialReactionRadius) ); + @override bool get isInteractive => super.isInteractive && !value; + @override void paint(PaintingContext context, Offset offset) { final Canvas canvas = context.canvas; diff --git a/packages/flutter/lib/src/material/raised_button.dart b/packages/flutter/lib/src/material/raised_button.dart index 3c3decb0d1..424f88de17 100644 --- a/packages/flutter/lib/src/material/raised_button.dart +++ b/packages/flutter/lib/src/material/raised_button.dart @@ -57,11 +57,12 @@ class RaisedButton extends MaterialButton { final int highlightElevation; final int disabledElevation; + @override _RaisedButtonState createState() => new _RaisedButtonState(); } class _RaisedButtonState extends MaterialButtonState { - + @override int get elevation { if (config.enabled) { if (highlight) @@ -72,6 +73,7 @@ class _RaisedButtonState extends MaterialButtonState { } } + @override Color getColor(BuildContext context) { if (config.enabled) { return config.color ?? Theme.of(context).buttonColor; @@ -87,8 +89,8 @@ class _RaisedButtonState extends MaterialButtonState { } } + @override ThemeBrightness getColorBrightness(BuildContext context) { return config.colorBrightness ?? Theme.of(context).brightness; } - } diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart index 954d3decae..c0a6e0aad0 100644 --- a/packages/flutter/lib/src/material/scaffold.dart +++ b/packages/flutter/lib/src/material/scaffold.dart @@ -55,6 +55,7 @@ class _ScaffoldLayout extends MultiChildLayoutDelegate { final EdgeInsets padding; + @override void performLayout(Size size) { BoxConstraints looseConstraints = new BoxConstraints.loose(size); @@ -118,6 +119,7 @@ class _ScaffoldLayout extends MultiChildLayoutDelegate { } } + @override bool shouldRelayout(_ScaffoldLayout oldDelegate) { return padding != oldDelegate.padding; } @@ -133,6 +135,7 @@ class _FloatingActionButtonTransition extends StatefulWidget { final Widget child; + @override _FloatingActionButtonTransitionState createState() => new _FloatingActionButtonTransitionState(); } @@ -140,6 +143,7 @@ class _FloatingActionButtonTransitionState extends State<_FloatingActionButtonTr final AnimationController controller = new AnimationController(duration: _kFloatingActionButtonSegue); Widget oldChild; + @override void initState() { super.initState(); controller.forward().then((_) { @@ -147,11 +151,13 @@ class _FloatingActionButtonTransitionState extends State<_FloatingActionButtonTr }); } + @override void dispose() { controller.stop(); super.dispose(); } + @override void didUpdateConfig(_FloatingActionButtonTransition oldConfig) { if (Widget.canUpdate(oldConfig.child, config.child)) return; @@ -163,6 +169,7 @@ class _FloatingActionButtonTransitionState extends State<_FloatingActionButtonTr }); } + @override Widget build(BuildContext context) { final List children = new List(); if (oldChild != null) { @@ -222,6 +229,7 @@ class Scaffold extends StatefulWidget { /// The state from the closest instance of this class that encloses the given context. static ScaffoldState of(BuildContext context) => context.ancestorStateOfType(const TypeMatcher()); + @override ScaffoldState createState() => new ScaffoldState(); } @@ -363,6 +371,7 @@ class ScaffoldState extends State { // INTERNALS + @override void initState() { super.initState(); _appBarController = new AnimationController(); @@ -374,6 +383,7 @@ class ScaffoldState extends State { } } + @override void dispose() { _appBarController.stop(); _snackBarController?.stop(); @@ -500,6 +510,7 @@ class ScaffoldState extends State { return appBar; } + @override Widget build(BuildContext context) { final EdgeInsets padding = MediaQuery.of(context)?.padding ?? EdgeInsets.zero; @@ -618,6 +629,7 @@ class _PersistentBottomSheet extends StatefulWidget { final VoidCallback onDismissed; final WidgetBuilder builder; + @override _PersistentBottomSheetState createState() => new _PersistentBottomSheetState(); } @@ -626,17 +638,20 @@ class _PersistentBottomSheetState extends State<_PersistentBottomSheet> { // We take ownership of the animation controller given in the first configuration. // We also share control of that animation with out BottomSheet widget. + @override void initState() { super.initState(); assert(config.animationController.status == AnimationStatus.forward); config.animationController.addStatusListener(_handleStatusChange); } + @override void didUpdateConfig(_PersistentBottomSheet oldConfig) { super.didUpdateConfig(oldConfig); assert(config.animationController == oldConfig.animationController); } + @override void dispose() { config.animationController.stop(); super.dispose(); @@ -651,6 +666,7 @@ class _PersistentBottomSheetState extends State<_PersistentBottomSheet> { config.onDismissed(); } + @override Widget build(BuildContext context) { return new AnimatedBuilder( animation: config.animationController, diff --git a/packages/flutter/lib/src/material/scrollbar_painter.dart b/packages/flutter/lib/src/material/scrollbar_painter.dart index 4b89a462f5..5098a62d03 100644 --- a/packages/flutter/lib/src/material/scrollbar_painter.dart +++ b/packages/flutter/lib/src/material/scrollbar_painter.dart @@ -52,6 +52,7 @@ class ScrollbarPainter extends ScrollableListPainter { paintThumb(context, thumbOrigin & thumbSize); } + @override void paint(PaintingContext context, Offset offset) { if (_alpha == 0) return; @@ -60,6 +61,7 @@ class ScrollbarPainter extends ScrollableListPainter { AnimationController _fade; + @override Future scrollStarted() { if (_fade == null) { _fade = new AnimationController(duration: _kScrollbarThumbFadeDuration); @@ -72,10 +74,12 @@ class ScrollbarPainter extends ScrollableListPainter { return _fade.forward(); } + @override Future scrollEnded() { return _fade.reverse(); } + @override void detach() { super.detach(); _fade?.stop(); diff --git a/packages/flutter/lib/src/material/slider.dart b/packages/flutter/lib/src/material/slider.dart index d503380547..252e75dba2 100644 --- a/packages/flutter/lib/src/material/slider.dart +++ b/packages/flutter/lib/src/material/slider.dart @@ -37,6 +37,7 @@ class Slider extends StatelessWidget { onChanged(value * (max - min) + min); } + @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); return new _SliderRenderObjectWidget( @@ -55,12 +56,14 @@ class _SliderRenderObjectWidget extends LeafRenderObjectWidget { final Color activeColor; final ValueChanged onChanged; + @override _RenderSlider createRenderObject(BuildContext context) => new _RenderSlider( value: value, activeColor: activeColor, onChanged: onChanged ); + @override void updateRenderObject(BuildContext context, _RenderSlider renderObject) { renderObject ..value = value @@ -155,13 +158,16 @@ class _RenderSlider extends RenderConstrainedBox { } } + @override bool hitTestSelf(Point position) => true; + @override void handleEvent(PointerEvent event, BoxHitTestEntry entry) { if (event is PointerDownEvent && onChanged != null) _drag.addPointer(event); } + @override void paint(PaintingContext context, Offset offset) { final Canvas canvas = context.canvas; diff --git a/packages/flutter/lib/src/material/snack_bar.dart b/packages/flutter/lib/src/material/snack_bar.dart index 8009da4a96..369776894f 100644 --- a/packages/flutter/lib/src/material/snack_bar.dart +++ b/packages/flutter/lib/src/material/snack_bar.dart @@ -49,6 +49,7 @@ class SnackBarAction extends StatelessWidget { /// The callback to be invoked when the button is pressed. Must be non-null. final VoidCallback onPressed; + @override Widget build(BuildContext context) { return new Container( margin: const EdgeInsets.only(left: _kSideMargins), @@ -86,6 +87,7 @@ class SnackBar extends StatelessWidget { final Duration duration; final Animation animation; + @override Widget build(BuildContext context) { assert(animation != null); List children = [ diff --git a/packages/flutter/lib/src/material/switch.dart b/packages/flutter/lib/src/material/switch.dart index d6d3185eb5..72a94fc33c 100644 --- a/packages/flutter/lib/src/material/switch.dart +++ b/packages/flutter/lib/src/material/switch.dart @@ -21,6 +21,7 @@ class Switch extends StatelessWidget { final Color activeColor; final ValueChanged onChanged; + @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); ThemeData themeData = Theme.of(context); @@ -68,6 +69,7 @@ class _SwitchRenderObjectWidget extends LeafRenderObjectWidget { final Color inactiveTrackColor; final ValueChanged onChanged; + @override _RenderSwitch createRenderObject(BuildContext context) => new _RenderSwitch( value: value, activeColor: activeColor, @@ -77,6 +79,7 @@ class _SwitchRenderObjectWidget extends LeafRenderObjectWidget { onChanged: onChanged ); + @override void updateRenderObject(BuildContext context, _RenderSwitch renderObject) { renderObject ..value = value @@ -165,6 +168,7 @@ class _RenderSwitch extends RenderToggleable { reactionController.reverse(); } + @override void handleEvent(PointerEvent event, BoxHitTestEntry entry) { if (event is PointerDownEvent && onChanged != null) _drag.addPointer(event); @@ -174,6 +178,7 @@ class _RenderSwitch extends RenderToggleable { Color _cachedThumbColor; BoxPainter _thumbPainter; + @override void paint(PaintingContext context, Offset offset) { final Canvas canvas = context.canvas; diff --git a/packages/flutter/lib/src/material/tabs.dart b/packages/flutter/lib/src/material/tabs.dart index 3ed5239cd2..c082a183f9 100644 --- a/packages/flutter/lib/src/material/tabs.dart +++ b/packages/flutter/lib/src/material/tabs.dart @@ -89,11 +89,13 @@ class _RenderTabBar extends RenderBox with } } + @override void setupParentData(RenderBox child) { if (child.parentData is! _TabBarParentData) child.parentData = new _TabBarParentData(); } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { BoxConstraints widthConstraints = new BoxConstraints(maxWidth: constraints.maxWidth, maxHeight: constraints.maxHeight); @@ -109,6 +111,7 @@ class _RenderTabBar extends RenderBox with return constraints.constrainWidth(width); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { BoxConstraints widthConstraints = new BoxConstraints(maxWidth: constraints.maxWidth, maxHeight: constraints.maxHeight); @@ -129,8 +132,10 @@ class _RenderTabBar extends RenderBox with double _getIntrinsicHeight(BoxConstraints constraints) => constraints.constrainHeight(_tabBarHeight); + @override double getMinIntrinsicHeight(BoxConstraints constraints) => _getIntrinsicHeight(constraints); + @override double getMaxIntrinsicHeight(BoxConstraints constraints) => _getIntrinsicHeight(constraints); void layoutFixedWidthTabs() { @@ -194,6 +199,7 @@ class _RenderTabBar extends RenderBox with } } + @override void performLayout() { assert(constraints is BoxConstraints); if (childCount == 0) @@ -211,6 +217,7 @@ class _RenderTabBar extends RenderBox with reportLayoutChangedIfNeeded(); } + @override bool hitTestChildren(HitTestResult result, { Point position }) { return defaultHitTestChildren(result, position: position); } @@ -233,6 +240,7 @@ class _RenderTabBar extends RenderBox with canvas.drawRect((point + offset) & size, new Paint()..color = indicatorColor); } + @override void paint(PaintingContext context, Offset offset) { int index = 0; RenderBox child = firstChild; @@ -265,12 +273,14 @@ class _TabBarWrapper extends MultiChildRenderObjectWidget { final bool isScrollable; final TabLayoutChanged onLayoutChanged; + @override _RenderTabBar createRenderObject(BuildContext context) { _RenderTabBar result = new _RenderTabBar(onLayoutChanged); updateRenderObject(context, result); return result; } + @override void updateRenderObject(BuildContext context, _RenderTabBar renderObject) { renderObject ..selectedIndex = selectedIndex @@ -330,6 +340,7 @@ class _Tab extends StatelessWidget { } } + @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); Widget labelContent; @@ -363,6 +374,7 @@ class _Tab extends StatelessWidget { ); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('$label'); @@ -372,8 +384,10 @@ class _Tab extends StatelessWidget { class _TabsScrollBehavior extends BoundedBehavior { _TabsScrollBehavior(); + @override bool isScrollable = true; + @override Simulation createScrollSimulation(double position, double velocity) { if (!isScrollable) return null; @@ -384,6 +398,7 @@ class _TabsScrollBehavior extends BoundedBehavior { ); } + @override double applyCurve(double scrollOffset, double scrollDelta) { return (isScrollable) ? super.applyCurve(scrollOffset, scrollDelta) : 0.0; } @@ -414,6 +429,7 @@ class TabBarSelection extends StatefulWidget { final ValueChanged onChanged; final Widget child; + @override TabBarSelectionState createState() => new TabBarSelectionState(); static TabBarSelectionState of/**/(BuildContext context) { @@ -436,6 +452,7 @@ class TabBarSelectionState extends State> { _valueToIndex[value] = index++; } + @override void initState() { super.initState(); _value = config.value ?? PageStorage.of(context)?.readState(context) ?? values.first; @@ -449,6 +466,7 @@ class TabBarSelectionState extends State> { _initValueToIndex(); } + @override void didUpdateConfig(TabBarSelection oldConfig) { super.didUpdateConfig(oldConfig); if (values != oldConfig.values) @@ -532,6 +550,7 @@ class TabBarSelectionState extends State> { ..removeListener(listener.handleProgressChange); } + @override void deactivate() { _controller.stop(); for (TabBarSelectionAnimationListener listener in _animationListeners.toList()) { @@ -542,6 +561,7 @@ class TabBarSelectionState extends State> { _writeValue(); } + @override Widget build(BuildContext context) { return config.child; } @@ -564,6 +584,7 @@ class TabBar extends Scrollable { final Map labels; final bool isScrollable; + @override _TabBarState createState() => new _TabBarState(); } @@ -578,27 +599,32 @@ class _TabBarState extends ScrollableState> implements TabBarSelect _selection?.registerAnimationListener(this); } + @override void initState() { super.initState(); scrollBehavior.isScrollable = config.isScrollable; _initSelection(TabBarSelection.of(context)); } + @override void didUpdateConfig(TabBar oldConfig) { super.didUpdateConfig(oldConfig); if (!config.isScrollable) scrollTo(0.0); } + @override void dispose() { _selection?.unregisterAnimationListener(this); super.dispose(); } + @override void handleSelectionDeactivate() { _selection = null; } + @override void handleStatusChange(AnimationStatus status) { if (config.labels.length == 0) return; @@ -614,6 +640,7 @@ class _TabBarState extends ScrollableState> implements TabBarSelect } } + @override void handleProgressChange() { if (config.labels.length == 0 || _selection == null) return; @@ -666,7 +693,10 @@ class _TabBarState extends ScrollableState> implements TabBarSelect return new Rect.fromLTRB(r.left, r.bottom, r.right, r.bottom + _kTabIndicatorHeight); } + @override ScrollBehavior createScrollBehavior() => new _TabsScrollBehavior(); + + @override _TabsScrollBehavior get scrollBehavior => super.scrollBehavior; double _centeredTabScrollOffset(int tabIndex) { @@ -731,6 +761,7 @@ class _TabBarState extends ScrollableState> implements TabBarSelect return scrollOffsetToPixelDelta(scrollOffset); } + @override Widget buildContent(BuildContext context) { TabBarSelectionState newSelection = TabBarSelection.of(context); if (_selection != newSelection) @@ -808,6 +839,7 @@ class TabBarView extends PageableList { assert(children.length > 1); } + @override _TabBarViewState createState() => new _TabBarViewState(); } @@ -820,6 +852,7 @@ class _TabBarViewState extends PageableListState> implements Ta BoundedBehavior _boundedBehavior; + @override ExtentScrollBehavior get scrollBehavior { _boundedBehavior ??= new BoundedBehavior(); return _boundedBehavior; @@ -833,22 +866,26 @@ class _TabBarViewState extends PageableListState> implements Ta } } + @override void initState() { super.initState(); _initSelection(TabBarSelection.of(context)); } + @override void didUpdateConfig(TabBarView oldConfig) { super.didUpdateConfig(oldConfig); if (_selection != null && config.children != oldConfig.children) _updateItemsForSelectedIndex(_selection.index); } + @override void dispose() { _selection?.unregisterAnimationListener(this); super.dispose(); } + @override void handleSelectionDeactivate() { _selection = null; } @@ -888,9 +925,11 @@ class _TabBarViewState extends PageableListState> implements Ta _updateScrollBehaviorForSelectedIndex(selectedIndex); } + @override void handleStatusChange(AnimationStatus status) { } + @override void handleProgressChange() { if (_selection == null || !_selection.valueIsChanging) return; @@ -918,6 +957,7 @@ class _TabBarViewState extends PageableListState> implements Ta } } + @override void dispatchOnScroll() { if (_selection == null || _selection.valueIsChanging) return; @@ -931,6 +971,7 @@ class _TabBarViewState extends PageableListState> implements Ta controller.value = scrollOffset / 2.0; } + @override Future fling(double scrollVelocity) { if (_selection == null || _selection.valueIsChanging) return new Future.value(); @@ -955,6 +996,7 @@ class _TabBarViewState extends PageableListState> implements Ta return settleScrollOffset(); } + @override Widget buildContent(BuildContext context) { TabBarSelectionState newSelection = TabBarSelection.of(context); if (_selection != newSelection) @@ -997,6 +1039,7 @@ class TabPageSelector extends StatelessWidget { ); } + @override Widget build(BuildContext context) { final TabBarSelectionState selection = TabBarSelection.of(context); final Color color = Theme.of(context).accentColor; diff --git a/packages/flutter/lib/src/material/theme.dart b/packages/flutter/lib/src/material/theme.dart index f3c9efe851..45a8eb6ab8 100644 --- a/packages/flutter/lib/src/material/theme.dart +++ b/packages/flutter/lib/src/material/theme.dart @@ -34,8 +34,10 @@ class Theme extends InheritedWidget { return theme?.data ?? _kFallbackTheme; } + @override bool updateShouldNotify(Theme old) => data != old.data; + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('$data'); @@ -46,6 +48,7 @@ class Theme extends InheritedWidget { class ThemeDataTween extends Tween { ThemeDataTween({ ThemeData begin, ThemeData end }) : super(begin: begin, end: end); + @override ThemeData lerp(double t) => ThemeData.lerp(begin, end, t); } @@ -67,18 +70,21 @@ class AnimatedTheme extends AnimatedWidgetBase { final Widget child; + @override _AnimatedThemeState createState() => new _AnimatedThemeState(); } class _AnimatedThemeState extends AnimatedWidgetBaseState { ThemeDataTween _data; + @override void forEachTween(TweenVisitor visitor) { // TODO(ianh): Use constructor tear-offs when it becomes possible _data = visitor(_data, config.data, (dynamic value) => new ThemeDataTween(begin: value)); assert(_data != null); } + @override Widget build(BuildContext context) { return new Theme( child: config.child, @@ -86,6 +92,7 @@ class _AnimatedThemeState extends AnimatedWidgetBaseState { ); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); if (_data != null) diff --git a/packages/flutter/lib/src/material/theme_data.dart b/packages/flutter/lib/src/material/theme_data.dart index 6490dd1163..8e5b25818d 100644 --- a/packages/flutter/lib/src/material/theme_data.dart +++ b/packages/flutter/lib/src/material/theme_data.dart @@ -241,6 +241,7 @@ class ThemeData { ); } + @override bool operator==(Object other) { if (other.runtimeType != runtimeType) return false; @@ -268,6 +269,8 @@ class ThemeData { (otherData.primaryTextTheme == primaryTextTheme) && (otherData.primaryIconTheme == primaryIconTheme); } + + @override int get hashCode { return hashValues( brightness, @@ -297,5 +300,6 @@ class ThemeData { ); } + @override String toString() => '$runtimeType($brightness $primaryColor etc...)'; } diff --git a/packages/flutter/lib/src/material/time_picker.dart b/packages/flutter/lib/src/material/time_picker.dart index bd375538b0..18edbbcc89 100644 --- a/packages/flutter/lib/src/material/time_picker.dart +++ b/packages/flutter/lib/src/material/time_picker.dart @@ -73,6 +73,7 @@ class TimeOfDay { /// The hour at which the current period starts. int get periodOffset => period == DayPeriod.am ? 0 : _kHoursPerPeriod; + @override bool operator ==(dynamic other) { if (other is! TimeOfDay) return false; @@ -81,9 +82,11 @@ class TimeOfDay { && typedOther.minute == minute; } + @override int get hashCode => hashValues(hour, minute); // TODO(ianh): Localize. + @override String toString() => '$hourOfPeriodLabel:$minuteLabel $periodLabel'; } @@ -100,6 +103,7 @@ class TimePicker extends StatefulWidget { final TimeOfDay selectedTime; final ValueChanged onChanged; + @override _TimePickerState createState() => new _TimePickerState(); } @@ -113,6 +117,7 @@ class _TimePickerState extends State { }); } + @override Widget build(BuildContext context) { Widget header = new _TimePickerHeader( selectedTime: config.selectedTime, @@ -167,6 +172,7 @@ class _TimePickerHeader extends StatelessWidget { onChanged(selectedTime.replacing(hour: newHour)); } + @override Widget build(BuildContext context) { ThemeData theme = Theme.of(context); TextTheme headerTheme = theme.primaryTextTheme; @@ -274,6 +280,7 @@ class _DialPainter extends CustomPainter { final Color primaryColor; final double theta; + @override void paint(Canvas canvas, Size size) { double radius = size.shortestSide / 2.0; Offset center = new Offset(size.width / 2.0, size.height / 2.0); @@ -305,6 +312,7 @@ class _DialPainter extends CustomPainter { } } + @override bool shouldRepaint(_DialPainter oldPainter) { return oldPainter.labels != labels || oldPainter.primaryColor != primaryColor @@ -325,10 +333,12 @@ class _Dial extends StatefulWidget { final _TimePickerMode mode; final ValueChanged onChanged; + @override _DialState createState() => new _DialState(); } class _DialState extends State<_Dial> { + @override void initState() { super.initState(); _thetaController = new AnimationController(duration: _kDialAnimateDuration); @@ -339,6 +349,7 @@ class _DialState extends State<_Dial> { ))..addListener(() => setState(() { })); } + @override void didUpdateConfig(_Dial oldConfig) { if (config.mode != oldConfig.mode && !_dragging) _animateTo(_getThetaForTime(config.selectedTime)); @@ -434,6 +445,7 @@ class _DialState extends State<_Dial> { final List _hours = _initHours(); final List _minutes = _initMinutes(); + @override Widget build(BuildContext context) { return new GestureDetector( onPanStart: _handlePanStart, diff --git a/packages/flutter/lib/src/material/time_picker_dialog.dart b/packages/flutter/lib/src/material/time_picker_dialog.dart index b026dfd7c3..3e038b37c2 100644 --- a/packages/flutter/lib/src/material/time_picker_dialog.dart +++ b/packages/flutter/lib/src/material/time_picker_dialog.dart @@ -18,10 +18,12 @@ class _TimePickerDialog extends StatefulWidget { final TimeOfDay initialTime; + @override _TimePickerDialogState createState() => new _TimePickerDialogState(); } class _TimePickerDialogState extends State<_TimePickerDialog> { + @override void initState() { super.initState(); _selectedTime = config.initialTime; @@ -43,6 +45,7 @@ class _TimePickerDialogState extends State<_TimePickerDialog> { Navigator.pop(context, _selectedTime); } + @override Widget build(BuildContext context) { return new Dialog( content: new TimePicker( diff --git a/packages/flutter/lib/src/material/toggleable.dart b/packages/flutter/lib/src/material/toggleable.dart index b48cd52ce0..1260701f33 100644 --- a/packages/flutter/lib/src/material/toggleable.dart +++ b/packages/flutter/lib/src/material/toggleable.dart @@ -148,8 +148,10 @@ abstract class RenderToggleable extends RenderConstrainedBox implements Semantic _reactionController.reverse(); } + @override bool hitTestSelf(Point position) => true; + @override void handleEvent(PointerEvent event, BoxHitTestEntry entry) { if (event is PointerDownEvent && isInteractive) _tap.addPointer(event); @@ -163,7 +165,10 @@ abstract class RenderToggleable extends RenderConstrainedBox implements Semantic } } + @override bool get hasSemantics => isInteractive; + + @override Iterable getSemanticAnnotators() sync* { yield (SemanticsNode semantics) { semantics.hasCheckedState = true; @@ -171,11 +176,22 @@ abstract class RenderToggleable extends RenderConstrainedBox implements Semantic semantics.canBeTapped = isInteractive; }; } + + @override void handleSemanticTap() => _handleTap(); + @override void handleSemanticLongPress() { } + + @override void handleSemanticScrollLeft() { } + + @override void handleSemanticScrollRight() { } + + @override void handleSemanticScrollUp() { } + + @override void handleSemanticScrollDown() { } } diff --git a/packages/flutter/lib/src/material/tooltip.dart b/packages/flutter/lib/src/material/tooltip.dart index 520ef671b1..fe7a3c55c6 100644 --- a/packages/flutter/lib/src/material/tooltip.dart +++ b/packages/flutter/lib/src/material/tooltip.dart @@ -64,8 +64,10 @@ class Tooltip extends StatefulWidget { final Duration showDuration; final Widget child; + @override _TooltipState createState() => new _TooltipState(); + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('"$message"'); @@ -80,6 +82,7 @@ class _TooltipState extends State { OverlayEntry _entry; Timer _timer; + @override void initState() { super.initState(); _controller = new AnimationController(duration: config.fadeDuration) @@ -102,6 +105,7 @@ class _TooltipState extends State { }); } + @override void didUpdateConfig(Tooltip oldConfig) { super.didUpdateConfig(oldConfig); if (config.fadeDuration != oldConfig.fadeDuration) @@ -169,12 +173,14 @@ class _TooltipState extends State { _controller.reverse(); } + @override void deactivate() { if (_entry != null) hideTooltip(); super.deactivate(); } + @override Widget build(BuildContext context) { assert(Overlay.of(context, debugRequiredFor: config) != null); return new GestureDetector( @@ -201,8 +207,10 @@ class _TooltipPositionDelegate extends SingleChildLayoutDelegate { final EdgeInsets screenEdgeMargin; final bool preferBelow; + @override BoxConstraints getConstraintsForChild(BoxConstraints constraints) => constraints.loosen(); + @override Offset getPositionForChild(Size size, Size childSize) { // VERTICAL DIRECTION final bool fitsBelow = target.y + verticalOffset + childSize.height <= size.height - screenEdgeMargin.bottom; @@ -226,6 +234,7 @@ class _TooltipPositionDelegate extends SingleChildLayoutDelegate { return new Offset(x, y); } + @override bool shouldRelayout(_TooltipPositionDelegate oldDelegate) { return target != target || verticalOffset != verticalOffset @@ -264,6 +273,7 @@ class _TooltipOverlay extends StatelessWidget { final EdgeInsets screenEdgeMargin; final bool preferBelow; + @override Widget build(BuildContext context) { return new Positioned( top: 0.0, diff --git a/packages/flutter/lib/src/material/two_level_list.dart b/packages/flutter/lib/src/material/two_level_list.dart index 15e7237da1..e8946c4e1e 100644 --- a/packages/flutter/lib/src/material/two_level_list.dart +++ b/packages/flutter/lib/src/material/two_level_list.dart @@ -32,6 +32,7 @@ class TwoLevelListItem extends StatelessWidget { final GestureTapCallback onTap; final GestureLongPressCallback onLongPress; + @override Widget build(BuildContext context) { final TwoLevelList parentList = context.ancestorWidgetOfExactType(TwoLevelList); assert(parentList != null); @@ -56,6 +57,7 @@ class TwoLevelSublist extends StatefulWidget { final Widget title; final List children; + @override _TwoLevelSublistState createState() => new _TwoLevelSublistState(); } @@ -70,6 +72,7 @@ class _TwoLevelSublistState extends State { bool _isExpanded = false; + @override void initState() { super.initState(); _controller = new AnimationController(duration: _kExpand); @@ -132,6 +135,7 @@ class _TwoLevelSublistState extends State { ); } + @override Widget build(BuildContext context) { final ThemeData theme = Theme.of(context); _borderColor.end = theme.dividerColor; @@ -155,5 +159,6 @@ class TwoLevelList extends StatelessWidget { final List items; final MaterialListType type; + @override Widget build(BuildContext context) => new Block(children: items); } diff --git a/packages/flutter/lib/src/painting/box_painter.dart b/packages/flutter/lib/src/painting/box_painter.dart index 13a3946359..4b382a7382 100644 --- a/packages/flutter/lib/src/painting/box_painter.dart +++ b/packages/flutter/lib/src/painting/box_painter.dart @@ -48,6 +48,7 @@ class BorderSide { ); } + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -58,8 +59,10 @@ class BorderSide { width == typedOther.width; } + @override int get hashCode => hashValues(color, width); + @override String toString() => 'BorderSide($color, $width)'; } @@ -122,6 +125,7 @@ class Border { ); } + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -134,8 +138,10 @@ class Border { left == typedOther.left; } + @override int get hashCode => hashValues(top, right, bottom, left); + @override String toString() => 'Border($top, $right, $bottom, $left)'; } @@ -218,6 +224,7 @@ class BoxShadow { return result; } + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -230,8 +237,10 @@ class BoxShadow { spreadRadius == typedOther.spreadRadius; } + @override int get hashCode => hashValues(color, offset, blurRadius, spreadRadius); + @override String toString() => 'BoxShadow($color, $offset, $blurRadius, $spreadRadius)'; } @@ -287,6 +296,7 @@ class LinearGradient extends Gradient { /// How this gradient should tile the plane. final TileMode tileMode; + @override Shader createShader(Rect rect) { return new ui.Gradient.linear( [_offsetToPoint(begin, rect), _offsetToPoint(end, rect)], @@ -294,6 +304,7 @@ class LinearGradient extends Gradient { ); } + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -325,8 +336,10 @@ class LinearGradient extends Gradient { return true; } + @override int get hashCode => hashValues(begin, end, tileMode, hashList(colors), hashList(stops)); + @override String toString() { return 'LinearGradient($begin, $end, $colors, $stops, $tileMode)'; } @@ -373,6 +386,7 @@ class RadialGradient extends Gradient { /// How this gradient should tile the plane. final TileMode tileMode; + @override Shader createShader(Rect rect) { return new ui.Gradient.radial( _offsetToPoint(center, rect), @@ -381,6 +395,7 @@ class RadialGradient extends Gradient { ); } + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -412,8 +427,10 @@ class RadialGradient extends Gradient { return true; } + @override int get hashCode => hashValues(center, radius, tileMode, hashList(colors), hashList(stops)); + @override String toString() { return 'RadialGradient($center, $radius, $colors, $stops, $tileMode)'; } @@ -595,9 +612,12 @@ void paintImage({ /// FractionalOffset(0.0, 1.0) represents the bottom left of the Size, class FractionalOffset { const FractionalOffset(this.dx, this.dy); + final double dx; final double dy; + static const FractionalOffset zero = const FractionalOffset(0.0, 0.0); + FractionalOffset operator -() { return new FractionalOffset(-dx, -dy); } @@ -625,6 +645,8 @@ class FractionalOffset { Offset alongSize(Size other) { return new Offset(dx * other.width, dy * other.height); } + + @override bool operator ==(dynamic other) { if (other is! FractionalOffset) return false; @@ -632,6 +654,8 @@ class FractionalOffset { return dx == typedOther.dx && dy == typedOther.dy; } + + @override int get hashCode => hashValues(dx, dy); static FractionalOffset lerp(FractionalOffset a, FractionalOffset b, double t) { if (a == null && b == null) @@ -642,6 +666,8 @@ class FractionalOffset { return new FractionalOffset(b.dx * (1.0 - t), b.dy * (1.0 - t)); return new FractionalOffset(ui.lerpDouble(a.dx, b.dx, t), ui.lerpDouble(a.dy, b.dy, t)); } + + @override String toString() => '$runtimeType($dx, $dy)'; } @@ -719,6 +745,7 @@ class BackgroundImage { listener(); } + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -733,8 +760,10 @@ class BackgroundImage { _imageResource == typedOther._imageResource; } + @override int get hashCode => hashValues(fit, repeat, centerSlice, colorFilter, alignment, _imageResource); + @override String toString() => 'BackgroundImage($fit, $repeat)'; } @@ -764,6 +793,7 @@ class BoxDecoration extends Decoration { this.shape: BoxShape.rectangle }); + @override bool debugAssertValid() { assert(shape != BoxShape.circle || borderRadius == null); // Can't have a border radius if you're a circle. @@ -797,6 +827,7 @@ class BoxDecoration extends Decoration { final BoxShape shape; /// The inset space occupied by the border. + @override EdgeInsets get padding => border?.dimensions; /// Returns a new box decoration that is scaled by the given factor. @@ -835,18 +866,21 @@ class BoxDecoration extends Decoration { ); } + @override BoxDecoration lerpFrom(Decoration a, double t) { if (a is! BoxDecoration) return BoxDecoration.lerp(null, this, t); return BoxDecoration.lerp(a, this, t); } + @override BoxDecoration lerpTo(Decoration b, double t) { if (b is! BoxDecoration) return BoxDecoration.lerp(this, null, t); return BoxDecoration.lerp(this, b, t); } + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -862,6 +896,7 @@ class BoxDecoration extends Decoration { shape == typedOther.shape; } + @override int get hashCode { return hashValues( backgroundColor, @@ -877,6 +912,7 @@ class BoxDecoration extends Decoration { /// Stringifies the BoxDecoration. By default, the output will be on one line. /// If the method is passed a non-empty string argument, then the output will /// span multiple lines, each prefixed by that argument. + @override String toString([String prefix = '']) { List result = []; if (backgroundColor != null) @@ -900,11 +936,15 @@ class BoxDecoration extends Decoration { return result.join('\n'); } + @override bool get needsListeners => backgroundImage != null; + @override void addChangeListener(VoidCallback listener) { backgroundImage?._addChangeListener(listener); } + + @override void removeChangeListener(VoidCallback listener) { backgroundImage?._removeChangeListener(listener); } @@ -917,6 +957,7 @@ class BoxDecoration extends Decoration { return borderRadius > shortestSide ? shortestSide : borderRadius; } + @override bool hitTest(Size size, Point position) { assert(shape != null); assert((Point.origin & size).contains(position)); @@ -935,6 +976,7 @@ class BoxDecoration extends Decoration { } } + @override _BoxDecorationPainter createBoxPainter() => new _BoxDecorationPainter(this); } @@ -1136,6 +1178,7 @@ class _BoxDecorationPainter extends BoxPainter { } /// Paint the box decoration into the given location on the given canvas + @override void paint(Canvas canvas, Rect rect) { _paintShadows(canvas, rect); _paintBackgroundColor(canvas, rect); diff --git a/packages/flutter/lib/src/painting/colors.dart b/packages/flutter/lib/src/painting/colors.dart index 66b2042bb6..0aee0488a5 100644 --- a/packages/flutter/lib/src/painting/colors.dart +++ b/packages/flutter/lib/src/painting/colors.dart @@ -101,6 +101,7 @@ class HSVColor { ); } + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -113,7 +114,9 @@ class HSVColor { && typedOther.value == value; } + @override int get hashCode => hashValues(alpha, hue, saturation, value); + @override String toString() => "HSVColor($alpha, $hue, $saturation, $value)"; } diff --git a/packages/flutter/lib/src/painting/decoration.dart b/packages/flutter/lib/src/painting/decoration.dart index 8600aa674c..786534308d 100644 --- a/packages/flutter/lib/src/painting/decoration.dart +++ b/packages/flutter/lib/src/painting/decoration.dart @@ -20,6 +20,8 @@ abstract class Decoration { void addChangeListener(VoidCallback listener) { assert(false); } void removeChangeListener(VoidCallback listener) { assert(false); } BoxPainter createBoxPainter(); + + @override String toString([String prefix = '']) => '$prefix$runtimeType'; } diff --git a/packages/flutter/lib/src/painting/edge_insets.dart b/packages/flutter/lib/src/painting/edge_insets.dart index 767ea68fe7..b3c914cf87 100644 --- a/packages/flutter/lib/src/painting/edge_insets.dart +++ b/packages/flutter/lib/src/painting/edge_insets.dart @@ -135,6 +135,7 @@ class EdgeInsets { /// An EdgeInsets with zero offsets in each direction. static const EdgeInsets zero = const EdgeInsets.TRBL(0.0, 0.0, 0.0, 0.0); + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -147,7 +148,9 @@ class EdgeInsets { left == typedOther.left; } + @override int get hashCode => hashValues(top, left, bottom, right); + @override String toString() => "EdgeInsets($top, $right, $bottom, $left)"; } diff --git a/packages/flutter/lib/src/painting/text_editing.dart b/packages/flutter/lib/src/painting/text_editing.dart index e1c50dd354..8776902fa9 100644 --- a/packages/flutter/lib/src/painting/text_editing.dart +++ b/packages/flutter/lib/src/painting/text_editing.dart @@ -51,6 +51,7 @@ class TextRange { return text.substring(start, end); } + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -61,11 +62,13 @@ class TextRange { && typedOther.end == end; } + @override int get hashCode => hashValues( start.hashCode, end.hashCode ); + @override String toString() => 'TextRange(start: $start, end: $end)'; } @@ -136,10 +139,12 @@ class TextSelection extends TextRange { /// Might be larger than, smaller than, or equal to base. TextPosition get extent => new TextPosition(offset: extentOffset, affinity: affinity); + @override String toString() { return '$runtimeType(baseOffset: $baseOffset, extentOffset: $extentOffset, affinity: $affinity, isDirectional: $isDirectional)'; } + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -152,6 +157,7 @@ class TextSelection extends TextRange { && typedOther.isDirectional == isDirectional; } + @override int get hashCode => hashValues( baseOffset.hashCode, extentOffset.hashCode, diff --git a/packages/flutter/lib/src/painting/text_painter.dart b/packages/flutter/lib/src/painting/text_painter.dart index 248ef9c100..f42390c2f8 100644 --- a/packages/flutter/lib/src/painting/text_painter.dart +++ b/packages/flutter/lib/src/painting/text_painter.dart @@ -113,6 +113,7 @@ class TextSpan { return buffer.toString(); } + @override String toString([String prefix = '']) { StringBuffer buffer = new StringBuffer(); buffer.writeln('$prefix$runtimeType:'); @@ -158,6 +159,7 @@ class TextSpan { return true; } + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -169,6 +171,8 @@ class TextSpan { && typedOther.recognizer == recognizer && _deepEquals(typedOther.children, children); } + + @override int get hashCode => hashValues(style, text, recognizer, hashList(children)); } diff --git a/packages/flutter/lib/src/painting/text_style.dart b/packages/flutter/lib/src/painting/text_style.dart index b832214aa7..8f280713cc 100644 --- a/packages/flutter/lib/src/painting/text_style.dart +++ b/packages/flutter/lib/src/painting/text_style.dart @@ -176,6 +176,7 @@ class TextStyle { ); } + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -198,6 +199,7 @@ class TextStyle { decorationStyle == typedOther.decorationStyle; } + @override int get hashCode { return hashValues( inherit, @@ -217,6 +219,7 @@ class TextStyle { ); } + @override String toString([String prefix = '']) { List result = []; result.add('${prefix}inherit: $inherit'); diff --git a/packages/flutter/lib/src/rendering/auto_layout.dart b/packages/flutter/lib/src/rendering/auto_layout.dart index d1aff44bca..fd8793f8b8 100644 --- a/packages/flutter/lib/src/rendering/auto_layout.dart +++ b/packages/flutter/lib/src/rendering/auto_layout.dart @@ -179,6 +179,7 @@ class RenderAutoLayout extends RenderBox _explicitConstraints.clear(); } + @override void adoptChild(RenderObject child) { // Make sure to call super first to setup the parent data super.adoptChild(child); @@ -187,6 +188,7 @@ class RenderAutoLayout extends RenderBox assert(child.parentData == childParentData); } + @override void dropChild(RenderObject child) { final AutoLayoutParentData childParentData = child.parentData; childParentData._removeImplicitConstraints(); @@ -194,19 +196,23 @@ class RenderAutoLayout extends RenderBox super.dropChild(child); } + @override void setupParentData(RenderObject child) { if (child.parentData is! AutoLayoutParentData) child.parentData = new AutoLayoutParentData(child); } + @override bool get sizedByParent => true; + @override void performResize() { size = constraints.biggest; } Size _previousSize; + @override void performLayout() { bool needToFlushUpdates = false; @@ -241,10 +247,12 @@ class RenderAutoLayout extends RenderBox } } + @override bool hitTestChildren(HitTestResult result, { Point position }) { return defaultHitTestChildren(result, position: position); } + @override void paint(PaintingContext context, Offset offset) { defaultPaint(context, offset); } diff --git a/packages/flutter/lib/src/rendering/binding.dart b/packages/flutter/lib/src/rendering/binding.dart index 8fddbf5ce9..41d230735a 100644 --- a/packages/flutter/lib/src/rendering/binding.dart +++ b/packages/flutter/lib/src/rendering/binding.dart @@ -22,6 +22,7 @@ export 'package:flutter/gestures.dart' show HitTestResult; abstract class Renderer extends Object with Scheduler, Services implements HitTestable { + @override void initInstances() { super.initInstances(); _instance = this; @@ -90,6 +91,7 @@ abstract class Renderer extends Object with Scheduler, Services } } + @override void hitTest(HitTestResult result, Point position) { assert(renderView != null); renderView.hitTest(result, position: position); diff --git a/packages/flutter/lib/src/rendering/block.dart b/packages/flutter/lib/src/rendering/block.dart index a7b9090e97..834e8ff764 100644 --- a/packages/flutter/lib/src/rendering/block.dart +++ b/packages/flutter/lib/src/rendering/block.dart @@ -39,12 +39,14 @@ abstract class RenderBlockBase extends RenderBox addAll(children); } + @override void setupParentData(RenderBox child) { if (child.parentData is! BlockParentData) child.parentData = new BlockParentData(); } /// The direction to use as the main axis. + @override Axis get mainAxis => _mainAxis; Axis _mainAxis; void set mainAxis (Axis value) { @@ -95,6 +97,7 @@ abstract class RenderBlockBase extends RenderBox math.max(minExtent, parentData.offset.dx + child.size.width); } + @override void performLayout() { BoxConstraints innerConstraints = _getInnerConstraints(constraints); double position = 0.0; @@ -113,6 +116,7 @@ abstract class RenderBlockBase extends RenderBox assert(!size.isInfinite); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('mainAxis: $mainAxis'); @@ -156,6 +160,7 @@ class RenderBlock extends RenderBlockBase { return constrainer(math.max(extent, minExtent)); } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (isVertical) { @@ -168,6 +173,7 @@ class RenderBlock extends RenderBlockBase { return _getIntrinsicMainAxis(constraints, constraints.constrainWidth); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (isVertical) { @@ -180,6 +186,7 @@ class RenderBlock extends RenderBlockBase { return _getIntrinsicMainAxis(constraints, constraints.constrainWidth); } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (isVertical) @@ -191,6 +198,7 @@ class RenderBlock extends RenderBlockBase { ); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (isVertical) @@ -202,10 +210,12 @@ class RenderBlock extends RenderBlockBase { ); } + @override double computeDistanceToActualBaseline(TextBaseline baseline) { return defaultComputeDistanceToFirstActualBaseline(baseline); } + @override void performLayout() { assert((isVertical ? constraints.maxHeight >= double.INFINITY : constraints.maxWidth >= double.INFINITY) && 'RenderBlock does not clip or resize its children, so it must be placed in a parent that does not constrain ' @@ -213,10 +223,12 @@ class RenderBlock extends RenderBlockBase { super.performLayout(); } + @override void paint(PaintingContext context, Offset offset) { defaultPaint(context, offset); } + @override bool hitTestChildren(HitTestResult result, { Point position }) { return defaultHitTestChildren(result, position: position); } @@ -254,6 +266,8 @@ class RenderBlockViewport extends RenderBlockBase { super(children: children, mainAxis: mainAxis, itemExtent: itemExtent, minExtent: minExtent); bool _inCallback = false; + + @override bool get isRepaintBoundary => true; /// Called during [layout] to determine the block's children. @@ -322,11 +336,13 @@ class RenderBlockViewport extends RenderBlockBase { markNeedsPaint(); } + @override void attach() { super.attach(); _overlayPainter?.attach(this); } + @override void detach() { super.detach(); _overlayPainter?.detach(); @@ -366,6 +382,7 @@ class RenderBlockViewport extends RenderBlockBase { return result; } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (isVertical) @@ -373,6 +390,7 @@ class RenderBlockViewport extends RenderBlockBase { return constraints.constrainWidth(minExtent); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (isVertical) @@ -380,6 +398,7 @@ class RenderBlockViewport extends RenderBlockBase { return _getIntrinsicDimension(constraints, totalExtentCallback, new BoxConstraints(minWidth: minExtent).enforce(constraints).constrainWidth); } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (!isVertical) @@ -387,6 +406,7 @@ class RenderBlockViewport extends RenderBlockBase { return constraints.constrainHeight(0.0); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (!isVertical) @@ -399,6 +419,7 @@ class RenderBlockViewport extends RenderBlockBase { // scroll the RenderBlockViewport, it would shift in its parent if // the parent was baseline-aligned, which makes no sense. + @override void performLayout() { if (_callback != null) { try { @@ -422,10 +443,12 @@ class RenderBlockViewport extends RenderBlockBase { overlayPainter?.paint(context, offset); } + @override void paint(PaintingContext context, Offset offset) { context.pushClipRect(needsCompositing, offset, Point.origin & size, _paintContents); } + @override void applyPaintTransform(RenderBox child, Matrix4 transform) { if (isVertical) transform.translate(0.0, startOffset); @@ -434,8 +457,10 @@ class RenderBlockViewport extends RenderBlockBase { super.applyPaintTransform(child, transform); } + @override Rect describeApproximatePaintClip(RenderObject child) => Point.origin & size; + @override bool hitTestChildren(HitTestResult result, { Point position }) { if (isVertical) return defaultHitTestChildren(result, position: position + new Offset(0.0, -startOffset)); @@ -443,6 +468,7 @@ class RenderBlockViewport extends RenderBlockBase { return defaultHitTestChildren(result, position: position + new Offset(-startOffset, 0.0)); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('startOffset: $startOffset'); diff --git a/packages/flutter/lib/src/rendering/box.dart b/packages/flutter/lib/src/rendering/box.dart index caf8111628..6af4b766a9 100644 --- a/packages/flutter/lib/src/rendering/box.dart +++ b/packages/flutter/lib/src/rendering/box.dart @@ -211,6 +211,7 @@ class BoxConstraints extends Constraints { bool get hasTightHeight => minHeight >= maxHeight; /// Whether there is exactly one size that satifies the constraints. + @override bool get isTight => hasTightWidth && hasTightHeight; /// Whether there is an upper bound on the maximum width. @@ -293,6 +294,7 @@ class BoxConstraints extends Constraints { /// normalized and have undefined behavior when they are not. In /// checked mode, many of these APIs will assert if the constraints /// are not normalized. + @override bool get isNormalized { return minWidth >= 0.0 && minWidth <= maxWidth && @@ -300,6 +302,7 @@ class BoxConstraints extends Constraints { minHeight <= maxHeight; } + @override bool get debugAssertIsNormalized { assert(() { if (minWidth < 0.0 && minHeight < 0.0) @@ -328,6 +331,7 @@ class BoxConstraints extends Constraints { ); } + @override bool operator ==(dynamic other) { assert(debugAssertIsNormalized); if (identical(this, other)) @@ -342,11 +346,13 @@ class BoxConstraints extends Constraints { maxHeight == typedOther.maxHeight; } + @override int get hashCode { assert(debugAssertIsNormalized); return hashValues(minWidth, maxWidth, minHeight, maxHeight); } + @override String toString() { String annotation = isNormalized ? '' : '; NOT NORMALIZED'; if (minWidth == double.INFINITY && minHeight == double.INFINITY) @@ -369,11 +375,13 @@ class BoxConstraints extends Constraints { class BoxHitTestEntry extends HitTestEntry { const BoxHitTestEntry(RenderBox target, this.localPosition) : super(target); + @override RenderBox get target => super.target; /// The position of the hit test in the local coordinates of [target]. final Point localPosition; + @override String toString() => '${target.runtimeType}@$localPosition'; } @@ -387,6 +395,7 @@ class BoxParentData extends ParentData { _offset = value; } + @override String toString() => 'offset=$offset'; } @@ -413,7 +422,7 @@ abstract class ContainerBoxParentDataMixin exten /// width value (and pass true for parentUsesSize). After the child determines /// its height, use the child's height to determine your size. abstract class RenderBox extends RenderObject { - + @override void setupParentData(RenderObject child) { if (child.parentData is! BoxParentData) child.parentData = new BoxParentData(); @@ -512,8 +521,10 @@ abstract class RenderBox extends RenderObject { assert(() { debugAssertDoesMeetConstraints(); return true; }); } + @override Rect get semanticBounds => Point.origin & size; + @override void debugResetSize() { // updates the value of size._canBeUsedByParent if necessary size = size; @@ -593,7 +604,10 @@ abstract class RenderBox extends RenderObject { } /// The box constraints most recently received from the parent. + @override BoxConstraints get constraints => super.constraints; + + @override void debugAssertDoesMeetConstraints() { assert(constraints != null); assert(_size != null); @@ -681,6 +695,7 @@ abstract class RenderBox extends RenderObject { } } + @override void markNeedsLayout() { if (_cachedBaselines != null && _cachedBaselines.isNotEmpty) { // if we have cached data, then someone must have used our data @@ -699,11 +714,15 @@ abstract class RenderBox extends RenderObject { } super.markNeedsLayout(); } + + @override void performResize() { // default behavior for subclasses that have sizedByParent = true size = constraints.constrain(Size.zero); assert(!size.isInfinite); } + + @override void performLayout() { assert(() { if (!sizedByParent) { @@ -759,6 +778,7 @@ abstract class RenderBox extends RenderObject { /// /// The RenderBox implementation takes care of adjusting the matrix for the /// position of the given child. + @override void applyPaintTransform(RenderObject child, Matrix4 transform) { assert(child.parent == this); BoxParentData childParentData = child.parentData; @@ -811,9 +831,12 @@ abstract class RenderBox extends RenderObject { /// can lead to undefined behavior. /// /// The returned paint bounds are in the local coordinate system of this box. + @override Rect get paintBounds => Point.origin & size; int _debugActivePointers = 0; + + @override void handleEvent(PointerEvent event, HitTestEntry entry) { super.handleEvent(event, entry); assert(() { @@ -829,6 +852,7 @@ abstract class RenderBox extends RenderObject { }); } + @override void debugPaint(PaintingContext context, Offset offset) { assert(() { if (debugPaintSizeEnabled) @@ -888,6 +912,7 @@ abstract class RenderBox extends RenderObject { }); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('size: ${ hasSize ? size : "MISSING" }'); @@ -974,5 +999,6 @@ abstract class RenderBoxContainerDefaultsMixin { FractionalOffsetTween({ FractionalOffset begin, FractionalOffset end }) : super(begin: begin, end: end); + @override FractionalOffset lerp(double t) => FractionalOffset.lerp(begin, end, t); } diff --git a/packages/flutter/lib/src/rendering/child_view.dart b/packages/flutter/lib/src/rendering/child_view.dart index ca61732767..94c7784622 100644 --- a/packages/flutter/lib/src/rendering/child_view.dart +++ b/packages/flutter/lib/src/rendering/child_view.dart @@ -170,25 +170,32 @@ class RenderChildView extends RenderBox { markNeedsLayout(); } + @override void attach() { super.attach(); _child?._attach(); } + @override void detach() { _child?._detach(); super.detach(); } + @override bool get alwaysNeedsCompositing => true; + + @override bool get sizedByParent => true; + @override void performResize() { size = constraints.biggest; } TextPainter _debugErrorMessage; + @override void performLayout() { if (_child != null) { _child._layout(size: size, scale: scale).then(_handleLayoutInfoChanged); @@ -215,8 +222,10 @@ class RenderChildView extends RenderBox { markNeedsPaint(); } + @override bool hitTestSelf(Point position) => true; + @override void paint(PaintingContext context, Offset offset) { assert(needsCompositing); if (_layoutInfo != null) @@ -230,6 +239,7 @@ class RenderChildView extends RenderBox { }); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('child: $child'); diff --git a/packages/flutter/lib/src/rendering/custom_layout.dart b/packages/flutter/lib/src/rendering/custom_layout.dart index d5d0608af6..605a120792 100644 --- a/packages/flutter/lib/src/rendering/custom_layout.dart +++ b/packages/flutter/lib/src/rendering/custom_layout.dart @@ -12,6 +12,7 @@ class MultiChildLayoutParentData extends ContainerBoxParentDataMixin /// An object representing the identity of this child. Object id; + @override String toString() => '${super.toString()}; id=$id'; } @@ -191,6 +192,7 @@ abstract class MultiChildLayoutDelegate { /// debugging data printed by [debugDumpRenderTree] and friends. /// /// By default, returns the [runtimeType] of the class. + @override String toString() => '$runtimeType'; } @@ -211,6 +213,7 @@ class RenderCustomMultiChildLayoutBox extends RenderBox addAll(children); } + @override void setupParentData(RenderBox child) { if (child.parentData is! MultiChildLayoutParentData) child.parentData = new MultiChildLayoutParentData(); @@ -233,31 +236,38 @@ class RenderCustomMultiChildLayoutBox extends RenderBox return constraints.constrain(_delegate.getSize(constraints)); } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { return _getSize(constraints).width; } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { return _getSize(constraints).width; } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { return _getSize(constraints).height; } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { return _getSize(constraints).height; } + @override void performLayout() { size = _getSize(constraints); delegate._callPerformLayout(size, firstChild); } + @override void paint(PaintingContext context, Offset offset) { defaultPaint(context, offset); } + @override bool hitTestChildren(HitTestResult result, { Point position }) { return defaultHitTestChildren(result, position: position); } diff --git a/packages/flutter/lib/src/rendering/editable_line.dart b/packages/flutter/lib/src/rendering/editable_line.dart index 4c07836c36..013e7e9408 100644 --- a/packages/flutter/lib/src/rendering/editable_line.dart +++ b/packages/flutter/lib/src/rendering/editable_line.dart @@ -131,29 +131,36 @@ class RenderEditableLine extends RenderBox { return _layoutTemplate.height; } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return constraints.constrainWidth(0.0); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return constraints.constrainWidth(0.0); } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return constraints.constrainHeight(_preferredHeight); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return constraints.constrainHeight(_preferredHeight); } + @override bool hitTestSelf(Point position) => true; TapGestureRecognizer _tap; + + @override void handleEvent(PointerEvent event, BoxHitTestEntry entry) { if (event is PointerDownEvent && onSelectionChanged != null) _tap.addPointer(event); @@ -201,6 +208,7 @@ class RenderEditableLine extends RenderBox { Rect _caretPrototype; + @override void performLayout() { Size oldSize = hasSize ? size : null; size = new Size(constraints.maxWidth, constraints.constrainHeight(_preferredHeight)); @@ -250,6 +258,7 @@ class RenderEditableLine extends RenderBox { bool get _hasVisualOverflow => _contentSize.width > size.width; + @override void paint(PaintingContext context, Offset offset) { if (_hasVisualOverflow) context.pushClipRect(needsCompositing, offset, Point.origin & size, _paintContents); @@ -257,5 +266,6 @@ class RenderEditableLine extends RenderBox { _paintContents(context, offset); } + @override Rect describeApproximatePaintClip(RenderObject child) => _hasVisualOverflow ? Point.origin & size : null; } diff --git a/packages/flutter/lib/src/rendering/error.dart b/packages/flutter/lib/src/rendering/error.dart index e6c3d00258..a86be469f6 100644 --- a/packages/flutter/lib/src/rendering/error.dart +++ b/packages/flutter/lib/src/rendering/error.dart @@ -53,26 +53,33 @@ class RenderErrorBox extends RenderBox { ui.Paragraph _paragraph; + @override double getMinIntrinsicWidth(BoxConstraints constraints) { return constraints.constrainWidth(0.0); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { return constraints.constrainWidth(_kMaxWidth); } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { return constraints.constrainHeight(0.0); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { return constraints.constrainHeight(_kMaxHeight); } + @override bool get sizedByParent => true; + @override bool hitTestSelf(Point position) => true; + @override void performResize() { size = constraints.constrain(const Size(_kMaxWidth, _kMaxHeight)); } @@ -92,6 +99,7 @@ class RenderErrorBox extends RenderBox { lineHeight: 0.25 // TODO(ianh): https://github.com/flutter/flutter/issues/2460 will affect this ); + @override void paint(PaintingContext context, Offset offset) { try { context.canvas.drawRect(offset & size, new Paint() .. color = backgroundColor); diff --git a/packages/flutter/lib/src/rendering/flex.dart b/packages/flutter/lib/src/rendering/flex.dart index 6a2057363a..05c8a5bb80 100644 --- a/packages/flutter/lib/src/rendering/flex.dart +++ b/packages/flutter/lib/src/rendering/flex.dart @@ -17,6 +17,7 @@ class FlexParentData extends ContainerBoxParentDataMixin { /// according to the flex factors of the flexible children. int flex; + @override String toString() => '${super.toString()}; flex=$flex'; } @@ -134,6 +135,7 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin child.getMaxIntrinsicHeight(innerConstraints)); } + @override double computeDistanceToActualBaseline(TextBaseline baseline) { if (_direction == FlexDirection.horizontal) return defaultComputeDistanceToHighestActualBaseline(baseline); @@ -328,6 +335,7 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin _overflow > 0.0 ? Point.origin & size : null; + @override String toString() { String header = super.toString(); if (_overflow is double && _overflow > 0.0) @@ -592,6 +604,7 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin description) { super.debugFillDescription(description); description.add('direction: $_direction'); diff --git a/packages/flutter/lib/src/rendering/grid.dart b/packages/flutter/lib/src/rendering/grid.dart index 6ded3dbae4..ebaa929f31 100644 --- a/packages/flutter/lib/src/rendering/grid.dart +++ b/packages/flutter/lib/src/rendering/grid.dart @@ -205,6 +205,7 @@ abstract class GridDelegateWithInOrderChildPlacement extends GridDelegate { // Insets for the entire grid. final EdgeInsets padding; + @override GridChildPlacement getChildPlacement(GridSpecification specification, int index, Object placementData) { final int columnCount = specification.columnOffsets.length - 1; return new GridChildPlacement( @@ -213,6 +214,7 @@ abstract class GridDelegateWithInOrderChildPlacement extends GridDelegate { ); } + @override bool shouldRelayout(GridDelegateWithInOrderChildPlacement oldDelegate) { return columnSpacing != oldDelegate.columnSpacing || rowSpacing != oldDelegate.rowSpacing @@ -240,6 +242,7 @@ class FixedColumnCountGridDelegate extends GridDelegateWithInOrderChildPlacement /// The ratio of the width to the height of each tile in the grid. final double tileAspectRatio; + @override GridSpecification getGridSpecification(BoxConstraints constraints, int childCount) { assert(constraints.maxWidth < double.INFINITY); int rowCount = (childCount / columnCount).ceil(); @@ -256,16 +259,19 @@ class FixedColumnCountGridDelegate extends GridDelegateWithInOrderChildPlacement ); } + @override bool shouldRelayout(FixedColumnCountGridDelegate oldDelegate) { return columnCount != oldDelegate.columnCount || tileAspectRatio != oldDelegate.tileAspectRatio || super.shouldRelayout(oldDelegate); } + @override double getMinIntrinsicWidth(BoxConstraints constraints, int childCount) { return constraints.constrainWidth(0.0); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints, int childCount) { return constraints.constrainWidth(0.0); } @@ -297,6 +303,7 @@ class MaxTileWidthGridDelegate extends GridDelegateWithInOrderChildPlacement { /// The ratio of the width to the height of each tile in the grid. final double tileAspectRatio; + @override GridSpecification getGridSpecification(BoxConstraints constraints, int childCount) { assert(constraints.maxWidth < double.INFINITY); final double gridWidth = math.max(0.0, constraints.maxWidth - padding.horizontal); @@ -315,16 +322,19 @@ class MaxTileWidthGridDelegate extends GridDelegateWithInOrderChildPlacement { ); } + @override bool shouldRelayout(MaxTileWidthGridDelegate oldDelegate) { return maxTileWidth != oldDelegate.maxTileWidth || tileAspectRatio != oldDelegate.tileAspectRatio || super.shouldRelayout(oldDelegate); } + @override double getMinIntrinsicWidth(BoxConstraints constraints, int childCount) { return constraints.constrainWidth(0.0); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints, int childCount) { return constraints.constrainWidth(maxTileWidth * childCount); } @@ -335,6 +345,7 @@ class GridParentData extends ContainerBoxParentDataMixin { /// Opaque data passed to the getChildPlacement method of the grid's [GridDelegate]. Object placementData; + @override String toString() => '${super.toString()}; placementData=$placementData'; } @@ -384,6 +395,7 @@ class RenderGrid extends RenderVirtualViewport { _delegate = newDelegate; } + @override void set mainAxis(Axis value) { assert(() { if (value != Axis.vertical) @@ -393,6 +405,7 @@ class RenderGrid extends RenderVirtualViewport { super.mainAxis = value; } + @override int get virtualChildCount => super.virtualChildCount ?? childCount; /// The virtual index of the first child. @@ -409,31 +422,37 @@ class RenderGrid extends RenderVirtualViewport { markNeedsLayout(); } + @override void setupParentData(RenderBox child) { if (child.parentData is! GridParentData) child.parentData = new GridParentData(); } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return _delegate.getMinIntrinsicWidth(constraints, virtualChildCount); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return _delegate.getMaxIntrinsicWidth(constraints, virtualChildCount); } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return _delegate.getMinIntrinsicHeight(constraints, virtualChildCount); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return _delegate.getMaxIntrinsicHeight(constraints, virtualChildCount); } + @override double computeDistanceToActualBaseline(TextBaseline baseline) { return defaultComputeDistanceToHighestActualBaseline(baseline); } @@ -453,6 +472,7 @@ class RenderGrid extends RenderVirtualViewport { } } + @override void performLayout() { _updateGridSpecification(); final Size gridSize = _specification.gridSize; diff --git a/packages/flutter/lib/src/rendering/image.dart b/packages/flutter/lib/src/rendering/image.dart index 8ac1bfb85e..91e2ece48d 100644 --- a/packages/flutter/lib/src/rendering/image.dart +++ b/packages/flutter/lib/src/rendering/image.dart @@ -203,6 +203,7 @@ class RenderImage extends RenderBox { return constraints.constrain(new Size(width, height)); } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (_width == null && _height == null) @@ -210,11 +211,13 @@ class RenderImage extends RenderBox { return _sizeForConstraints(constraints).width; } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return _sizeForConstraints(constraints).width; } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (_width == null && _height == null) @@ -222,17 +225,21 @@ class RenderImage extends RenderBox { return _sizeForConstraints(constraints).height; } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return _sizeForConstraints(constraints).height; } + @override bool hitTestSelf(Point position) => true; + @override void performLayout() { size = _sizeForConstraints(constraints); } + @override void paint(PaintingContext context, Offset offset) { if (_image == null) return; @@ -248,6 +255,7 @@ class RenderImage extends RenderBox { ); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('image: $image'); diff --git a/packages/flutter/lib/src/rendering/layer.dart b/packages/flutter/lib/src/rendering/layer.dart index 9d3b3c2f53..2f1ea1c193 100644 --- a/packages/flutter/lib/src/rendering/layer.dart +++ b/packages/flutter/lib/src/rendering/layer.dart @@ -70,6 +70,7 @@ abstract class Layer { /// origin of the builder's coordinate system. void addToScene(ui.SceneBuilder builder, Offset layerOffset); + @override String toString() => '$runtimeType'; dynamic debugOwner; @@ -102,6 +103,7 @@ class PictureLayer extends Layer { /// The picture's coodinate system matches this layer's coodinate system ui.Picture picture; + @override void addToScene(ui.SceneBuilder builder, Offset layerOffset) { builder.addPicture(layerOffset, picture); } @@ -114,6 +116,7 @@ class ChildSceneLayer extends Layer { double devicePixelRatio; mojom.ViewLayoutInfo layoutInfo; + @override void addToScene(ui.SceneBuilder builder, Offset layerOffset) { builder.addChildScene( offset + layerOffset, @@ -124,6 +127,7 @@ class ChildSceneLayer extends Layer { ); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('offset: $offset'); @@ -150,6 +154,7 @@ class PerformanceOverlayLayer extends Layer { final int rasterizerThreshold; + @override void addToScene(ui.SceneBuilder builder, Offset layerOffset) { assert(optionsMask != null); builder.addPerformanceOverlay(optionsMask, overlayRect.shift(layerOffset)); @@ -243,6 +248,7 @@ class ContainerLayer extends Layer { _lastChild = null; } + @override void addToScene(ui.SceneBuilder builder, Offset layerOffset) { addChildrenToScene(builder, layerOffset); } @@ -256,6 +262,7 @@ class ContainerLayer extends Layer { } } + @override String debugDescribeChildren(String prefix) { String result = '$prefix \u2502\n'; if (_firstChild != null) { @@ -281,10 +288,12 @@ class OffsetLayer extends ContainerLayer { /// Offset from parent in the parent's coordinate system. Offset offset; + @override void addToScene(ui.SceneBuilder builder, Offset layerOffset) { addChildrenToScene(builder, offset + layerOffset); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('offset: $offset'); @@ -301,12 +310,14 @@ class ClipRectLayer extends ContainerLayer { // TODO(abarth): Why is the rectangle in the parent's coordinate system // instead of in the coordinate system of this layer? + @override void addToScene(ui.SceneBuilder builder, Offset layerOffset) { builder.pushClipRect(clipRect.shift(layerOffset)); addChildrenToScene(builder, layerOffset); builder.pop(); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('clipRect: $clipRect'); @@ -322,12 +333,14 @@ class ClipRRectLayer extends ContainerLayer { // TODO(abarth): Why is the rounded-rect in the parent's coordinate system // instead of in the coordinate system of this layer? + @override void addToScene(ui.SceneBuilder builder, Offset layerOffset) { builder.pushClipRRect(clipRRect.shift(layerOffset)); addChildrenToScene(builder, layerOffset); builder.pop(); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('clipRRect: $clipRRect'); @@ -343,12 +356,14 @@ class ClipPathLayer extends ContainerLayer { // TODO(abarth): Why is the path in the parent's coordinate system instead of // in the coordinate system of this layer? + @override void addToScene(ui.SceneBuilder builder, Offset layerOffset) { builder.pushClipPath(clipPath.shift(layerOffset)); addChildrenToScene(builder, layerOffset); builder.pop(); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('clipPath: $clipPath'); @@ -362,6 +377,7 @@ class TransformLayer extends OffsetLayer { /// The matrix to apply Matrix4 transform; + @override void addToScene(ui.SceneBuilder builder, Offset layerOffset) { Matrix4 offsetTransform = new Matrix4.identity(); offsetTransform.translate(offset.dx + layerOffset.dx, offset.dy + layerOffset.dy); @@ -370,6 +386,7 @@ class TransformLayer extends OffsetLayer { builder.pop(); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('transform:'); @@ -387,12 +404,14 @@ class OpacityLayer extends ContainerLayer { /// transparent and 255 is fully opaque. int alpha; + @override void addToScene(ui.SceneBuilder builder, Offset layerOffset) { builder.pushOpacity(alpha); addChildrenToScene(builder, layerOffset); builder.pop(); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('alpha: $alpha'); @@ -412,12 +431,14 @@ class ShaderMaskLayer extends ContainerLayer { /// The tranfer mode to apply when blending the shader with the children. TransferMode transferMode; + @override void addToScene(ui.SceneBuilder builder, Offset layerOffset) { builder.pushShaderMask(shader, maskRect.shift(layerOffset), transferMode); addChildrenToScene(builder, layerOffset); builder.pop(); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('shader: $shader'); diff --git a/packages/flutter/lib/src/rendering/list.dart b/packages/flutter/lib/src/rendering/list.dart index 2e04d1c723..abea020e2b 100644 --- a/packages/flutter/lib/src/rendering/list.dart +++ b/packages/flutter/lib/src/rendering/list.dart @@ -54,6 +54,7 @@ class RenderList extends RenderVirtualViewport { markNeedsLayout(); } + @override void setupParentData(RenderBox child) { if (child.parentData is! ListParentData) child.parentData = new ListParentData(); @@ -90,10 +91,12 @@ class RenderList extends RenderVirtualViewport { } } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { return _getIntrinsicWidth(constraints); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { return _getIntrinsicWidth(constraints); } @@ -108,14 +111,17 @@ class RenderList extends RenderVirtualViewport { } } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { return _getIntrinsicHeight(constraints); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { return _getIntrinsicHeight(constraints); } + @override void performLayout() { switch (mainAxis) { case Axis.vertical: diff --git a/packages/flutter/lib/src/rendering/object.dart b/packages/flutter/lib/src/rendering/object.dart index 56b650b3b2..266bc2ab67 100644 --- a/packages/flutter/lib/src/rendering/object.dart +++ b/packages/flutter/lib/src/rendering/object.dart @@ -30,6 +30,7 @@ class ParentData { /// Called when the RenderObject is removed from the tree. void detach() { } + @override String toString() => ''; } @@ -469,6 +470,7 @@ abstract class _SemanticsFragment { bool _debugCompiled = false; Iterable compile({ _SemanticsGeometry geometry, SemanticsNode currentSemantics, SemanticsNode parentSemantics }); + @override String toString() => '$runtimeType($hashCode)'; } @@ -482,6 +484,7 @@ class _CleanSemanticsFragment extends _SemanticsFragment { assert(owner._semantics != null); } + @override Iterable compile({ _SemanticsGeometry geometry, SemanticsNode currentSemantics, SemanticsNode parentSemantics }) sync* { assert(!_debugCompiled); assert(() { _debugCompiled = true; return true; }); @@ -506,6 +509,7 @@ abstract class _InterestingSemanticsFragment extends _SemanticsFragment { bool get haveConcreteNode => true; + @override Iterable compile({ _SemanticsGeometry geometry, SemanticsNode currentSemantics, SemanticsNode parentSemantics }) sync* { assert(!_debugCompiled); assert(() { _debugCompiled = true; return true; }); @@ -537,6 +541,7 @@ class _RootSemanticsFragment extends _InterestingSemanticsFragment { Iterable<_SemanticsFragment> children }) : super(owner: owner, annotators: annotators, children: children); + @override SemanticsNode establishSemanticsNode(_SemanticsGeometry geometry, SemanticsNode currentSemantics, SemanticsNode parentSemantics) { assert(_ancestorChain.length == 1); assert(geometry == null); @@ -552,6 +557,7 @@ class _RootSemanticsFragment extends _InterestingSemanticsFragment { return node; } + @override _SemanticsGeometry createSemanticsGeometryForChild(_SemanticsGeometry geometry) { return new _SemanticsGeometry(); } @@ -564,6 +570,7 @@ class _ConcreteSemanticsFragment extends _InterestingSemanticsFragment { Iterable<_SemanticsFragment> children }) : super(owner: owner, annotators: annotators, children: children); + @override SemanticsNode establishSemanticsNode(_SemanticsGeometry geometry, SemanticsNode currentSemantics, SemanticsNode parentSemantics) { owner._semantics ??= new SemanticsNode( handler: owner is SemanticActionHandler ? owner as dynamic : null @@ -578,6 +585,7 @@ class _ConcreteSemanticsFragment extends _InterestingSemanticsFragment { return node; } + @override _SemanticsGeometry createSemanticsGeometryForChild(_SemanticsGeometry geometry) { return new _SemanticsGeometry.withClipFrom(geometry); } @@ -590,9 +598,11 @@ class _ImplicitSemanticsFragment extends _InterestingSemanticsFragment { Iterable<_SemanticsFragment> children }) : super(owner: owner, annotators: annotators, children: children); + @override bool get haveConcreteNode => _haveConcreteNode; bool _haveConcreteNode; + @override SemanticsNode establishSemanticsNode(_SemanticsGeometry geometry, SemanticsNode currentSemantics, SemanticsNode parentSemantics) { SemanticsNode node; assert(_haveConcreteNode == null); @@ -616,6 +626,7 @@ class _ImplicitSemanticsFragment extends _InterestingSemanticsFragment { return node; } + @override _SemanticsGeometry createSemanticsGeometryForChild(_SemanticsGeometry geometry) { if (haveConcreteNode) return new _SemanticsGeometry.withClipFrom(geometry); @@ -632,6 +643,7 @@ class _ForkingSemanticsFragment extends _SemanticsFragment { assert(children.length > 1); } + @override Iterable compile({ _SemanticsGeometry geometry, SemanticsNode currentSemantics, SemanticsNode parentSemantics }) sync* { assert(!_debugCompiled); assert(() { _debugCompiled = true; return true; }); @@ -691,6 +703,7 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget { /// /// Only for use by subclasses when changing their child lists. Calling this /// in other cases will lead to an inconsistent tree and probably cause crashes. + @override void adoptChild(RenderObject child) { assert(debugCanPerformMutations); assert(child != null); @@ -704,6 +717,7 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget { /// /// Only for use by subclasses when changing their child lists. Calling this /// in other cases will lead to an inconsistent tree and probably cause crashes. + @override void dropChild(RenderObject child) { assert(debugCanPerformMutations); assert(child != null); @@ -1651,6 +1665,7 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget { // EVENTS /// Override this function to handle pointer events that hit this render object. + @override void handleEvent(PointerEvent event, HitTestEntry entry) { } @@ -1675,6 +1690,7 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget { /// Returns a human understandable name. + @override String toString() { String header = '$runtimeType'; if (_relayoutSubtreeRoot != null && _relayoutSubtreeRoot != this) { @@ -1759,20 +1775,28 @@ abstract class RenderObjectWithChildMixin implem if (_child != null) adoptChild(_child); } + + @override void attach() { super.attach(); if (_child != null) _child.attach(); } + + @override void detach() { super.detach(); if (_child != null) _child.detach(); } + + @override void visitChildren(RenderObjectVisitor visitor) { if (_child != null) visitor(_child); } + + @override String debugDescribeChildren(String prefix) { if (child != null) return '$prefix \u2502\n${child.toStringDeep('$prefix \u2514\u2500child: ', '$prefix ')}'; @@ -1788,6 +1812,7 @@ abstract class ContainerParentDataMixin implemen ChildType nextSibling; /// Clear the sibling pointers. + @override void detach() { super.detach(); if (previousSibling != null) { @@ -1971,6 +1996,7 @@ abstract class ContainerRenderObjectMixin message; } diff --git a/packages/flutter/lib/src/rendering/overflow.dart b/packages/flutter/lib/src/rendering/overflow.dart index 2d129c426a..9222496f29 100644 --- a/packages/flutter/lib/src/rendering/overflow.dart +++ b/packages/flutter/lib/src/rendering/overflow.dart @@ -28,42 +28,50 @@ class RenderSizedOverflowBox extends RenderBox with RenderObjectWithChildMixin constraints.minWidth; + + @override double getMaxIntrinsicWidth(BoxConstraints constraints) => constraints.minWidth; + + @override double getMinIntrinsicHeight(BoxConstraints constraints) => constraints.minHeight; + + @override double getMaxIntrinsicHeight(BoxConstraints constraints) => constraints.minHeight; + @override bool get sizedByParent => true; + @override void performResize() { size = constraints.smallest; } + @override void performLayout() { if (child != null) child.layout(constraints); } + @override bool hitTest(HitTestResult result, { Point position }) => false; + + @override void paint(PaintingContext context, Offset offset) { } + + @override void visitChildrenForSemantics(RenderObjectVisitor visitor) { } } diff --git a/packages/flutter/lib/src/rendering/paragraph.dart b/packages/flutter/lib/src/rendering/paragraph.dart index b158b53370..c3ae986824 100644 --- a/packages/flutter/lib/src/rendering/paragraph.dart +++ b/packages/flutter/lib/src/rendering/paragraph.dart @@ -52,11 +52,13 @@ class RenderParagraph extends RenderBox { _constraintsForCurrentLayout = constraints; } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { _layoutText(constraints); return constraints.constrainWidth(_textPainter.minIntrinsicWidth); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { _layoutText(constraints); return constraints.constrainWidth(_textPainter.maxIntrinsicWidth); @@ -67,24 +69,29 @@ class RenderParagraph extends RenderBox { return constraints.constrainHeight(_textPainter.size.height); } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return _getIntrinsicHeight(constraints); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return _getIntrinsicHeight(constraints); } + @override double computeDistanceToActualBaseline(TextBaseline baseline) { assert(!needsLayout); _layoutText(constraints); return _textPainter.computeDistanceToActualBaseline(baseline); } + @override bool hitTestSelf(Point position) => true; + @override void handleEvent(PointerEvent event, BoxHitTestEntry entry) { if (event is! PointerDownEvent) return; @@ -95,11 +102,13 @@ class RenderParagraph extends RenderBox { span?.recognizer?.addPointer(event); } + @override void performLayout() { _layoutText(constraints); size = constraints.constrain(_textPainter.size); } + @override void paint(PaintingContext context, Offset offset) { // Ideally we could compute the min/max intrinsic width/height with a // non-destructive operation. However, currently, computing these values @@ -112,12 +121,14 @@ class RenderParagraph extends RenderBox { _textPainter.paint(context.canvas, offset); } + @override Iterable getSemanticAnnotators() sync* { yield (SemanticsNode node) { node.label = text.toPlainText(); }; } + @override String debugDescribeChildren(String prefix) { return '$prefix \u2558\u2550\u2566\u2550\u2550 text \u2550\u2550\u2550\n' '${text.toString("$prefix \u2551 ")}\n' diff --git a/packages/flutter/lib/src/rendering/performance_overlay.dart b/packages/flutter/lib/src/rendering/performance_overlay.dart index 700ea10a3a..b70d371157 100644 --- a/packages/flutter/lib/src/rendering/performance_overlay.dart +++ b/packages/flutter/lib/src/rendering/performance_overlay.dart @@ -66,13 +66,18 @@ class RenderPerformanceOverlay extends RenderBox { markNeedsPaint(); } + @override bool get sizedByParent => true; + + @override bool get alwaysNeedsCompositing => true; + @override double getMinIntrinsicWidth(BoxConstraints constraints) { return constraints.constrainWidth(0.0); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { return constraints.constrainWidth(0.0); } @@ -89,18 +94,22 @@ class RenderPerformanceOverlay extends RenderBox { return result; } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { return constraints.constrainHeight(intrinsicHeight); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { return constraints.constrainHeight(intrinsicHeight); } + @override void performResize() { size = constraints.constrain(new Size(double.INFINITY, intrinsicHeight)); } + @override void paint(PaintingContext context, Offset offset) { assert(needsCompositing); context.pushPerformanceOverlay(offset, optionsMask, rasterizerThreshold, size); diff --git a/packages/flutter/lib/src/rendering/proxy_box.dart b/packages/flutter/lib/src/rendering/proxy_box.dart index 70d04cb5fe..c9e354de46 100644 --- a/packages/flutter/lib/src/rendering/proxy_box.dart +++ b/packages/flutter/lib/src/rendering/proxy_box.dart @@ -34,6 +34,7 @@ class RenderProxyBox extends RenderBox with RenderObjectWithChildMixin= 0.0 && position.x < size.width && @@ -124,8 +133,10 @@ abstract class RenderProxyBoxWithHitTestBehavior extends RenderProxyBox { return hitTarget; } + @override bool hitTestSelf(Point position) => behavior == HitTestBehavior.opaque; + @override void debugFillDescription(List description) { super.debugFillDescription(description); switch (behavior) { @@ -173,6 +184,7 @@ class RenderConstrainedBox extends RenderProxyBox { markNeedsLayout(); } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -180,6 +192,7 @@ class RenderConstrainedBox extends RenderProxyBox { return _additionalConstraints.enforce(constraints).constrainWidth(0.0); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -187,6 +200,7 @@ class RenderConstrainedBox extends RenderProxyBox { return _additionalConstraints.enforce(constraints).constrainWidth(0.0); } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -194,6 +208,7 @@ class RenderConstrainedBox extends RenderProxyBox { return _additionalConstraints.enforce(constraints).constrainHeight(0.0); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -201,6 +216,7 @@ class RenderConstrainedBox extends RenderProxyBox { return _additionalConstraints.enforce(constraints).constrainHeight(0.0); } + @override void performLayout() { if (child != null) { child.layout(_additionalConstraints.enforce(constraints), parentUsesSize: true); @@ -210,6 +226,7 @@ class RenderConstrainedBox extends RenderProxyBox { } } + @override void debugPaintSize(PaintingContext context, Offset offset) { super.debugPaintSize(context, offset); assert(() { @@ -223,6 +240,7 @@ class RenderConstrainedBox extends RenderProxyBox { }); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('additionalConstraints: $additionalConstraints'); @@ -301,6 +319,7 @@ class RenderFractionallySizedBox extends RenderProxyBox { ); } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -308,6 +327,7 @@ class RenderFractionallySizedBox extends RenderProxyBox { return _getInnerConstraints(constraints).constrainWidth(0.0); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -315,6 +335,7 @@ class RenderFractionallySizedBox extends RenderProxyBox { return _getInnerConstraints(constraints).constrainWidth(0.0); } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -322,6 +343,7 @@ class RenderFractionallySizedBox extends RenderProxyBox { return _getInnerConstraints(constraints).constrainHeight(0.0); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -329,6 +351,7 @@ class RenderFractionallySizedBox extends RenderProxyBox { return _getInnerConstraints(constraints).constrainHeight(0.0); } + @override void performLayout() { if (child != null) { child.layout(_getInnerConstraints(constraints), parentUsesSize: true); @@ -338,6 +361,7 @@ class RenderFractionallySizedBox extends RenderProxyBox { } } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('widthFactor: ${_widthFactor ?? "pass-through"}'); @@ -393,18 +417,22 @@ class RenderAspectRatio extends RenderProxyBox { markNeedsLayout(); } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { return constraints.minWidth; } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { return constraints.maxWidth; } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { return constraints.minHeight; } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { return constraints.maxHeight; } @@ -468,12 +496,14 @@ class RenderAspectRatio extends RenderProxyBox { return constraints.constrain(new Size(width, height)); } + @override void performLayout() { size = _applyAspectRatio(constraints); if (child != null) child.layout(new BoxConstraints.tight(size)); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('aspectRatio: $aspectRatio'); @@ -535,11 +565,13 @@ class RenderIntrinsicWidth extends RenderProxyBox { return constraints.tighten(width: _applyStep(width, _stepWidth)); } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return getMaxIntrinsicWidth(constraints); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child == null) @@ -548,6 +580,7 @@ class RenderIntrinsicWidth extends RenderProxyBox { return constraints.constrainWidth(_applyStep(childResult, _stepWidth)); } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child == null) @@ -556,6 +589,7 @@ class RenderIntrinsicWidth extends RenderProxyBox { return constraints.constrainHeight(_applyStep(childResult, _stepHeight)); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child == null) @@ -564,6 +598,7 @@ class RenderIntrinsicWidth extends RenderProxyBox { return constraints.constrainHeight(_applyStep(childResult, _stepHeight)); } + @override void performLayout() { if (child != null) { BoxConstraints childConstraints = _getInnerConstraints(constraints); @@ -576,6 +611,7 @@ class RenderIntrinsicWidth extends RenderProxyBox { } } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('stepWidth: $stepWidth'); @@ -605,6 +641,7 @@ class RenderIntrinsicHeight extends RenderProxyBox { return constraints.tighten(height: height); } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child == null) @@ -612,6 +649,7 @@ class RenderIntrinsicHeight extends RenderProxyBox { return child.getMinIntrinsicWidth(_getInnerConstraints(constraints)); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child == null) @@ -619,11 +657,13 @@ class RenderIntrinsicHeight extends RenderProxyBox { return child.getMaxIntrinsicWidth(_getInnerConstraints(constraints)); } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return getMaxIntrinsicHeight(constraints); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child == null) @@ -631,6 +671,7 @@ class RenderIntrinsicHeight extends RenderProxyBox { return child.getMaxIntrinsicHeight(constraints); } + @override void performLayout() { if (child != null) { child.layout(_getInnerConstraints(constraints), parentUsesSize: true); @@ -657,6 +698,7 @@ class RenderOpacity extends RenderProxyBox { assert(opacity >= 0.0 && opacity <= 1.0); } + @override bool get alwaysNeedsCompositing => child != null && (_alpha != 0 && _alpha != 255); /// The fraction to scale the child's alpha value. @@ -679,6 +721,7 @@ class RenderOpacity extends RenderProxyBox { int _alpha; + @override void paint(PaintingContext context, Offset offset) { if (child != null) { if (_alpha == 0) @@ -692,11 +735,13 @@ class RenderOpacity extends RenderProxyBox { } } + @override void visitChildrenForSemantics(RenderObjectVisitor visitor) { if (child != null && _alpha != 0) visitor(child); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('opacity: ${opacity.toStringAsFixed(1)}'); @@ -729,8 +774,10 @@ class RenderShaderMask extends RenderProxyBox { markNeedsPaint(); } + @override bool get alwaysNeedsCompositing => child != null; + @override void paint(PaintingContext context, Offset offset) { if (child != null) { assert(needsCompositing); @@ -788,6 +835,7 @@ abstract class _RenderCustomClip extends RenderProxyBox { T get _defaultClip; T get _clip => _clipper?.getClip(size) ?? _defaultClip; + @override Rect describeApproximatePaintClip(RenderObject child) => _clipper?.getApproximateClipRect(size) ?? Point.origin & size; } @@ -800,8 +848,10 @@ class RenderClipRect extends _RenderCustomClip { CustomClipper clipper }) : super(child: child, clipper: clipper); + @override Rect get _defaultClip => Point.origin & size; + @override bool hitTest(HitTestResult result, { Point position }) { if (_clipper != null) { Rect clipRect = _clip; @@ -811,6 +861,7 @@ class RenderClipRect extends _RenderCustomClip { return super.hitTest(result, position: position); } + @override void paint(PaintingContext context, Offset offset) { if (child != null) context.pushClipRect(needsCompositing, offset, _clip, super.paint); @@ -863,6 +914,7 @@ class RenderClipRRect extends RenderProxyBox { // TODO(ianh): either convert this to the CustomClipper world, or // TODO(ianh): implement describeApproximatePaintClip for this class + @override void paint(PaintingContext context, Offset offset) { if (child != null) { Rect rect = Point.origin & size; @@ -893,8 +945,10 @@ class RenderClipOval extends _RenderCustomClip { return _cachedPath; } + @override Rect get _defaultClip => Point.origin & size; + @override bool hitTest(HitTestResult result, { Point position }) { Rect clipBounds = _clip; Point center = clipBounds.center; @@ -907,6 +961,7 @@ class RenderClipOval extends _RenderCustomClip { return super.hitTest(result, position: position); } + @override void paint(PaintingContext context, Offset offset) { if (child != null) { Rect clipBounds = _clip; @@ -979,20 +1034,24 @@ class RenderDecoratedBox extends RenderProxyBox { _decoration.removeChangeListener(markNeedsPaint); } + @override void attach() { super.attach(); _addListenerIfNeeded(); } + @override void detach() { _removeListenerIfNeeded(); super.detach(); } + @override bool hitTestSelf(Point position) { return _decoration.hitTest(size, position); } + @override void paint(PaintingContext context, Offset offset) { assert(size.width != null); assert(size.height != null); @@ -1004,6 +1063,7 @@ class RenderDecoratedBox extends RenderProxyBox { _painter.paint(context.canvas, offset & size); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('decoration:'); @@ -1130,6 +1190,7 @@ class RenderTransform extends RenderProxyBox { return result; } + @override bool hitTest(HitTestResult result, { Point position }) { if (transformHitTests) { Matrix4 inverse; @@ -1147,6 +1208,7 @@ class RenderTransform extends RenderProxyBox { return super.hitTest(result, position: position); } + @override void paint(PaintingContext context, Offset offset) { if (child != null) { Matrix4 transform = _effectiveTransform; @@ -1158,11 +1220,13 @@ class RenderTransform extends RenderProxyBox { } } + @override void applyPaintTransform(RenderBox child, Matrix4 transform) { transform.multiply(_effectiveTransform); super.applyPaintTransform(child, transform); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('transform matrix:'); @@ -1206,6 +1270,7 @@ class RenderFractionalTranslation extends RenderProxyBox { /// always honor the transformation, regardless of the value of this property. bool transformHitTests; + @override bool hitTest(HitTestResult result, { Point position }) { assert(!needsLayout); if (transformHitTests) @@ -1213,17 +1278,20 @@ class RenderFractionalTranslation extends RenderProxyBox { return super.hitTest(result, position: position); } + @override void paint(PaintingContext context, Offset offset) { assert(!needsLayout); if (child != null) super.paint(context, offset + translation.alongSize(size)); } + @override void applyPaintTransform(RenderBox child, Matrix4 transform) { transform.translate(translation.dx * size.width, translation.dy * size.height); super.applyPaintTransform(child, transform); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('translation: $translation'); @@ -1290,12 +1358,14 @@ class RenderCustomPaint extends RenderProxyBox { } } + @override bool hitTestChildren(HitTestResult result, { Point position }) { if (_foregroundPainter != null && (_foregroundPainter.hitTest(position) ?? false)) return true; return super.hitTestChildren(result, position: position); } + @override bool hitTestSelf(Point position) { return _painter != null && (_painter.hitTest(position) ?? true); } @@ -1340,6 +1410,7 @@ class RenderCustomPaint extends RenderProxyBox { canvas.restore(); } + @override void paint(PaintingContext context, Offset offset) { if (_painter != null) _paintWithPainter(context.canvas, offset, _painter); @@ -1370,6 +1441,7 @@ class RenderPointerListener extends RenderProxyBoxWithHitTestBehavior { PointerUpEventListener onPointerUp; PointerCancelEventListener onPointerCancel; + @override void handleEvent(PointerEvent event, HitTestEntry entry) { if (onPointerDown != null && event is PointerDownEvent) return onPointerDown(event); @@ -1381,6 +1453,7 @@ class RenderPointerListener extends RenderProxyBoxWithHitTestBehavior { return onPointerCancel(event); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); List listeners = []; @@ -1409,6 +1482,8 @@ class RenderPointerListener extends RenderProxyBoxWithHitTestBehavior { /// for the surround tree. class RenderRepaintBoundary extends RenderProxyBox { RenderRepaintBoundary({ RenderBox child }) : super(child); + + @override bool get isRepaintBoundary => true; } @@ -1455,6 +1530,7 @@ class RenderIgnorePointer extends RenderProxyBox { bool get _effectiveIgnoringSemantics => ignoringSemantics == null ? ignoring : ignoringSemantics; + @override bool hitTest(HitTestResult result, { Point position }) { return ignoring ? false : super.hitTest(result, position: position); } @@ -1462,11 +1538,13 @@ class RenderIgnorePointer extends RenderProxyBox { // TODO(ianh): figure out a way to still include labels and flags in // descendants, just make them non-interactive, even when // _effectiveIgnoringSemantics is true + @override void visitChildrenForSemantics(RenderObjectVisitor visitor) { if (child != null && !_effectiveIgnoringSemantics) visitor(child); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('ignoring: $ignoring'); @@ -1485,6 +1563,7 @@ class RenderMetaData extends RenderProxyBoxWithHitTestBehavior { /// Opaque meta data ignored by the render tree dynamic metaData; + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('metaData: $metaData'); @@ -1562,6 +1641,7 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc /// leftwards drag. double scrollFactor; + @override bool get hasSemantics { return onTap != null || onLongPress != null @@ -1569,6 +1649,7 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc || onVerticalDragUpdate != null; } + @override Iterable getSemanticAnnotators() sync* { if (hasSemantics) { yield (SemanticsNode semantics) { @@ -1580,31 +1661,37 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc } } + @override void handleSemanticTap() { if (onTap != null) onTap(); } + @override void handleSemanticLongPress() { if (onLongPress != null) onLongPress(); } + @override void handleSemanticScrollLeft() { if (onHorizontalDragUpdate != null) onHorizontalDragUpdate(size.width * -scrollFactor); } + @override void handleSemanticScrollRight() { if (onHorizontalDragUpdate != null) onHorizontalDragUpdate(size.width * scrollFactor); } + @override void handleSemanticScrollUp() { if (onVerticalDragUpdate != null) onVerticalDragUpdate(size.height * -scrollFactor); } + @override void handleSemanticScrollDown() { if (onVerticalDragUpdate != null) onVerticalDragUpdate(size.height * scrollFactor); @@ -1668,8 +1755,10 @@ class RenderSemanticAnnotations extends RenderProxyBox { markNeedsSemanticsUpdate(onlyChanges: (value != null) == hadValue); } + @override bool get hasSemantics => container; + @override Iterable getSemanticAnnotators() sync* { if (checked != null) { yield (SemanticsNode semantics) { @@ -1694,6 +1783,8 @@ class RenderSemanticAnnotations extends RenderProxyBox { /// and the gesture detector that goes with them. class RenderMergeSemantics extends RenderProxyBox { RenderMergeSemantics({ RenderBox child }) : super(child); + + @override Iterable getSemanticAnnotators() sync* { yield (SemanticsNode node) { node.mergeAllDescendantsIntoThisNode = true; }; } @@ -1705,5 +1796,7 @@ class RenderMergeSemantics extends RenderProxyBox { /// to it (e.g. text included only for the visual effect). class RenderExcludeSemantics extends RenderProxyBox { RenderExcludeSemantics({ RenderBox child }) : super(child); + + @override void visitChildrenForSemantics(RenderObjectVisitor visitor) { } } diff --git a/packages/flutter/lib/src/rendering/rotated_box.dart b/packages/flutter/lib/src/rendering/rotated_box.dart index 18a151d9be..059362f225 100644 --- a/packages/flutter/lib/src/rendering/rotated_box.dart +++ b/packages/flutter/lib/src/rendering/rotated_box.dart @@ -39,6 +39,7 @@ class RenderRotatedBox extends RenderBox with RenderObjectWithChildMixin quarterTurns % 2 == 1; + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -46,6 +47,7 @@ class RenderRotatedBox extends RenderBox with RenderObjectWithChildMixin super.parent; + + @override void redepthChildren() { if (_children != null) { for (SemanticsNode child in _children) @@ -261,6 +264,7 @@ class SemanticsNode extends AbstractNode { static Map _nodes = {}; static Set _detachedNodes = new Set(); + @override void attach() { super.attach(); assert(!_nodes.containsKey(_id)); @@ -273,6 +277,8 @@ class SemanticsNode extends AbstractNode { child.attach(); } } + + @override void detach() { super.detach(); assert(_nodes.containsKey(_id)); @@ -440,6 +446,7 @@ class SemanticsNode extends AbstractNode { return result._actionHandler; } + @override String toString() { return '$runtimeType($_id' '${_dirty ? " (${ _dirtyNodes.contains(this) ? 'dirty' : 'STALE' })" : ""}' @@ -469,24 +476,37 @@ class SemanticsNode extends AbstractNode { } class SemanticsServer extends mojom.SemanticsServer { + @override void addSemanticsListener(mojom.SemanticsListenerProxy listener) { SemanticsNode.addListener(listener.ptr); } + + @override void tap(int nodeID) { SemanticsNode.getSemanticActionHandlerForId(nodeID, neededFlag: _SemanticFlags.canBeTapped)?.handleSemanticTap(); } + + @override void longPress(int nodeID) { SemanticsNode.getSemanticActionHandlerForId(nodeID, neededFlag: _SemanticFlags.canBeLongPressed)?.handleSemanticLongPress(); } + + @override void scrollLeft(int nodeID) { SemanticsNode.getSemanticActionHandlerForId(nodeID, neededFlag: _SemanticFlags.canBeScrolledHorizontally)?.handleSemanticScrollLeft(); } + + @override void scrollRight(int nodeID) { SemanticsNode.getSemanticActionHandlerForId(nodeID, neededFlag: _SemanticFlags.canBeScrolledHorizontally)?.handleSemanticScrollRight(); } + + @override void scrollUp(int nodeID) { SemanticsNode.getSemanticActionHandlerForId(nodeID, neededFlag: _SemanticFlags.canBeScrolledVertically)?.handleSemanticScrollUp(); } + + @override void scrollDown(int nodeID) { SemanticsNode.getSemanticActionHandlerForId(nodeID, neededFlag: _SemanticFlags.canBeScrolledVertically)?.handleSemanticScrollDown(); } diff --git a/packages/flutter/lib/src/rendering/shifted_box.dart b/packages/flutter/lib/src/rendering/shifted_box.dart index 744b10cb4a..ec37a335cd 100644 --- a/packages/flutter/lib/src/rendering/shifted_box.dart +++ b/packages/flutter/lib/src/rendering/shifted_box.dart @@ -15,6 +15,7 @@ abstract class RenderShiftedBox extends RenderBox with RenderObjectWithChildMixi this.child = child; } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -22,6 +23,7 @@ abstract class RenderShiftedBox extends RenderBox with RenderObjectWithChildMixi return super.getMinIntrinsicWidth(constraints); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -29,6 +31,7 @@ abstract class RenderShiftedBox extends RenderBox with RenderObjectWithChildMixi return super.getMaxIntrinsicWidth(constraints); } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -36,6 +39,7 @@ abstract class RenderShiftedBox extends RenderBox with RenderObjectWithChildMixi return super.getMinIntrinsicHeight(constraints); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -43,6 +47,7 @@ abstract class RenderShiftedBox extends RenderBox with RenderObjectWithChildMixi return super.getMaxIntrinsicHeight(constraints); } + @override double computeDistanceToActualBaseline(TextBaseline baseline) { double result; if (child != null) { @@ -57,6 +62,7 @@ abstract class RenderShiftedBox extends RenderBox with RenderObjectWithChildMixi return result; } + @override void paint(PaintingContext context, Offset offset) { if (child != null) { final BoxParentData childParentData = child.parentData; @@ -64,6 +70,7 @@ abstract class RenderShiftedBox extends RenderBox with RenderObjectWithChildMixi } } + @override bool hitTestChildren(HitTestResult result, { Point position }) { if (child != null) { final BoxParentData childParentData = child.parentData; @@ -103,6 +110,7 @@ class RenderPadding extends RenderShiftedBox { markNeedsLayout(); } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); double totalPadding = padding.left + padding.right; @@ -111,6 +119,7 @@ class RenderPadding extends RenderShiftedBox { return constraints.constrainWidth(totalPadding); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); double totalPadding = padding.left + padding.right; @@ -119,6 +128,7 @@ class RenderPadding extends RenderShiftedBox { return constraints.constrainWidth(totalPadding); } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); double totalPadding = padding.top + padding.bottom; @@ -127,6 +137,7 @@ class RenderPadding extends RenderShiftedBox { return constraints.constrainHeight(totalPadding); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); double totalPadding = padding.top + padding.bottom; @@ -135,6 +146,7 @@ class RenderPadding extends RenderShiftedBox { return constraints.constrainHeight(totalPadding); } + @override void performLayout() { assert(padding != null); if (child == null) { @@ -154,6 +166,7 @@ class RenderPadding extends RenderShiftedBox { )); } + @override void debugPaintSize(PaintingContext context, Offset offset) { super.debugPaintSize(context, offset); assert(() { @@ -198,6 +211,7 @@ class RenderPadding extends RenderShiftedBox { }); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('padding: $padding'); @@ -274,6 +288,7 @@ class RenderPositionedBox extends RenderShiftedBox { markNeedsLayout(); } + @override void performLayout() { final bool shrinkWrapWidth = _widthFactor != null || constraints.maxWidth == double.INFINITY; final bool shrinkWrapHeight = _heightFactor != null || constraints.maxHeight == double.INFINITY; @@ -290,6 +305,7 @@ class RenderPositionedBox extends RenderShiftedBox { } } + @override void debugPaintSize(PaintingContext context, Offset offset) { super.debugPaintSize(context, offset); assert(() { @@ -347,6 +363,7 @@ class RenderPositionedBox extends RenderShiftedBox { }); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('alignment: $alignment'); @@ -461,32 +478,39 @@ class RenderOverflowBox extends RenderShiftedBox { ); } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return constraints.minWidth; } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return constraints.minWidth; } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return constraints.minHeight; } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return constraints.minHeight; } + @override bool get sizedByParent => true; + @override void performResize() { size = constraints.biggest; } + @override void performLayout() { if (child != null) { child.layout(_getInnerConstraints(constraints), parentUsesSize: true); @@ -495,6 +519,7 @@ class RenderOverflowBox extends RenderShiftedBox { } } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('minWidth: ${minWidth ?? "use parent minWidth constraint"}'); @@ -550,32 +575,39 @@ class RenderCustomSingleChildLayoutBox extends RenderShiftedBox { return constraints.constrain(_delegate.getSize(constraints)); } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return _getSize(constraints).width; } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return _getSize(constraints).width; } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return _getSize(constraints).height; } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); return _getSize(constraints).height; } + @override bool get sizedByParent => true; + @override void performResize() { size = _getSize(constraints); } + @override void performLayout() { if (child != null) { BoxConstraints childConstraints = delegate.getConstraintsForChild(constraints); @@ -624,6 +656,7 @@ class RenderBaseline extends RenderShiftedBox { markNeedsLayout(); } + @override void performLayout() { if (child != null) { child.layout(constraints.loosen(), parentUsesSize: true); @@ -636,6 +669,7 @@ class RenderBaseline extends RenderShiftedBox { } } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('baseline: $baseline'); diff --git a/packages/flutter/lib/src/rendering/stack.dart b/packages/flutter/lib/src/rendering/stack.dart index 8bf2f3e024..d360f5cbb2 100644 --- a/packages/flutter/lib/src/rendering/stack.dart +++ b/packages/flutter/lib/src/rendering/stack.dart @@ -114,6 +114,7 @@ class RelativeRect { ); } + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -126,8 +127,10 @@ class RelativeRect { bottom == typedOther.bottom; } + @override int get hashCode => hashValues(left, top, right, bottom); + @override String toString() => "RelativeRect.fromLTRB(${left?.toStringAsFixed(1)}, ${top?.toStringAsFixed(1)}, ${right?.toStringAsFixed(1)}, ${bottom?.toStringAsFixed(1)})"; } @@ -172,6 +175,7 @@ class StackParentData extends ContainerBoxParentDataMixin { /// children in the stack. bool get isPositioned => top != null || right != null || bottom != null || left != null || width != null || height != null; + @override String toString() { List values = []; if (top != null) @@ -205,6 +209,7 @@ abstract class RenderStackBase extends RenderBox bool _hasVisualOverflow = false; + @override void setupParentData(RenderBox child) { if (child.parentData is! StackParentData) child.parentData = new StackParentData(); @@ -219,6 +224,7 @@ abstract class RenderStackBase extends RenderBox } } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); double width = constraints.minWidth; @@ -234,6 +240,7 @@ abstract class RenderStackBase extends RenderBox return width; } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); bool hasNonPositionedChildren = false; @@ -254,6 +261,7 @@ abstract class RenderStackBase extends RenderBox return width; } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); double height = constraints.minHeight; @@ -269,6 +277,7 @@ abstract class RenderStackBase extends RenderBox return height; } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); bool hasNonPositionedChildren = false; @@ -289,10 +298,12 @@ abstract class RenderStackBase extends RenderBox return height; } + @override double computeDistanceToActualBaseline(TextBaseline baseline) { return defaultComputeDistanceToHighestActualBaseline(baseline); } + @override void performLayout() { _hasVisualOverflow = false; bool hasNonPositionedChildren = false; @@ -375,12 +386,14 @@ abstract class RenderStackBase extends RenderBox } } + @override bool hitTestChildren(HitTestResult result, { Point position }) { return defaultHitTestChildren(result, position: position); } void paintStack(PaintingContext context, Offset offset); + @override void paint(PaintingContext context, Offset offset) { if (_hasVisualOverflow) { context.pushClipRect(needsCompositing, offset, Point.origin & size, paintStack); @@ -389,6 +402,7 @@ abstract class RenderStackBase extends RenderBox } } + @override Rect describeApproximatePaintClip(RenderObject child) => _hasVisualOverflow ? Point.origin & size : null; } @@ -431,6 +445,7 @@ class RenderStack extends RenderStackBase { alignment: alignment ); + @override void paintStack(PaintingContext context, Offset offset) { defaultPaint(context, offset); } @@ -476,6 +491,7 @@ class RenderIndexedStack extends RenderStackBase { return child; } + @override bool hitTestChildren(HitTestResult result, { Point position }) { if (firstChild == null) return false; @@ -487,6 +503,7 @@ class RenderIndexedStack extends RenderStackBase { return child.hitTest(result, position: transformed); } + @override void paintStack(PaintingContext context, Offset offset) { if (firstChild == null) return; diff --git a/packages/flutter/lib/src/rendering/view.dart b/packages/flutter/lib/src/rendering/view.dart index 9a982ad26a..df99ec1af5 100644 --- a/packages/flutter/lib/src/rendering/view.dart +++ b/packages/flutter/lib/src/rendering/view.dart @@ -26,6 +26,7 @@ class ViewConfiguration { /// The orientation of the output surface (aspirational). final int orientation; + @override String toString() => '$size'; } @@ -77,12 +78,15 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin // We never call layout() on this class, so this should never get // checked. (This class is laid out using scheduleInitialLayout().) + @override void debugAssertDoesMeetConstraints() { assert(false); } + @override void performResize() { assert(false); } + @override void performLayout() { if (configuration.orientation != _orientation) { if (_orientation != null && child != null) @@ -96,6 +100,7 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin child.layout(new BoxConstraints.tight(_size)); } + @override void rotate({ int oldAngle, int newAngle, Duration time }) { assert(false); // nobody tells the screen to rotate, the whole rotate() dance is started from our performResize() } @@ -107,8 +112,10 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin return true; } + @override bool get isRepaintBoundary => true; + @override void paint(PaintingContext context, Offset offset) { if (child != null) context.paintChild(child, offset); @@ -138,9 +145,13 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin } } + @override Rect get paintBounds => Point.origin & size; + + @override Rect get semanticBounds => Point.origin & size; + @override void debugFillDescription(List description) { // call to ${super.debugFillDescription(prefix)} is omitted because the root superclasses don't include any interesting information for this class description.add('window size: ${ui.window.size} (in device pixels)'); diff --git a/packages/flutter/lib/src/rendering/viewport.dart b/packages/flutter/lib/src/rendering/viewport.dart index eb4b3f49ad..d56b23071e 100644 --- a/packages/flutter/lib/src/rendering/viewport.dart +++ b/packages/flutter/lib/src/rendering/viewport.dart @@ -55,6 +55,7 @@ class ViewportDimensions { } } + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -65,8 +66,10 @@ class ViewportDimensions { containerSize == typedOther.containerSize; } + @override int get hashCode => hashValues(contentSize, containerSize); + @override String toString() => 'ViewportDimensions(container: $containerSize, content: $contentSize)'; } @@ -125,6 +128,7 @@ class RenderViewportBase extends RenderBox implements HasMainAxis { /// If the viewport is scrollable in a particular direction (e.g., vertically), /// the child is given layout constraints that are fully unconstrainted in /// that direction (e.g., the child can be as tall as it wants). + @override Axis get mainAxis => _mainAxis; Axis _mainAxis; void set mainAxis(Axis value) { @@ -163,11 +167,13 @@ class RenderViewportBase extends RenderBox implements HasMainAxis { markNeedsPaint(); } + @override void attach() { super.attach(); _overlayPainter?.attach(this); } + @override void detach() { super.detach(); _overlayPainter?.detach(); @@ -190,11 +196,13 @@ class RenderViewportBase extends RenderBox implements HasMainAxis { ); } + @override void applyPaintTransform(RenderBox child, Matrix4 transform) { final Offset effectivePaintOffset = _effectivePaintOffset; super.applyPaintTransform(child, transform.translate(effectivePaintOffset.dx, effectivePaintOffset.dy)); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('paintOffset: $paintOffset'); @@ -243,6 +251,7 @@ class RenderViewport extends RenderViewportBase with RenderObjectWithChildMixin< return innerConstraints; } + @override double getMinIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -250,6 +259,7 @@ class RenderViewport extends RenderViewportBase with RenderObjectWithChildMixin< return super.getMinIntrinsicWidth(constraints); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -257,6 +267,7 @@ class RenderViewport extends RenderViewportBase with RenderObjectWithChildMixin< return super.getMaxIntrinsicWidth(constraints); } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -264,6 +275,7 @@ class RenderViewport extends RenderViewportBase with RenderObjectWithChildMixin< return super.getMinIntrinsicHeight(constraints); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { assert(constraints.debugAssertIsNormalized); if (child != null) @@ -276,6 +288,7 @@ class RenderViewport extends RenderViewportBase with RenderObjectWithChildMixin< // scroll the RenderViewport, it would shift in its parent if the // parent was baseline-aligned, which makes no sense. + @override void performLayout() { ViewportDimensions oldDimensions = dimensions; if (child != null) { @@ -298,6 +311,7 @@ class RenderViewport extends RenderViewportBase with RenderObjectWithChildMixin< return paintOffset < Offset.zero || !(Offset.zero & size).contains((paintOffset & child.size).bottomRight); } + @override void paint(PaintingContext context, Offset offset) { if (child != null) { final Offset effectivePaintOffset = _effectivePaintOffset; @@ -315,12 +329,14 @@ class RenderViewport extends RenderViewportBase with RenderObjectWithChildMixin< } } + @override Rect describeApproximatePaintClip(RenderObject child) { if (child != null && _shouldClipAtPaintOffset(_effectivePaintOffset)) return Point.origin & size; return null; } + @override bool hitTestChildren(HitTestResult result, { Point position }) { if (child != null) { assert(child.parentData is BoxParentData); @@ -367,6 +383,7 @@ abstract class RenderVirtualViewport Point.origin & size; + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('virtual child count: $virtualChildCount'); diff --git a/packages/flutter/lib/src/scheduler/scheduler.dart b/packages/flutter/lib/src/scheduler/scheduler.dart index 4a32f862a8..998c4a0195 100644 --- a/packages/flutter/lib/src/scheduler/scheduler.dart +++ b/packages/flutter/lib/src/scheduler/scheduler.dart @@ -91,6 +91,7 @@ class Priority { abstract class Scheduler extends BindingBase { /// Requires clients to use the [scheduler] singleton + @override void initInstances() { super.initInstances(); _instance = this; diff --git a/packages/flutter/lib/src/services/assertions.dart b/packages/flutter/lib/src/services/assertions.dart index 26aaab3bff..7d159e1887 100644 --- a/packages/flutter/lib/src/services/assertions.dart +++ b/packages/flutter/lib/src/services/assertions.dart @@ -4,6 +4,9 @@ class FlutterError extends AssertionError { FlutterError(this.message); + final String message; + + @override String toString() => message; } diff --git a/packages/flutter/lib/src/services/asset_bundle.dart b/packages/flutter/lib/src/services/asset_bundle.dart index 43df8f9362..d6977cfb5a 100644 --- a/packages/flutter/lib/src/services/asset_bundle.dart +++ b/packages/flutter/lib/src/services/asset_bundle.dart @@ -21,6 +21,8 @@ abstract class AssetBundle { ImageResource loadImage(String key); Future loadString(String key); Future load(String key); + + @override String toString() => '$runtimeType@$hashCode()'; } @@ -31,16 +33,20 @@ class NetworkAssetBundle extends AssetBundle { String _urlFromKey(String key) => _baseUrl.resolve(key).toString(); + @override Future load(String key) async { return (await fetchUrl(_urlFromKey(key))).body; } + @override ImageResource loadImage(String key) => imageCache.load(_urlFromKey(key)); + @override Future loadString(String key) async { return (await http.get(_urlFromKey(key))).body; } + @override String toString() => '$runtimeType@$hashCode($_baseUrl)'; } @@ -54,6 +60,7 @@ abstract class CachingAssetBundle extends AssetBundle { return new ImageInfo(image: await decodeImageFromDataPipe(await load(key))); } + @override ImageResource loadImage(String key) { return imageResourceCache.putIfAbsent(key, () { return new ImageResource(fetchImage(key)); @@ -66,6 +73,7 @@ abstract class CachingAssetBundle extends AssetBundle { return new String.fromCharCodes(new Uint8List.view(data.buffer)); } + @override Future loadString(String key) { return _stringCache.putIfAbsent(key, () => _fetchString(key)); } @@ -90,6 +98,7 @@ class MojoAssetBundle extends CachingAssetBundle { AssetBundleProxy _bundle; + @override Future load(String key) async { return (await _bundle.ptr.getAsStream(key)).assetData; } diff --git a/packages/flutter/lib/src/services/binding.dart b/packages/flutter/lib/src/services/binding.dart index ff0023ca9b..165b07ba44 100644 --- a/packages/flutter/lib/src/services/binding.dart +++ b/packages/flutter/lib/src/services/binding.dart @@ -34,10 +34,12 @@ abstract class BindingBase { assert(() { _debugInitialized = true; return true; }); } + @override String toString() => '<$runtimeType>'; } abstract class Services extends BindingBase { + @override void initInstances() { super.initInstances(); new MojoShell(); diff --git a/packages/flutter/lib/src/services/image_cache.dart b/packages/flutter/lib/src/services/image_cache.dart index cf06a5d891..387d7c6133 100644 --- a/packages/flutter/lib/src/services/image_cache.dart +++ b/packages/flutter/lib/src/services/image_cache.dart @@ -24,6 +24,7 @@ class _UrlFetcher implements ImageProvider { final String _url; final double _scale; + @override Future loadImage() async { UrlResponse response = await fetchUrl(_url); if (response.statusCode >= 400) { @@ -36,6 +37,7 @@ class _UrlFetcher implements ImageProvider { ); } + @override bool operator ==(dynamic other) { if (other is! _UrlFetcher) return false; @@ -43,6 +45,7 @@ class _UrlFetcher implements ImageProvider { return _url == typedOther._url && _scale == typedOther._scale; } + @override int get hashCode => hashValues(_url, _scale); } diff --git a/packages/flutter/lib/src/services/image_resource.dart b/packages/flutter/lib/src/services/image_resource.dart index cc8e00891a..073821c81f 100644 --- a/packages/flutter/lib/src/services/image_resource.dart +++ b/packages/flutter/lib/src/services/image_resource.dart @@ -9,8 +9,11 @@ import 'print.dart'; class ImageInfo { ImageInfo({ this.image, this.scale: 1.0 }); + final ui.Image image; final double scale; + + @override String toString() => '$image @ ${scale}x'; } @@ -89,6 +92,7 @@ class ImageResource { debugPrint('------------------------------------------------------------------------'); } + @override String toString() { StringBuffer result = new StringBuffer(); result.write('$runtimeType('); diff --git a/packages/flutter/lib/src/widgets/app.dart b/packages/flutter/lib/src/widgets/app.dart index d1b91aa2a5..9b280d17c8 100644 --- a/packages/flutter/lib/src/widgets/app.dart +++ b/packages/flutter/lib/src/widgets/app.dart @@ -99,6 +99,7 @@ class WidgetsApp extends StatefulWidget { /// representative of what will happen in release mode. final bool debugShowCheckedModeBanner; + @override WidgetsAppState createState() => new WidgetsAppState(); } @@ -112,6 +113,7 @@ class WidgetsAppState extends State implements BindingO LocaleQueryData _localeData; + @override void initState() { super.initState(); _navigator = new GlobalObjectKey(this); @@ -119,11 +121,13 @@ class WidgetsAppState extends State implements BindingO WidgetFlutterBinding.instance.addObserver(this); } + @override void dispose() { WidgetFlutterBinding.instance.removeObserver(this); super.dispose(); } + @override bool didPopRoute() { assert(mounted); NavigatorState navigator = _navigator.currentState; @@ -135,6 +139,7 @@ class WidgetsAppState extends State implements BindingO return result; } + @override void didChangeMetrics() { setState(() { // The properties of ui.window have changed. We use them in our build @@ -142,6 +147,7 @@ class WidgetsAppState extends State implements BindingO }); } + @override void didChangeLocale(Locale locale) { if (config.onLocaleChanged != null) { config.onLocaleChanged(locale).then((LocaleQueryData data) { @@ -151,10 +157,12 @@ class WidgetsAppState extends State implements BindingO } } + @override void didChangeAppLifecycleState(AppLifecycleState state) { } NavigatorObserver get navigatorObserver => null; + @override Widget build(BuildContext context) { if (config.onLocaleChanged != null && _localeData == null) { // If the app expects a locale but we don't yet know the locale, then diff --git a/packages/flutter/lib/src/widgets/asset_vendor.dart b/packages/flutter/lib/src/widgets/asset_vendor.dart index 00d66903af..69cad02da3 100644 --- a/packages/flutter/lib/src/widgets/asset_vendor.dart +++ b/packages/flutter/lib/src/widgets/asset_vendor.dart @@ -33,6 +33,7 @@ class _ResolvingAssetBundle extends CachingAssetBundle { final Map keyCache = {}; + @override Future load(String key) async { if (!keyCache.containsKey(key)) keyCache[key] = await resolver.resolve(key); @@ -57,10 +58,12 @@ class _ResolutionAwareAssetBundle extends _ResolvingAssetBundle { resolver: resolver ); + @override _ResolutionAwareAssetResolver get resolver => super.resolver; final ImageDecoder _imageDecoder; + @override Future fetchImage(String key) async { core.MojoDataPipeConsumer pipe = await load(key); // At this point the key should be in our key cache, and the image @@ -93,6 +96,7 @@ abstract class _VariantAssetResolver extends _AssetResolver { _assetManifest = JSON.decode(json); } + @override Future resolve(String name) async { _initializer ??= _loadManifest(); await _initializer; @@ -146,6 +150,7 @@ class _ResolutionAwareAssetResolver extends _VariantAssetResolver { return candidates[lower]; } + @override String chooseVariant(String main, List candidates) { SplayTreeMap mapping = new SplayTreeMap(); for (String candidate in candidates) @@ -205,8 +210,10 @@ class AssetVendor extends StatefulWidget { final Widget child; final ImageDecoder imageDecoder; + @override _AssetVendorState createState() => new _AssetVendorState(); + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('bundle: $bundle'); @@ -230,11 +237,13 @@ class _AssetVendorState extends State { ); } + @override void initState() { super.initState(); _initBundle(); } + @override void didUpdateConfig(AssetVendor oldConfig) { if (config.bundle != oldConfig.bundle || config.devicePixelRatio != oldConfig.devicePixelRatio) { @@ -242,10 +251,12 @@ class _AssetVendorState extends State { } } + @override Widget build(BuildContext context) { return new DefaultAssetBundle(bundle: _bundle, child: config.child); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('bundle: $_bundle'); diff --git a/packages/flutter/lib/src/widgets/auto_layout.dart b/packages/flutter/lib/src/widgets/auto_layout.dart index cd4eed3d68..5e2fab2e59 100644 --- a/packages/flutter/lib/src/widgets/auto_layout.dart +++ b/packages/flutter/lib/src/widgets/auto_layout.dart @@ -19,8 +19,10 @@ class AutoLayout extends MultiChildRenderObjectWidget { final AutoLayoutDelegate delegate; + @override RenderAutoLayout createRenderObject(BuildContext context) => new RenderAutoLayout(delegate: delegate); + @override void updateRenderObject(BuildContext context, RenderAutoLayout renderObject) { renderObject.delegate = delegate; } @@ -32,6 +34,7 @@ class AutoLayoutChild extends ParentDataWidget { final AutoLayoutRect rect; + @override void applyParentData(RenderObject renderObject) { assert(renderObject.parentData is AutoLayoutParentData); final AutoLayoutParentData parentData = renderObject.parentData; diff --git a/packages/flutter/lib/src/widgets/basic.dart b/packages/flutter/lib/src/widgets/basic.dart index cb1c88e1d8..300600e7ac 100644 --- a/packages/flutter/lib/src/widgets/basic.dart +++ b/packages/flutter/lib/src/widgets/basic.dart @@ -68,12 +68,15 @@ class Opacity extends SingleChildRenderObjectWidget { /// (i.e., invisible). final double opacity; + @override RenderOpacity createRenderObject(BuildContext context) => new RenderOpacity(opacity: opacity); + @override void updateRenderObject(BuildContext context, RenderOpacity renderObject) { renderObject.opacity = opacity; } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('opacity: $opacity'); @@ -94,6 +97,7 @@ class ShaderMask extends SingleChildRenderObjectWidget { final ShaderCallback shaderCallback; final TransferMode transferMode; + @override RenderShaderMask createRenderObject(BuildContext context) { return new RenderShaderMask( shaderCallback: shaderCallback, @@ -101,6 +105,7 @@ class ShaderMask extends SingleChildRenderObjectWidget { ); } + @override void updateRenderObject(BuildContext context, RenderShaderMask renderObject) { renderObject ..shaderCallback = shaderCallback @@ -131,8 +136,10 @@ class DecoratedBox extends SingleChildRenderObjectWidget { /// Where to paint the box decoration. final DecorationPosition position; + @override RenderDecoratedBox createRenderObject(BuildContext context) => new RenderDecoratedBox(decoration: decoration, position: position); + @override void updateRenderObject(BuildContext context, RenderDecoratedBox renderObject) { renderObject ..decoration = decoration @@ -163,17 +170,20 @@ class CustomPaint extends SingleChildRenderObjectWidget { /// The painter that paints after the children. final CustomPainter foregroundPainter; + @override RenderCustomPaint createRenderObject(BuildContext context) => new RenderCustomPaint( painter: painter, foregroundPainter: foregroundPainter ); + @override void updateRenderObject(BuildContext context, RenderCustomPaint renderObject) { renderObject ..painter = painter ..foregroundPainter = foregroundPainter; } + @override void didUnmountRenderObject(RenderCustomPaint renderObject) { renderObject ..painter = null @@ -190,12 +200,15 @@ class ClipRect extends SingleChildRenderObjectWidget { /// If non-null, determines which clip to use. final CustomClipper clipper; + @override RenderClipRect createRenderObject(BuildContext context) => new RenderClipRect(clipper: clipper); + @override void updateRenderObject(BuildContext context, RenderClipRect renderObject) { renderObject.clipper = clipper; } + @override void didUnmountRenderObject(RenderClipRect renderObject) { renderObject.clipper = null; } @@ -222,8 +235,10 @@ class ClipRRect extends SingleChildRenderObjectWidget { /// object. final double yRadius; + @override RenderClipRRect createRenderObject(BuildContext context) => new RenderClipRRect(xRadius: xRadius, yRadius: yRadius); + @override void updateRenderObject(BuildContext context, RenderClipRRect renderObject) { renderObject ..xRadius = xRadius @@ -241,12 +256,15 @@ class ClipOval extends SingleChildRenderObjectWidget { /// If non-null, determines which clip to use. final CustomClipper clipper; + @override RenderClipOval createRenderObject(BuildContext context) => new RenderClipOval(clipper: clipper); + @override void updateRenderObject(BuildContext context, RenderClipOval renderObject) { renderObject.clipper = clipper; } + @override void didUnmountRenderObject(RenderClipOval renderObject) { renderObject.clipper = null; } @@ -281,6 +299,7 @@ class Transform extends SingleChildRenderObjectWidget { /// Whether to apply the translation when performing hit tests. final bool transformHitTests; + @override RenderTransform createRenderObject(BuildContext context) => new RenderTransform( transform: transform, origin: origin, @@ -288,6 +307,7 @@ class Transform extends SingleChildRenderObjectWidget { transformHitTests: transformHitTests ); + @override void updateRenderObject(BuildContext context, RenderTransform renderObject) { renderObject ..transform = transform @@ -311,8 +331,10 @@ class FractionalTranslation extends SingleChildRenderObjectWidget { /// Whether to apply the translation when performing hit tests. final bool transformHitTests; + @override RenderFractionalTranslation createRenderObject(BuildContext context) => new RenderFractionalTranslation(translation: translation, transformHitTests: transformHitTests); + @override void updateRenderObject(BuildContext context, RenderFractionalTranslation renderObject) { renderObject ..translation = translation @@ -334,8 +356,10 @@ class RotatedBox extends SingleChildRenderObjectWidget { /// The number of clockwise quarter turns the child should be rotated. final int quarterTurns; + @override RenderRotatedBox createRenderObject(BuildContext context) => new RenderRotatedBox(quarterTurns: quarterTurns); + @override void updateRenderObject(BuildContext context, RenderRotatedBox renderObject) { renderObject.quarterTurns = quarterTurns; } @@ -356,8 +380,10 @@ class Padding extends SingleChildRenderObjectWidget { /// The amount to pad the child in each dimension. final EdgeInsets padding; + @override RenderPadding createRenderObject(BuildContext context) => new RenderPadding(padding: padding); + @override void updateRenderObject(BuildContext context, RenderPadding renderObject) { renderObject.padding = padding; } @@ -407,8 +433,10 @@ class Align extends SingleChildRenderObjectWidget { /// Can be both greater and less than 1.0 but must be positive. final double heightFactor; + @override RenderPositionedBox createRenderObject(BuildContext context) => new RenderPositionedBox(alignment: alignment, widthFactor: widthFactor, heightFactor: heightFactor); + @override void updateRenderObject(BuildContext context, RenderPositionedBox renderObject) { renderObject ..alignment = alignment @@ -440,8 +468,10 @@ class CustomSingleChildLayout extends SingleChildRenderObjectWidget { final SingleChildLayoutDelegate delegate; + @override RenderCustomSingleChildLayoutBox createRenderObject(BuildContext context) => new RenderCustomSingleChildLayoutBox(delegate: delegate); + @override void updateRenderObject(BuildContext context, RenderCustomSingleChildLayoutBox renderObject) { renderObject.delegate = delegate; } @@ -461,6 +491,7 @@ class LayoutId extends ParentDataWidget { /// An object representing the identity of this child. final Object id; + @override void applyParentData(RenderObject renderObject) { assert(renderObject.parentData is MultiChildLayoutParentData); final MultiChildLayoutParentData parentData = renderObject.parentData; @@ -472,6 +503,7 @@ class LayoutId extends ParentDataWidget { } } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('id: $id'); @@ -498,10 +530,12 @@ class CustomMultiChildLayout extends MultiChildRenderObjectWidget { /// The delegate that controls the layout of the children. final MultiChildLayoutDelegate delegate; + @override RenderCustomMultiChildLayoutBox createRenderObject(BuildContext context) { return new RenderCustomMultiChildLayoutBox(delegate: delegate); } + @override void updateRenderObject(BuildContext context, RenderCustomMultiChildLayoutBox renderObject) { renderObject.delegate = delegate; } @@ -521,6 +555,7 @@ class SizedBox extends SingleChildRenderObjectWidget { /// If non-null, requires the child to have exactly this height. final double height; + @override RenderConstrainedBox createRenderObject(BuildContext context) => new RenderConstrainedBox( additionalConstraints: _additionalConstraints ); @@ -529,10 +564,12 @@ class SizedBox extends SingleChildRenderObjectWidget { return new BoxConstraints.tightFor(width: width, height: height); } + @override void updateRenderObject(BuildContext context, RenderConstrainedBox renderObject) { renderObject.additionalConstraints = _additionalConstraints; } + @override void debugFillDescription(List description) { super.debugFillDescription(description); if (width != null) @@ -556,12 +593,15 @@ class ConstrainedBox extends SingleChildRenderObjectWidget { /// The additional constraints to impose on the child. final BoxConstraints constraints; + @override RenderConstrainedBox createRenderObject(BuildContext context) => new RenderConstrainedBox(additionalConstraints: constraints); + @override void updateRenderObject(BuildContext context, RenderConstrainedBox renderObject) { renderObject.additionalConstraints = constraints; } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('$constraints'); @@ -587,17 +627,20 @@ class FractionallySizedBox extends SingleChildRenderObjectWidget { /// incoming height constraint multipled by this factor. final double height; + @override RenderFractionallySizedBox createRenderObject(BuildContext context) => new RenderFractionallySizedBox( widthFactor: width, heightFactor: height ); + @override void updateRenderObject(BuildContext context, RenderFractionallySizedBox renderObject) { renderObject ..widthFactor = width ..heightFactor = height; } + @override void debugFillDescription(List description) { super.debugFillDescription(description); if (width != null) @@ -649,6 +692,7 @@ class OverflowBox extends SingleChildRenderObjectWidget { /// with the center of the parent. final FractionalOffset alignment; + @override RenderOverflowBox createRenderObject(BuildContext context) => new RenderOverflowBox( minWidth: minWidth, maxWidth: maxWidth, @@ -657,6 +701,7 @@ class OverflowBox extends SingleChildRenderObjectWidget { alignment: alignment ); + @override void updateRenderObject(BuildContext context, RenderOverflowBox renderObject) { renderObject ..minWidth = minWidth @@ -666,6 +711,7 @@ class OverflowBox extends SingleChildRenderObjectWidget { ..alignment = alignment; } + @override void debugFillDescription(List description) { super.debugFillDescription(description); if (minWidth != null) @@ -685,8 +731,10 @@ class SizedOverflowBox extends SingleChildRenderObjectWidget { final Size size; + @override RenderSizedOverflowBox createRenderObject(BuildContext context) => new RenderSizedOverflowBox(requestedSize: size); + @override void updateRenderObject(BuildContext context, RenderSizedOverflowBox renderObject) { renderObject.requestedSize = size; } @@ -699,6 +747,7 @@ class OffStage extends SingleChildRenderObjectWidget { OffStage({ Key key, Widget child }) : super(key: key, child: child); + @override RenderOffStage createRenderObject(BuildContext context) => new RenderOffStage(); } @@ -740,12 +789,15 @@ class AspectRatio extends SingleChildRenderObjectWidget { /// a 16:9 width:height aspect ratio would have a value of 16.0/9.0. final double aspectRatio; + @override RenderAspectRatio createRenderObject(BuildContext context) => new RenderAspectRatio(aspectRatio: aspectRatio); + @override void updateRenderObject(BuildContext context, RenderAspectRatio renderObject) { renderObject.aspectRatio = aspectRatio; } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('aspectRatio: $aspectRatio'); @@ -774,8 +826,10 @@ class IntrinsicWidth extends SingleChildRenderObjectWidget { /// If non-null, force the child's height to be a multiple of this value. final double stepHeight; + @override RenderIntrinsicWidth createRenderObject(BuildContext context) => new RenderIntrinsicWidth(stepWidth: stepWidth, stepHeight: stepHeight); + @override void updateRenderObject(BuildContext context, RenderIntrinsicWidth renderObject) { renderObject ..stepWidth = stepWidth @@ -792,6 +846,8 @@ class IntrinsicWidth extends SingleChildRenderObjectWidget { /// This class is relatively expensive. Avoid using it where possible. class IntrinsicHeight extends SingleChildRenderObjectWidget { IntrinsicHeight({ Key key, Widget child }) : super(key: key, child: child); + + @override RenderIntrinsicHeight createRenderObject(BuildContext context) => new RenderIntrinsicHeight(); } @@ -810,8 +866,10 @@ class Baseline extends SingleChildRenderObjectWidget { /// The type of baseline to use for positioning the child. final TextBaseline baselineType; + @override RenderBaseline createRenderObject(BuildContext context) => new RenderBaseline(baseline: baseline, baselineType: baselineType); + @override void updateRenderObject(BuildContext context, RenderBaseline renderObject) { renderObject ..baseline = baseline @@ -863,6 +921,7 @@ class Viewport extends SingleChildRenderObjectWidget { final ViewportDimensionsChangeCallback onPaintOffsetUpdateNeeded; + @override RenderViewport createRenderObject(BuildContext context) { return new RenderViewport( paintOffset: paintOffset, @@ -873,6 +932,7 @@ class Viewport extends SingleChildRenderObjectWidget { ); } + @override void updateRenderObject(BuildContext context, RenderViewport renderObject) { // Order dependency: RenderViewport validates scrollOffset based on mainAxis. renderObject @@ -943,6 +1003,7 @@ class Container extends StatelessWidget { return padding + decorationPadding; } + @override Widget build(BuildContext context) { Widget current = child; @@ -976,6 +1037,7 @@ class Container extends StatelessWidget { return current; } + @override void debugFillDescription(List description) { super.debugFillDescription(description); if (constraints != null) @@ -1014,8 +1076,10 @@ class BlockBody extends MultiChildRenderObjectWidget { /// The direction to use as the main axis. final Axis mainAxis; + @override RenderBlock createRenderObject(BuildContext context) => new RenderBlock(mainAxis: mainAxis); + @override void updateRenderObject(BuildContext context, RenderBlock renderObject) { renderObject.mainAxis = mainAxis; } @@ -1054,8 +1118,10 @@ class Stack extends StackRenderObjectWidgetBase { /// How to align the non-positioned children in the stack. final FractionalOffset alignment; + @override RenderStack createRenderObject(BuildContext context) => new RenderStack(alignment: alignment); + @override void updateRenderObject(BuildContext context, RenderStack renderObject) { renderObject.alignment = alignment; } @@ -1078,8 +1144,10 @@ class IndexedStack extends StackRenderObjectWidgetBase { /// How to align the non-positioned children in the stack. final FractionalOffset alignment; + @override RenderIndexedStack createRenderObject(BuildContext context) => new RenderIndexedStack(index: index, alignment: alignment); + @override void updateRenderObject(BuildContext context, RenderIndexedStack renderObject) { renderObject ..index = index @@ -1143,6 +1211,7 @@ class Positioned extends ParentDataWidget { /// set. The third must be null. final double height; + @override void applyParentData(RenderObject renderObject) { assert(renderObject.parentData is StackParentData); final StackParentData parentData = renderObject.parentData; @@ -1185,6 +1254,7 @@ class Positioned extends ParentDataWidget { } } + @override void debugFillDescription(List description) { super.debugFillDescription(description); if (left != null) @@ -1215,8 +1285,10 @@ abstract class GridRenderObjectWidgetBase extends MultiChildRenderObjectWidget { /// The delegate that controls the layout of the children. GridDelegate createDelegate(); + @override RenderGrid createRenderObject(BuildContext context) => new RenderGrid(delegate: _delegate); + @override void updateRenderObject(BuildContext context, RenderGrid renderObject) { renderObject.delegate = _delegate; } @@ -1234,6 +1306,7 @@ class CustomGrid extends GridRenderObjectWidgetBase { /// The delegate that controls the layout of the children. final GridDelegate delegate; + @override GridDelegate createDelegate() => delegate; } @@ -1268,6 +1341,7 @@ class FixedColumnCountGrid extends GridRenderObjectWidgetBase { /// The amount of padding to apply to each child. final EdgeInsets padding; + @override FixedColumnCountGridDelegate createDelegate() { return new FixedColumnCountGridDelegate( columnCount: columnCount, @@ -1310,6 +1384,7 @@ class MaxTileWidthGrid extends GridRenderObjectWidgetBase { /// The amount of padding to apply to each child. final EdgeInsets padding; + @override MaxTileWidthGridDelegate createDelegate() { return new MaxTileWidthGridDelegate( maxTileWidth: maxTileWidth, @@ -1329,6 +1404,7 @@ class GridPlacementData extends /// Opaque data passed to the getChildPlacement method of the grid's [GridDelegate]. final DataType placementData; + @override void applyParentData(RenderObject renderObject) { assert(renderObject.parentData is GridParentData); final GridParentData parentData = renderObject.parentData; @@ -1340,6 +1416,7 @@ class GridPlacementData extends } } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('placementData: $placementData'); @@ -1369,8 +1446,10 @@ class Flex extends MultiChildRenderObjectWidget { final CrossAxisAlignment crossAxisAlignment; final TextBaseline textBaseline; + @override RenderFlex createRenderObject(BuildContext context) => new RenderFlex(direction: direction, mainAxisAlignment: mainAxisAlignment, crossAxisAlignment: crossAxisAlignment, textBaseline: textBaseline); + @override void updateRenderObject(BuildContext context, RenderFlex renderObject) { renderObject ..direction = direction @@ -1440,6 +1519,7 @@ class Flexible extends ParentDataWidget { /// according to the flex factors of the flexible children. final int flex; + @override void applyParentData(RenderObject renderObject) { assert(renderObject.parentData is FlexParentData); final FlexParentData parentData = renderObject.parentData; @@ -1451,6 +1531,7 @@ class Flexible extends ParentDataWidget { } } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('flex: $flex'); @@ -1468,8 +1549,10 @@ class RichText extends LeafRenderObjectWidget { final TextSpan text; + @override RenderParagraph createRenderObject(BuildContext context) => new RenderParagraph(text); + @override void updateRenderObject(BuildContext context, RenderParagraph renderObject) { renderObject.text = text; } @@ -1495,8 +1578,10 @@ class DefaultTextStyle extends InheritedWidget { return result?.style; } + @override bool updateShouldNotify(DefaultTextStyle old) => style != old.style; + @override void debugFillDescription(List description) { super.debugFillDescription(description); '$style'.split('\n').forEach(description.add); @@ -1529,6 +1614,7 @@ class Text extends StatelessWidget { return style; } + @override Widget build(BuildContext context) { return new RichText( text: new TextSpan( @@ -1538,6 +1624,7 @@ class Text extends StatelessWidget { ); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('"$data"'); @@ -1610,6 +1697,7 @@ class RawImage extends LeafRenderObjectWidget { /// the center slice will be stretched only vertically. final Rect centerSlice; + @override RenderImage createRenderObject(BuildContext context) => new RenderImage( image: image, width: width, @@ -1622,6 +1710,7 @@ class RawImage extends LeafRenderObjectWidget { centerSlice: centerSlice ); + @override void updateRenderObject(BuildContext context, RenderImage renderObject) { renderObject ..image = image @@ -1635,6 +1724,7 @@ class RawImage extends LeafRenderObjectWidget { ..centerSlice = centerSlice; } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('image: $image'); @@ -1721,8 +1811,10 @@ class RawImageResource extends StatefulWidget { /// the center slice will be stretched only vertically. final Rect centerSlice; + @override _RawImageResourceState createState() => new _RawImageResourceState(); + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('image: $image'); @@ -1744,6 +1836,7 @@ class RawImageResource extends StatefulWidget { } class _RawImageResourceState extends State { + @override void initState() { super.initState(); config.image.addListener(_handleImageChanged); @@ -1757,11 +1850,13 @@ class _RawImageResourceState extends State { }); } + @override void dispose() { config.image.removeListener(_handleImageChanged); super.dispose(); } + @override void didUpdateConfig(RawImageResource oldConfig) { if (config.image != oldConfig.image) { oldConfig.image.removeListener(_handleImageChanged); @@ -1769,6 +1864,7 @@ class _RawImageResourceState extends State { } } + @override Widget build(BuildContext context) { return new RawImage( image: _resolvedImage?.image, @@ -1844,6 +1940,7 @@ class NetworkImage extends StatelessWidget { /// the center slice will be stretched only vertically. final Rect centerSlice; + @override Widget build(BuildContext context) { return new RawImageResource( image: imageCache.load(src, scale: scale), @@ -1857,6 +1954,7 @@ class NetworkImage extends StatelessWidget { ); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('src: $src'); @@ -1902,6 +2000,7 @@ class DefaultAssetBundle extends InheritedWidget { return result?.bundle; } + @override bool updateShouldNotify(DefaultAssetBundle old) => bundle != old.bundle; } @@ -1963,6 +2062,7 @@ class AsyncImage extends StatelessWidget { /// the center slice will be stretched only vertically. final Rect centerSlice; + @override Widget build(BuildContext context) { return new RawImageResource( image: imageCache.loadProvider(provider), @@ -1976,6 +2076,7 @@ class AsyncImage extends StatelessWidget { ); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('provider: $provider'); @@ -2062,6 +2163,7 @@ class AssetImage extends StatelessWidget { /// the center slice will be stretched only vertically. final Rect centerSlice; + @override Widget build(BuildContext context) { return new RawImageResource( image: (bundle ?? DefaultAssetBundle.of(context)).loadImage(name), @@ -2075,6 +2177,7 @@ class AssetImage extends StatelessWidget { ); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('name: $name'); @@ -2122,8 +2225,10 @@ class WidgetToRenderBoxAdapter extends LeafRenderObjectWidget { /// tree will be dirty. final VoidCallback onBuild; + @override RenderBox createRenderObject(BuildContext context) => renderBox; + @override void updateRenderObject(BuildContext context, RenderBox renderObject) { if (onBuild != null) onBuild(); @@ -2152,6 +2257,7 @@ class Listener extends SingleChildRenderObjectWidget { final PointerCancelEventListener onPointerCancel; final HitTestBehavior behavior; + @override RenderPointerListener createRenderObject(BuildContext context) => new RenderPointerListener( onPointerDown: onPointerDown, onPointerMove: onPointerMove, @@ -2160,6 +2266,7 @@ class Listener extends SingleChildRenderObjectWidget { behavior: behavior ); + @override void updateRenderObject(BuildContext context, RenderPointerListener renderObject) { renderObject ..onPointerDown = onPointerDown @@ -2169,6 +2276,7 @@ class Listener extends SingleChildRenderObjectWidget { ..behavior = behavior; } + @override void debugFillDescription(List description) { super.debugFillDescription(description); List listeners = []; @@ -2208,6 +2316,8 @@ class Listener extends SingleChildRenderObjectWidget { /// for the surround tree. class RepaintBoundary extends SingleChildRenderObjectWidget { RepaintBoundary({ Key key, Widget child }) : super(key: key, child: child); + + @override RenderRepaintBoundary createRenderObject(BuildContext context) => new RenderRepaintBoundary(); } @@ -2218,11 +2328,13 @@ class IgnorePointer extends SingleChildRenderObjectWidget { final bool ignoring; final bool ignoringSemantics; // if null, defaults to value of ignoring + @override RenderIgnorePointer createRenderObject(BuildContext context) => new RenderIgnorePointer( ignoring: ignoring, ignoringSemantics: ignoringSemantics ); + @override void updateRenderObject(BuildContext context, RenderIgnorePointer renderObject) { renderObject ..ignoring = ignoring @@ -2268,12 +2380,14 @@ class Semantics extends SingleChildRenderObjectWidget { /// Provides a textual description of the widget. final String label; + @override RenderSemanticAnnotations createRenderObject(BuildContext context) => new RenderSemanticAnnotations( container: container, checked: checked, label: label ); + @override void updateRenderObject(BuildContext context, RenderSemanticAnnotations renderObject) { renderObject ..container = container @@ -2281,6 +2395,7 @@ class Semantics extends SingleChildRenderObjectWidget { ..label = label; } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('container: $container'); @@ -2310,6 +2425,8 @@ class Semantics extends SingleChildRenderObjectWidget { /// callbacks. class MergeSemantics extends SingleChildRenderObjectWidget { MergeSemantics({ Key key, Widget child }) : super(key: key, child: child); + + @override RenderMergeSemantics createRenderObject(BuildContext context) => new RenderMergeSemantics(); } @@ -2321,6 +2438,8 @@ class MergeSemantics extends SingleChildRenderObjectWidget { /// redundant with the chip label. class ExcludeSemantics extends SingleChildRenderObjectWidget { ExcludeSemantics({ Key key, Widget child }) : super(key: key, child: child); + + @override RenderExcludeSemantics createRenderObject(BuildContext context) => new RenderExcludeSemantics(); } @@ -2335,17 +2454,20 @@ class MetaData extends SingleChildRenderObjectWidget { final dynamic metaData; final HitTestBehavior behavior; + @override RenderMetaData createRenderObject(BuildContext context) => new RenderMetaData( metaData: metaData, behavior: behavior ); + @override void updateRenderObject(BuildContext context, RenderMetaData renderObject) { renderObject ..metaData = metaData ..behavior = behavior; } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('behavior: $behavior'); @@ -2359,6 +2481,7 @@ class KeyedSubtree extends StatelessWidget { final Widget child; + @override Widget build(BuildContext context) => child; } @@ -2373,15 +2496,20 @@ class Builder extends StatelessWidget { /// object identity. final WidgetBuilder builder; + @override Widget build(BuildContext context) => builder(context); } typedef Widget StatefulWidgetBuilder(BuildContext context, StateSetter setState); class StatefulBuilder extends StatefulWidget { StatefulBuilder({ Key key, this.builder }) : super(key: key); + final StatefulWidgetBuilder builder; + + @override _StatefulBuilderState createState() => new _StatefulBuilderState(); } class _StatefulBuilderState extends State { + @override Widget build(BuildContext context) => config.builder(context, setState); } diff --git a/packages/flutter/lib/src/widgets/binding.dart b/packages/flutter/lib/src/widgets/binding.dart index ac0cf19aaa..9d1b5cb91f 100644 --- a/packages/flutter/lib/src/widgets/binding.dart +++ b/packages/flutter/lib/src/widgets/binding.dart @@ -35,6 +35,7 @@ class WidgetFlutterBinding extends BindingBase with Scheduler, Gesturer, Service return _instance; } + @override void initInstances() { super.initInstances(); _instance = this; @@ -60,6 +61,7 @@ class WidgetFlutterBinding extends BindingBase with Scheduler, Gesturer, Service void addObserver(BindingObserver observer) => _observers.add(observer); bool removeObserver(BindingObserver observer) => _observers.remove(observer); + @override void handleMetricsChanged() { super.handleMetricsChanged(); for (BindingObserver observer in _observers) @@ -88,6 +90,7 @@ class WidgetFlutterBinding extends BindingBase with Scheduler, Gesturer, Service observer.didChangeAppLifecycleState(state); } + @override void beginFrame() { buildDirtyElements(); super.beginFrame(); @@ -190,10 +193,13 @@ class RenderObjectToWidgetAdapter extends RenderObjectWi final RenderObjectWithChildMixin container; final String debugShortDescription; + @override RenderObjectToWidgetElement createElement() => new RenderObjectToWidgetElement(this); + @override RenderObjectWithChildMixin createRenderObject(BuildContext context) => container; + @override void updateRenderObject(BuildContext context, RenderObject renderObject) { } RenderObjectToWidgetElement attachToRenderTree([RenderObjectToWidgetElement element]) { @@ -208,6 +214,7 @@ class RenderObjectToWidgetAdapter extends RenderObjectWi return element; } + @override String toStringShort() => debugShortDescription ?? super.toStringShort(); } @@ -222,40 +229,48 @@ class RenderObjectToWidgetAdapter extends RenderObjectWi class RenderObjectToWidgetElement extends RenderObjectElement { RenderObjectToWidgetElement(RenderObjectToWidgetAdapter widget) : super(widget); + @override RenderObjectToWidgetAdapter get widget => super.widget; Element _child; static const Object _rootChildSlot = const Object(); + @override void visitChildren(ElementVisitor visitor) { if (_child != null) visitor(_child); } + @override void mount(Element parent, dynamic newSlot) { assert(parent == null); super.mount(parent, newSlot); _child = updateChild(_child, widget.child, _rootChildSlot); } + @override void update(RenderObjectToWidgetAdapter newWidget) { super.update(newWidget); assert(widget == newWidget); _child = updateChild(_child, widget.child, _rootChildSlot); } + @override RenderObjectWithChildMixin get renderObject => super.renderObject; + @override void insertChildRenderObject(RenderObject child, dynamic slot) { assert(slot == _rootChildSlot); renderObject.child = child; } + @override void moveChildRenderObject(RenderObject child, dynamic slot) { assert(false); } + @override void removeChildRenderObject(RenderObject child) { assert(renderObject.child == child); renderObject.child = null; diff --git a/packages/flutter/lib/src/widgets/checked_mode_banner.dart b/packages/flutter/lib/src/widgets/checked_mode_banner.dart index 51a21b45ea..e819d4919c 100644 --- a/packages/flutter/lib/src/widgets/checked_mode_banner.dart +++ b/packages/flutter/lib/src/widgets/checked_mode_banner.dart @@ -30,6 +30,7 @@ class _CheckedModeBannerPainter extends CustomPainter { ..maxHeight = kHeight ..layout(); + @override void paint(Canvas canvas, Size size) { final Paint paintShadow = new Paint() ..color = const Color(0x7F000000) @@ -44,7 +45,10 @@ class _CheckedModeBannerPainter extends CustomPainter { textPainter.paint(canvas, kRect.topLeft.toOffset() + kTextAlign); } + @override bool shouldRepaint(_CheckedModeBannerPainter oldPainter) => false; + + @override bool hitTest(Point position) => false; } @@ -58,6 +62,7 @@ class CheckedModeBanner extends StatelessWidget { final Widget child; + @override Widget build(BuildContext context) { Widget result = child; assert(() { diff --git a/packages/flutter/lib/src/widgets/child_view.dart b/packages/flutter/lib/src/widgets/child_view.dart index a02b02b3c8..ccad34c388 100644 --- a/packages/flutter/lib/src/widgets/child_view.dart +++ b/packages/flutter/lib/src/widgets/child_view.dart @@ -14,6 +14,7 @@ class ChildView extends StatelessWidget { final ChildViewConnection child; + @override Widget build(BuildContext context) { assert(MediaQuery.of(context) != null); return new _ChildViewWidget( @@ -32,8 +33,10 @@ class _ChildViewWidget extends LeafRenderObjectWidget { final ChildViewConnection child; final double scale; + @override RenderChildView createRenderObject(BuildContext context) => new RenderChildView(child: child, scale: scale); + @override void updateRenderObject(BuildContext context, RenderChildView renderObject) { renderObject ..child = child diff --git a/packages/flutter/lib/src/widgets/dismissable.dart b/packages/flutter/lib/src/widgets/dismissable.dart index 8e599257f8..7aff20194f 100644 --- a/packages/flutter/lib/src/widgets/dismissable.dart +++ b/packages/flutter/lib/src/widgets/dismissable.dart @@ -89,10 +89,12 @@ class Dismissable extends StatefulWidget { /// The direction in which the widget can be dismissed. final DismissDirection direction; + @override _DismissableState createState() => new _DismissableState(); } class _DismissableState extends State { + @override void initState() { super.initState(); _moveController = new AnimationController(duration: _kDismissDuration) @@ -109,6 +111,7 @@ class _DismissableState extends State { double _dragExtent = 0.0; bool _dragUnderway = false; + @override void dispose() { _moveController?.stop(); _resizeController?.stop(); @@ -273,6 +276,7 @@ class _DismissableState extends State { } } + @override Widget build(BuildContext context) { Widget background = config.background; if (config.secondaryBackground != null) { diff --git a/packages/flutter/lib/src/widgets/drag_target.dart b/packages/flutter/lib/src/widgets/drag_target.dart index 26fc99f06c..be6798263f 100644 --- a/packages/flutter/lib/src/widgets/drag_target.dart +++ b/packages/flutter/lib/src/widgets/drag_target.dart @@ -82,6 +82,7 @@ abstract class DraggableBase extends StatefulWidget { /// constructed with the given arguments. MultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart); + @override _DraggableState createState() => new _DraggableState(); } @@ -107,6 +108,7 @@ class Draggable extends DraggableBase { maxSimultaneousDrags: maxSimultaneousDrags ); + @override ImmediateMultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) { return new ImmediateMultiDragGestureRecognizer()..onStart = onStart; } @@ -135,6 +137,7 @@ class HorizontalDraggable extends DraggableBase { maxSimultaneousDrags: maxSimultaneousDrags ); + @override HorizontalMultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) { return new HorizontalMultiDragGestureRecognizer()..onStart = onStart; } @@ -163,6 +166,7 @@ class VerticalDraggable extends DraggableBase { maxSimultaneousDrags: maxSimultaneousDrags ); + @override VerticalMultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) { return new VerticalMultiDragGestureRecognizer()..onStart = onStart; } @@ -190,6 +194,7 @@ class LongPressDraggable extends DraggableBase { maxSimultaneousDrags: maxSimultaneousDrags ); + @override DelayedMultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) { return new DelayedMultiDragGestureRecognizer() ..onStart = (Point position) { @@ -203,6 +208,7 @@ class LongPressDraggable extends DraggableBase { class _DraggableState extends State> { + @override void initState() { super.initState(); _recognizer = config.createRecognizer(_startDrag); @@ -248,6 +254,7 @@ class _DraggableState extends State> { ); } + @override Widget build(BuildContext context) { assert(Overlay.of(context, debugRequiredFor: config) != null); final bool canDrag = config.maxSimultaneousDrags == null || @@ -282,6 +289,7 @@ class DragTarget extends StatefulWidget { /// Called when an acceptable piece of data was dropped over this drag target. final DragTargetAccept onAccept; + @override _DragTargetState createState() => new _DragTargetState(); } @@ -319,6 +327,7 @@ class _DragTargetState extends State> { config.onAccept(data); } + @override Widget build(BuildContext context) { return new MetaData( metaData: this, @@ -368,13 +377,18 @@ class _DragAvatar extends Drag { OverlayEntry _entry; // Drag API + @override void move(Offset offset) { _position += offset; update(_position); } + + @override void end(Velocity velocity) { finish(_DragEndKind.dropped); } + + @override void cancel() { finish(_DragEndKind.canceled); } diff --git a/packages/flutter/lib/src/widgets/editable.dart b/packages/flutter/lib/src/widgets/editable.dart index e722cfa756..0abfd02c4a 100644 --- a/packages/flutter/lib/src/widgets/editable.dart +++ b/packages/flutter/lib/src/widgets/editable.dart @@ -63,6 +63,7 @@ class _KeyboardClientImpl implements mojom.KeyboardClient { ..composingExtent = inputValue.composing.end; } + @override void updateEditingState(mojom.EditingState state) { inputValue = new InputValue( text: state.text, @@ -76,6 +77,7 @@ class _KeyboardClientImpl implements mojom.KeyboardClient { inputValue = inputValue.copyWith(composing: TextRange.empty); } + @override void submit(mojom.SubmitAction action) { clearComposing(); onSubmitted(); @@ -101,8 +103,10 @@ class InputValue { static const InputValue empty = const InputValue(); + @override String toString() => '$runtimeType(text: \u2524$text\u251C, selection: $selection, composing: $composing)'; + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -114,6 +118,7 @@ class InputValue { && typedOther.composing == composing; } + @override int get hashCode => hashValues( text.hashCode, selection.hashCode, @@ -182,6 +187,7 @@ class RawInputLine extends Scrollable { /// Called when the user indicates that they are done editing the text in the field. final ValueChanged onSubmitted; + @override RawInputLineState createState() => new RawInputLineState(); } @@ -192,9 +198,13 @@ class RawInputLineState extends ScrollableState { _KeyboardClientImpl _keyboardClient; KeyboardHandle _keyboardHandle; + @override ScrollBehavior createScrollBehavior() => new BoundedBehavior(); + + @override BoundedBehavior get scrollBehavior => super.scrollBehavior; + @override void initState() { super.initState(); _keyboardClient = new _KeyboardClientImpl( @@ -204,6 +214,7 @@ class RawInputLineState extends ScrollableState { ); } + @override void didUpdateConfig(RawInputLine oldConfig) { if (_keyboardClient.inputValue != config.value) { _keyboardClient.inputValue = config.value; @@ -300,6 +311,7 @@ class RawInputLineState extends ScrollableState { _cursorTimer = new Timer.periodic(_kCursorBlinkHalfPeriod, _cursorTick); } + @override void dispose() { if (_isAttachedToKeyboard) _keyboardHandle.release(); @@ -314,6 +326,7 @@ class RawInputLineState extends ScrollableState { _showCursor = false; } + @override Widget buildContent(BuildContext context) { assert(config.style != null); assert(config.focusKey != null); @@ -365,6 +378,7 @@ class _EditableLineWidget extends LeafRenderObjectWidget { final Offset paintOffset; final ViewportDimensionsChangeCallback onPaintOffsetUpdateNeeded; + @override RenderEditableLine createRenderObject(BuildContext context) { return new RenderEditableLine( text: _styledTextSpan, @@ -378,6 +392,7 @@ class _EditableLineWidget extends LeafRenderObjectWidget { ); } + @override void updateRenderObject(BuildContext context, RenderEditableLine renderObject) { renderObject ..text = _styledTextSpan diff --git a/packages/flutter/lib/src/widgets/focus.dart b/packages/flutter/lib/src/widgets/focus.dart index 767676b7f7..ab9904e4a3 100644 --- a/packages/flutter/lib/src/widgets/focus.dart +++ b/packages/flutter/lib/src/widgets/focus.dart @@ -44,6 +44,7 @@ class _FocusScope extends InheritedWidget { focusedScope = focusState._focusedScope == _noFocusedScope ? null : focusState._focusedScope; } + @override bool updateShouldNotify(_FocusScope oldWidget) { if (scopeFocused != oldWidget.scopeFocused) return true; @@ -58,6 +59,7 @@ class _FocusScope extends InheritedWidget { return false; } + @override void debugFillDescription(List description) { super.debugFillDescription(description); if (scopeFocused) @@ -189,16 +191,19 @@ class Focus extends StatefulWidget { focusScope.focusState._setFocusedScope(key); } + @override _FocusState createState() => new _FocusState(); } class _FocusState extends State { + @override void initState() { super.initState(); _updateWidgetRemovalListener(_focusedWidget); _updateScopeRemovalListener(_focusedScope); } + @override void dispose() { _updateWidgetRemovalListener(null); _updateScopeRemovalListener(null); @@ -291,6 +296,7 @@ class _FocusState extends State { Scrollable.ensureVisible(focusedContext); } + @override Widget build(BuildContext context) { MediaQueryData data = MediaQuery.of(context); if (data != null) { diff --git a/packages/flutter/lib/src/widgets/framework.dart b/packages/flutter/lib/src/widgets/framework.dart index c4f3973b64..4e61e86456 100644 --- a/packages/flutter/lib/src/widgets/framework.dart +++ b/packages/flutter/lib/src/widgets/framework.dart @@ -32,20 +32,29 @@ abstract class Key { /// their values match. class ValueKey extends Key { const ValueKey(this.value) : super.constructor(); + final T value; + + @override bool operator ==(dynamic other) { if (other is! ValueKey) return false; final ValueKey typedOther = other; return value == typedOther.value; } + + @override int get hashCode => value.hashCode; + + @override String toString() => '[\'$value\']'; } /// A [Key] that is only equal to itself. class UniqueKey extends Key { const UniqueKey() : super.constructor(); + + @override String toString() => '[$hashCode]'; } @@ -55,14 +64,21 @@ class UniqueKey extends Key { /// generate that Widget. class ObjectKey extends Key { const ObjectKey(this.value) : super.constructor(); + final Object value; + + @override bool operator ==(dynamic other) { if (other is! ObjectKey) return false; final ObjectKey typedOther = other; return identical(value, typedOther.value); } + + @override int get hashCode => identityHashCode(value); + + @override String toString() => '[${value.runtimeType}(${value.hashCode})]'; } @@ -181,7 +197,10 @@ abstract class GlobalKey> extends Key { /// the key's identity. class LabeledGlobalKey> extends GlobalKey { const LabeledGlobalKey(this._debugLabel) : super.constructor(); + final String _debugLabel; + + @override String toString() => '[GlobalKey ${_debugLabel != null ? _debugLabel : hashCode}]'; } @@ -192,13 +211,19 @@ class LabeledGlobalKey> extends GlobalKey { class GlobalObjectKey extends GlobalKey { const GlobalObjectKey(this.value) : super.constructor(); final Object value; + + @override bool operator ==(dynamic other) { if (other is! GlobalObjectKey) return false; final GlobalObjectKey typedOther = other; return identical(value, typedOther.value); } + + @override int get hashCode => identityHashCode(value); + + @override String toString() => '[$runtimeType ${value.runtimeType}(${value.hashCode})]'; } @@ -224,6 +249,7 @@ abstract class Widget { return key == null ? '$runtimeType' : '$runtimeType-$key'; } + @override String toString() { final String name = toStringShort(); final List data = []; @@ -251,6 +277,7 @@ abstract class StatelessWidget extends Widget { /// StatelessWidget always use [StatelessElement]s to represent /// themselves in the Element tree. + @override StatelessElement createElement() => new StatelessElement(this); /// Returns another Widget out of which this StatelessWidget is built. @@ -271,6 +298,7 @@ abstract class StatefulWidget extends Widget { /// StatefulWidget always use [StatefulElement]s to represent /// themselves in the Element tree. + @override StatefulElement createElement() => new StatefulElement(this); /// Returns an instance of the state to which this StatefulWidget is @@ -390,6 +418,7 @@ abstract class State { /// called. void dependenciesChanged(Type affectedWidgetType) { } + @override String toString() { final List data = []; debugFillDescription(data); @@ -420,6 +449,7 @@ abstract class ParentDataWidget extends _ProxyWidg const ParentDataWidget({ Key key, Widget child }) : super(key: key, child: child); + @override ParentDataElement createElement() => new ParentDataElement(this); /// Subclasses should override this function to return true if the given @@ -468,6 +498,7 @@ abstract class InheritedWidget extends _ProxyWidget { const InheritedWidget({ Key key, Widget child }) : super(key: key, child: child); + @override InheritedElement createElement() => new InheritedElement(this); bool updateShouldNotify(InheritedWidget oldWidget); @@ -480,6 +511,7 @@ abstract class RenderObjectWidget extends Widget { const RenderObjectWidget({ Key key }) : super(key: key); /// RenderObjectWidgets always inflate to a RenderObjectElement subclass. + @override RenderObjectElement createElement(); /// Constructs an instance of the RenderObject class that this @@ -500,6 +532,7 @@ abstract class RenderObjectWidget extends Widget { abstract class LeafRenderObjectWidget extends RenderObjectWidget { const LeafRenderObjectWidget({ Key key }) : super(key: key); + @override LeafRenderObjectElement createElement() => new LeafRenderObjectElement(this); } @@ -511,6 +544,7 @@ abstract class SingleChildRenderObjectWidget extends RenderObjectWidget { final Widget child; + @override SingleChildRenderObjectElement createElement() => new SingleChildRenderObjectElement(this); } @@ -527,6 +561,7 @@ abstract class MultiChildRenderObjectWidget extends RenderObjectWidget { final List children; + @override MultiChildRenderObjectElement createElement() => new MultiChildRenderObjectElement(this); } @@ -633,6 +668,7 @@ abstract class Element implements BuildContext { int _depth; /// The configuration for this element. + @override Widget get widget => _widget; Widget _widget; @@ -658,6 +694,7 @@ abstract class Element implements BuildContext { void visitChildren(ElementVisitor visitor) { } /// Wrapper around visitChildren for BuildContext. + @override void visitChildElements(void visitor(Element element)) { // don't allow visitChildElements() during build, since children aren't necessarily built yet assert(!BuildableElement._debugStateLocked); @@ -908,10 +945,13 @@ abstract class Element implements BuildContext { assert(() { _debugLifecycleState = _ElementLifecycle.defunct; return true; }); } + @override RenderObject findRenderObject() => renderObject; Map _inheritedWidgets; Set _dependencies; + + @override InheritedWidget inheritFromWidgetOfExactType(Type targetType) { InheritedElement ancestor = _inheritedWidgets == null ? null : _inheritedWidgets[targetType]; if (ancestor != null) { @@ -928,6 +968,7 @@ abstract class Element implements BuildContext { _inheritedWidgets = _parent?._inheritedWidgets; } + @override Widget ancestorWidgetOfExactType(Type targetType) { Element ancestor = _parent; while (ancestor != null && ancestor.widget.runtimeType != targetType) @@ -935,6 +976,7 @@ abstract class Element implements BuildContext { return ancestor?.widget; } + @override State ancestorStateOfType(TypeMatcher matcher) { Element ancestor = _parent; while (ancestor != null) { @@ -946,6 +988,7 @@ abstract class Element implements BuildContext { return statefulAncestor?.state; } + @override RenderObject ancestorRenderObjectOfType(TypeMatcher matcher) { Element ancestor = _parent; while (ancestor != null) { @@ -957,6 +1000,7 @@ abstract class Element implements BuildContext { return renderObjectAncestor?.renderObject; } + @override void visitAncestorElements(bool visitor(Element element)) { Element ancestor = _parent; while (ancestor != null && visitor(ancestor)) @@ -983,6 +1027,7 @@ abstract class Element implements BuildContext { return widget != null ? '${widget.toStringShort()}' : '[$runtimeType]'; } + @override String toString() { final List data = []; debugFillDescription(data); @@ -1026,13 +1071,17 @@ class ErrorWidget extends LeafRenderObjectWidget { Object exception ) : message = _stringify(exception), super(key: new UniqueKey()); + final String message; + static String _stringify(Object exception) { try { return exception.toString(); } catch (e) { } return 'Error'; } + + @override RenderBox createRenderObject(BuildContext context) => new RenderErrorBox(message); } @@ -1182,10 +1231,12 @@ abstract class BuildableElement extends Element { /// Called by rebuild() after the appropriate checks have been made. void performRebuild(); + @override void dependenciesChanged(Type affectedWidgetType) { markNeedsBuild(); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); if (dirty) @@ -1203,6 +1254,7 @@ abstract class ComponentElement extends BuildableElement { WidgetBuilder _builder; Element _child; + @override void mount(Element parent, dynamic newSlot) { super.mount(parent, newSlot); assert(_child == null); @@ -1221,6 +1273,7 @@ abstract class ComponentElement extends BuildableElement { /// /// Called automatically during mount() to generate the first build, and by /// rebuild() when the element needs updating. + @override void performRebuild() { assert(_debugSetAllowIgnoredCallsToMarkNeedsBuild(true)); Widget built; @@ -1257,11 +1310,13 @@ abstract class ComponentElement extends BuildableElement { } } + @override void visitChildren(ElementVisitor visitor) { if (_child != null) visitor(_child); } + @override bool detachChild(Element child) { assert(child == _child); _deactivateChild(_child); @@ -1276,8 +1331,10 @@ class StatelessElement extends ComponentElement { _builder = widget.build; } + @override StatelessWidget get widget => super.widget; + @override void update(StatelessWidget newWidget) { super.update(newWidget); assert(widget == newWidget); @@ -1304,6 +1361,7 @@ class StatefulElement extends ComponentElement { State get state => _state; State _state; + @override void _firstBuild() { assert(_state._debugLifecycleState == _StateLifecycle.created); try { @@ -1325,6 +1383,7 @@ class StatefulElement extends ComponentElement { super._firstBuild(); } + @override void update(StatefulWidget newWidget) { super.update(newWidget); assert(widget == newWidget); @@ -1343,11 +1402,13 @@ class StatefulElement extends ComponentElement { rebuild(); } + @override void deactivate() { _state.deactivate(); super.deactivate(); } + @override void unmount() { super.unmount(); _state.dispose(); @@ -1365,11 +1426,13 @@ class StatefulElement extends ComponentElement { _state = null; } + @override void dependenciesChanged(Type affectedWidgetType) { super.dependenciesChanged(affectedWidgetType); _state.dependenciesChanged(affectedWidgetType); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); if (state != null) @@ -1382,10 +1445,12 @@ abstract class _ProxyElement extends ComponentElement { _builder = _build; } + @override _ProxyWidget get widget => super.widget; Widget _build(BuildContext context) => widget.child; + @override void update(_ProxyWidget newWidget) { _ProxyWidget oldWidget = widget; assert(widget != null); @@ -1403,8 +1468,10 @@ abstract class _ProxyElement extends ComponentElement { class ParentDataElement extends _ProxyElement { ParentDataElement(ParentDataWidget widget) : super(widget); + @override ParentDataWidget get widget => super.widget; + @override void mount(Element parent, dynamic slot) { assert(() { List badAncestors = []; @@ -1434,6 +1501,7 @@ class ParentDataElement extends _ProxyElement { super.mount(parent, slot); } + @override void notifyDescendants(ParentDataWidget oldWidget) { void notifyChildren(Element child) { if (child is RenderObjectElement) { @@ -1452,10 +1520,12 @@ class ParentDataElement extends _ProxyElement { class InheritedElement extends _ProxyElement { InheritedElement(InheritedWidget widget) : super(widget); + @override InheritedWidget get widget => super.widget; final Set _dependants = new HashSet(); + @override void _updateInheritance() { final Map incomingWidgets = _parent?._inheritedWidgets; if (incomingWidgets != null) @@ -1465,6 +1535,7 @@ class InheritedElement extends _ProxyElement { _inheritedWidgets[widget.runtimeType] = this; } + @override void debugDeactivated() { assert(() { assert(_dependants.isEmpty); @@ -1473,6 +1544,7 @@ class InheritedElement extends _ProxyElement { super.debugDeactivated(); } + @override void notifyDescendants(InheritedWidget oldWidget) { if (!widget.updateShouldNotify(oldWidget)) return; @@ -1494,9 +1566,11 @@ class InheritedElement extends _ProxyElement { abstract class RenderObjectElement extends BuildableElement { RenderObjectElement(RenderObjectWidget widget) : super(widget); + @override RenderObjectWidget get widget => super.widget; /// The underlying [RenderObject] for this element + @override RenderObject get renderObject => _renderObject; RenderObject _renderObject; @@ -1519,6 +1593,7 @@ abstract class RenderObjectElement extends BuildableElement { return null; } + @override void mount(Element parent, dynamic newSlot) { super.mount(parent, newSlot); _renderObject = widget.createRenderObject(this); @@ -1528,6 +1603,7 @@ abstract class RenderObjectElement extends BuildableElement { _dirty = false; } + @override void update(RenderObjectWidget newWidget) { super.update(newWidget); assert(widget == newWidget); @@ -1540,6 +1616,7 @@ abstract class RenderObjectElement extends BuildableElement { _renderObject.debugOwner = debugGetOwnershipChain(10); } + @override void performRebuild() { _dirty = false; } @@ -1703,11 +1780,13 @@ abstract class RenderObjectElement extends BuildableElement { return newChildren; } + @override void deactivate() { super.deactivate(); assert(!renderObject.attached); } + @override void unmount() { super.unmount(); assert(!renderObject.attached); @@ -1718,6 +1797,7 @@ abstract class RenderObjectElement extends BuildableElement { parentData.applyParentData(renderObject); } + @override void _updateSlot(dynamic newSlot) { assert(slot != newSlot); super._updateSlot(newSlot); @@ -1725,6 +1805,7 @@ abstract class RenderObjectElement extends BuildableElement { _ancestorRenderObjectElement.moveChildRenderObject(renderObject, slot); } + @override void attachRenderObject(dynamic newSlot) { assert(_ancestorRenderObjectElement == null); _slot = newSlot; @@ -1735,6 +1816,7 @@ abstract class RenderObjectElement extends BuildableElement { updateParentData(parentDataElement.widget); } + @override void detachRenderObject() { if (_ancestorRenderObjectElement != null) { _ancestorRenderObjectElement.removeChildRenderObject(renderObject); @@ -1747,6 +1829,7 @@ abstract class RenderObjectElement extends BuildableElement { void moveChildRenderObject(RenderObject child, dynamic slot); void removeChildRenderObject(RenderObject child); + @override void debugFillDescription(List description) { super.debugFillDescription(description); if (renderObject != null) @@ -1758,14 +1841,17 @@ abstract class RenderObjectElement extends BuildableElement { class LeafRenderObjectElement extends RenderObjectElement { LeafRenderObjectElement(LeafRenderObjectWidget widget): super(widget); + @override void insertChildRenderObject(RenderObject child, dynamic slot) { assert(false); } + @override void moveChildRenderObject(RenderObject child, dynamic slot) { assert(false); } + @override void removeChildRenderObject(RenderObject child) { assert(false); } @@ -1775,15 +1861,18 @@ class LeafRenderObjectElement extends RenderObjectElement { class SingleChildRenderObjectElement extends RenderObjectElement { SingleChildRenderObjectElement(SingleChildRenderObjectWidget widget) : super(widget); + @override SingleChildRenderObjectWidget get widget => super.widget; Element _child; + @override void visitChildren(ElementVisitor visitor) { if (_child != null) visitor(_child); } + @override bool detachChild(Element child) { assert(child == _child); _deactivateChild(_child); @@ -1791,17 +1880,20 @@ class SingleChildRenderObjectElement extends RenderObjectElement { return true; } + @override void mount(Element parent, dynamic newSlot) { super.mount(parent, newSlot); _child = updateChild(_child, widget.child, null); } + @override void update(SingleChildRenderObjectWidget newWidget) { super.update(newWidget); assert(widget == newWidget); _child = updateChild(_child, widget.child, null); } + @override void insertChildRenderObject(RenderObject child, dynamic slot) { final RenderObjectWithChildMixin renderObject = this.renderObject; assert(slot == null); @@ -1809,10 +1901,12 @@ class SingleChildRenderObjectElement extends RenderObjectElement { assert(renderObject == this.renderObject); } + @override void moveChildRenderObject(RenderObject child, dynamic slot) { assert(false); } + @override void removeChildRenderObject(RenderObject child) { final RenderObjectWithChildMixin renderObject = this.renderObject; assert(renderObject.child == child); @@ -1827,6 +1921,7 @@ class MultiChildRenderObjectElement extends RenderObjectElement { assert(!_debugHasDuplicateIds()); } + @override MultiChildRenderObjectWidget get widget => super.widget; List _children; @@ -1834,18 +1929,21 @@ class MultiChildRenderObjectElement extends RenderObjectElement { // repeatedly to remove children. final Set _detachedChildren = new HashSet(); + @override void insertChildRenderObject(RenderObject child, Element slot) { final ContainerRenderObjectMixin> renderObject = this.renderObject; renderObject.insert(child, after: slot?.renderObject); assert(renderObject == this.renderObject); } + @override void moveChildRenderObject(RenderObject child, dynamic slot) { final ContainerRenderObjectMixin> renderObject = this.renderObject; renderObject.move(child, after: slot?.renderObject); assert(renderObject == this.renderObject); } + @override void removeChildRenderObject(RenderObject child) { final ContainerRenderObjectMixin> renderObject = this.renderObject; assert(child.parent == renderObject); @@ -1871,6 +1969,7 @@ class MultiChildRenderObjectElement extends RenderObjectElement { return false; } + @override void visitChildren(ElementVisitor visitor) { for (Element child in _children) { if (!_detachedChildren.contains(child)) @@ -1878,12 +1977,14 @@ class MultiChildRenderObjectElement extends RenderObjectElement { } } + @override bool detachChild(Element child) { _detachedChildren.add(child); _deactivateChild(child); return true; } + @override void mount(Element parent, dynamic newSlot) { super.mount(parent, newSlot); _children = new List(widget.children.length); @@ -1895,6 +1996,7 @@ class MultiChildRenderObjectElement extends RenderObjectElement { } } + @override void update(MultiChildRenderObjectWidget newWidget) { super.update(newWidget); assert(widget == newWidget); @@ -1906,6 +2008,8 @@ class MultiChildRenderObjectElement extends RenderObjectElement { class WidgetError extends AssertionError { WidgetError(this.message); final String message; + + @override String toString() => message; } diff --git a/packages/flutter/lib/src/widgets/gesture_detector.dart b/packages/flutter/lib/src/widgets/gesture_detector.dart index 71a4998330..cd0fde5bc2 100644 --- a/packages/flutter/lib/src/widgets/gesture_detector.dart +++ b/packages/flutter/lib/src/widgets/gesture_detector.dart @@ -157,6 +157,7 @@ class GestureDetector extends StatelessWidget { /// duplication of information. final bool excludeFromSemantics; + @override Widget build(BuildContext context) { Map gestures = {}; @@ -261,6 +262,7 @@ class RawGestureDetector extends StatefulWidget { /// duplication of information. final bool excludeFromSemantics; + @override RawGestureDetectorState createState() => new RawGestureDetectorState(); } @@ -268,11 +270,13 @@ class RawGestureDetectorState extends State { Map _recognizers = const {}; + @override void initState() { super.initState(); _syncAll(config.gestures); } + @override void didUpdateConfig(RawGestureDetector oldConfig) { _syncAll(config.gestures); } @@ -308,6 +312,7 @@ class RawGestureDetectorState extends State { } } + @override void dispose() { for (GestureRecognizer recognizer in _recognizers.values) recognizer.dispose(); @@ -340,6 +345,7 @@ class RawGestureDetectorState extends State { return config.child == null ? HitTestBehavior.translucent : HitTestBehavior.deferToChild; } + @override Widget build(BuildContext context) { Widget result = new Listener( onPointerDown: _handlePointerDown, @@ -351,6 +357,7 @@ class RawGestureDetectorState extends State { return result; } + @override void debugFillDescription(List description) { super.debugFillDescription(description); if (_recognizers == null) { @@ -458,12 +465,14 @@ class _GestureSemantics extends SingleChildRenderObjectWidget { assert(false); } + @override RenderSemanticsGestureHandler createRenderObject(BuildContext context) { RenderSemanticsGestureHandler result = new RenderSemanticsGestureHandler(); updateRenderObject(context, result); return result; } + @override void updateRenderObject(BuildContext context, RenderSemanticsGestureHandler renderObject) { Map recognizers = owner._recognizers; renderObject diff --git a/packages/flutter/lib/src/widgets/gridpaper.dart b/packages/flutter/lib/src/widgets/gridpaper.dart index 39138b44f6..bf58684eec 100644 --- a/packages/flutter/lib/src/widgets/gridpaper.dart +++ b/packages/flutter/lib/src/widgets/gridpaper.dart @@ -20,6 +20,7 @@ class _GridPaperPainter extends CustomPainter { final int divisions; final int subDivisions; + @override void paint(Canvas canvas, Size size) { Paint linePaint = new Paint() ..color = color; @@ -34,6 +35,7 @@ class _GridPaperPainter extends CustomPainter { } } + @override bool shouldRepaint(_GridPaperPainter oldPainter) { return oldPainter.color != color || oldPainter.interval != interval @@ -41,6 +43,7 @@ class _GridPaperPainter extends CustomPainter { || oldPainter.subDivisions != subDivisions; } + @override bool hitTest(Point position) => false; } @@ -70,6 +73,7 @@ class GridPaper extends StatelessWidget { final Widget child; + @override Widget build(BuildContext context) { return new CustomPaint( foregroundPainter: new _GridPaperPainter( diff --git a/packages/flutter/lib/src/widgets/heroes.dart b/packages/flutter/lib/src/widgets/heroes.dart index f80e087db6..3b78f407cb 100644 --- a/packages/flutter/lib/src/widgets/heroes.dart +++ b/packages/flutter/lib/src/widgets/heroes.dart @@ -146,6 +146,7 @@ class Hero extends StatefulWidget { return result; } + @override HeroState createState() => new HeroState(); } @@ -154,8 +155,10 @@ class HeroState extends State implements HeroHandle { GlobalKey _key = new GlobalKey(); Size _placeholderSize; + @override bool get alwaysAnimate => config.alwaysAnimate; + @override _HeroManifest _takeChild(Rect animationArea, Animation currentAnimation) { assert(mounted); final RenderBox renderObject = context.findRenderObject(); @@ -198,6 +201,7 @@ class HeroState extends State implements HeroHandle { _setChild(null); } + @override Widget build(BuildContext context) { if (_placeholderSize != null) { assert(_key == null); @@ -237,10 +241,13 @@ class _HeroQuestState implements HeroHandle { final RelativeRectTween currentRect; final Tween currentTurns; + @override bool get alwaysAnimate => true; bool get taken => _taken; bool _taken = false; + + @override _HeroManifest _takeChild(Rect animationArea, Animation currentAnimation) { assert(!taken); _taken = true; @@ -386,6 +393,7 @@ class HeroParty { } } + @override String toString() => '$_heroes'; } @@ -401,6 +409,7 @@ class HeroController extends NavigatorObserver { final List _overlayEntries = new List(); + @override void didPush(Route route, Route previousRoute) { assert(navigator != null); assert(route != null); @@ -414,6 +423,7 @@ class HeroController extends NavigatorObserver { } } + @override void didPop(Route route, Route previousRoute) { assert(navigator != null); assert(route != null); diff --git a/packages/flutter/lib/src/widgets/implicit_animations.dart b/packages/flutter/lib/src/widgets/implicit_animations.dart index 7508246eb8..359cf66254 100644 --- a/packages/flutter/lib/src/widgets/implicit_animations.dart +++ b/packages/flutter/lib/src/widgets/implicit_animations.dart @@ -11,6 +11,7 @@ import 'package:vector_math/vector_math_64.dart'; class BoxConstraintsTween extends Tween { BoxConstraintsTween({ BoxConstraints begin, BoxConstraints end }) : super(begin: begin, end: end); + @override BoxConstraints lerp(double t) => BoxConstraints.lerp(begin, end, t); } @@ -18,6 +19,7 @@ class BoxConstraintsTween extends Tween { class DecorationTween extends Tween { DecorationTween({ Decoration begin, Decoration end }) : super(begin: begin, end: end); + @override Decoration lerp(double t) { if (begin == null && end == null) return null; @@ -31,6 +33,7 @@ class DecorationTween extends Tween { class EdgeInsetsTween extends Tween { EdgeInsetsTween({ EdgeInsets begin, EdgeInsets end }) : super(begin: begin, end: end); + @override EdgeInsets lerp(double t) => EdgeInsets.lerp(begin, end, t); } @@ -40,6 +43,7 @@ class EdgeInsetsTween extends Tween { class Matrix4Tween extends Tween { Matrix4Tween({ Matrix4 begin, Matrix4 end }) : super(begin: begin, end: end); + @override Matrix4 lerp(double t) { // TODO(mpcomplete): Animate the full matrix. Will animating the cells // separately work? @@ -68,8 +72,10 @@ abstract class AnimatedWidgetBase extends StatefulWidget { /// The duration over which to animate the parameters of this container. final Duration duration; + @override AnimatedWidgetBaseState createState(); + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('duration: ${duration.inMilliseconds}ms'); @@ -90,6 +96,7 @@ abstract class AnimatedWidgetBaseState extends Sta Animation get animation => _animation; Animation _animation; + @override void initState() { super.initState(); _controller = new AnimationController( @@ -100,6 +107,7 @@ abstract class AnimatedWidgetBaseState extends Sta _constructTweens(); } + @override void didUpdateConfig(T oldConfig) { if (config.curve != oldConfig.curve) _updateCurve(); @@ -122,6 +130,7 @@ abstract class AnimatedWidgetBaseState extends Sta _animation = _controller; } + @override void dispose() { _controller.stop(); super.dispose(); @@ -229,8 +238,10 @@ class AnimatedContainer extends AnimatedWidgetBase { /// If non-null, requires the decoration to have this height. final double height; + @override _AnimatedContainerState createState() => new _AnimatedContainerState(); + @override void debugFillDescription(List description) { super.debugFillDescription(description); if (constraints != null) @@ -262,6 +273,7 @@ class _AnimatedContainerState extends AnimatedWidgetBaseState Tween _width; Tween _height; + @override void forEachTween(TweenVisitor visitor) { // TODO(ianh): Use constructor tear-offs when it becomes possible _constraints = visitor(_constraints, config.constraints, (dynamic value) => new BoxConstraintsTween(begin: value)); @@ -274,6 +286,7 @@ class _AnimatedContainerState extends AnimatedWidgetBaseState _height = visitor(_height, config.height, (dynamic value) => new Tween(begin: value)); } + @override Widget build(BuildContext context) { return new Container( child: config.child, @@ -288,6 +301,7 @@ class _AnimatedContainerState extends AnimatedWidgetBaseState ); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); if (_constraints != null) @@ -370,6 +384,7 @@ class AnimatedPositioned extends AnimatedWidgetBase { /// set. The third must be null. final double height; + @override _AnimatedPositionedState createState() => new _AnimatedPositionedState(); } @@ -381,6 +396,7 @@ class _AnimatedPositionedState extends AnimatedWidgetBaseState _width; Tween _height; + @override void forEachTween(TweenVisitor visitor) { // TODO(ianh): Use constructor tear-offs when it becomes possible _left = visitor(_left, config.left, (dynamic value) => new Tween(begin: value)); @@ -391,6 +407,7 @@ class _AnimatedPositionedState extends AnimatedWidgetBaseState new Tween(begin: value)); } + @override Widget build(BuildContext context) { return new Positioned( child: config.child, @@ -403,6 +420,7 @@ class _AnimatedPositionedState extends AnimatedWidgetBaseState description) { super.debugFillDescription(description); if (_left != null) diff --git a/packages/flutter/lib/src/widgets/locale_query.dart b/packages/flutter/lib/src/widgets/locale_query.dart index b45f0b5bb0..5b73fd432c 100644 --- a/packages/flutter/lib/src/widgets/locale_query.dart +++ b/packages/flutter/lib/src/widgets/locale_query.dart @@ -26,8 +26,10 @@ class LocaleQuery extends InheritedWidget { return query?.data; } + @override bool updateShouldNotify(LocaleQuery old) => data != old.data; + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('$data'); diff --git a/packages/flutter/lib/src/widgets/media_query.dart b/packages/flutter/lib/src/widgets/media_query.dart index 39531d6dc8..5afd18e805 100644 --- a/packages/flutter/lib/src/widgets/media_query.dart +++ b/packages/flutter/lib/src/widgets/media_query.dart @@ -34,6 +34,7 @@ class MediaQueryData { return size.width > size.height ? Orientation.landscape : Orientation.portrait; } + @override bool operator==(Object other) { if (other.runtimeType != runtimeType) return false; @@ -43,12 +44,14 @@ class MediaQueryData { && typedOther.devicePixelRatio == devicePixelRatio; } + @override int get hashCode => hashValues( size.hashCode, padding.hashCode, devicePixelRatio.hashCode ); + @override String toString() => '$runtimeType($size, $orientation)'; } @@ -76,8 +79,10 @@ class MediaQuery extends InheritedWidget { return query == null ? null : query.data; } + @override bool updateShouldNotify(MediaQuery old) => data != old.data; + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('$data'); diff --git a/packages/flutter/lib/src/widgets/mimic.dart b/packages/flutter/lib/src/widgets/mimic.dart index 7faae046e5..76fd8fad1d 100644 --- a/packages/flutter/lib/src/widgets/mimic.dart +++ b/packages/flutter/lib/src/widgets/mimic.dart @@ -129,6 +129,7 @@ class Mimic extends StatelessWidget { /// A handle to the widget that this widget should copy. final MimicableHandle original; + @override Widget build(BuildContext context) { if (original != null && original._state.mounted && original._state._placeholderSize != null) return original._state.config.child; @@ -145,6 +146,7 @@ class Mimicable extends StatefulWidget { final Widget child; + @override MimicableState createState() => new MimicableState(); } @@ -222,6 +224,7 @@ class MimicableState extends State { } } + @override Widget build(BuildContext context) { if (_placeholderSize != null) { return new ConstrainedBox( diff --git a/packages/flutter/lib/src/widgets/mixed_viewport.dart b/packages/flutter/lib/src/widgets/mixed_viewport.dart index 8df1ba343d..018542dfca 100644 --- a/packages/flutter/lib/src/widgets/mixed_viewport.dart +++ b/packages/flutter/lib/src/widgets/mixed_viewport.dart @@ -33,10 +33,12 @@ class MixedViewport extends RenderObjectWidget { final ViewportDimensionsChangeCallback onPaintOffsetUpdateNeeded; final InvalidatorAvailableCallback onInvalidatorAvailable; // call the callback this gives to invalidate sizes + @override _MixedViewportElement createElement() => new _MixedViewportElement(this); // we don't pass constructor arguments to the RenderBlockViewport() because until // we know our children, the constructor arguments we could give have no effect + @override RenderBlockViewport createRenderObject(BuildContext context) => new RenderBlockViewport(); _ChangeDescription evaluateChangesFrom(MixedViewport oldWidget) { @@ -55,8 +57,11 @@ class MixedViewport extends RenderObjectWidget { class _ChildKey { const _ChildKey(this.type, this.key); factory _ChildKey.fromWidget(Widget widget) => new _ChildKey(widget.runtimeType, widget.key); + final Type type; final Key key; + + @override bool operator ==(dynamic other) { if (other is! _ChildKey) return false; @@ -64,7 +69,11 @@ class _ChildKey { return type == typedOther.type && key == typedOther.key; } + + @override int get hashCode => hashValues(type, key); + + @override String toString() => "_ChildKey(type: $type, key: $key)"; } @@ -74,6 +83,7 @@ class _MixedViewportElement extends RenderObjectElement { widget.onInvalidatorAvailable(invalidate); } + @override MixedViewport get widget => super.widget; /// _childExtents contains the extents of each child from the top of the list @@ -115,6 +125,7 @@ class _MixedViewportElement extends RenderObjectElement { double _overrideStartOffset; double get startOffset => _overrideStartOffset ?? widget.startOffset; + @override RenderBlockViewport get renderObject => super.renderObject; /// Notify the BlockViewport that the children at indices have, or might have, @@ -136,11 +147,13 @@ class _MixedViewportElement extends RenderObjectElement { _invalidIndices.clear(); } + @override void visitChildren(ElementVisitor visitor) { for (Element child in _childrenByKey.values) visitor(child); } + @override void mount(Element parent, dynamic newSlot) { super.mount(parent, newSlot); renderObject @@ -152,6 +165,7 @@ class _MixedViewportElement extends RenderObjectElement { ..minCrossAxisExtentCallback = _noIntrinsicExtent; } + @override void unmount() { renderObject ..callback = null @@ -178,6 +192,7 @@ class _MixedViewportElement extends RenderObjectElement { static final Object _omit = new Object(); // used as a slot when it's not yet time to attach the child + @override void update(MixedViewport newWidget) { _ChangeDescription changes = newWidget.evaluateChangesFrom(widget); super.update(newWidget); @@ -205,6 +220,7 @@ class _MixedViewportElement extends RenderObjectElement { } } + @override void performRebuild() { // we just need to redraw our existing widgets as-is if (_childrenByKey.length > 0) { @@ -614,11 +630,13 @@ class _MixedViewportElement extends RenderObjectElement { _firstVisibleChildIndex = startIndex; } + @override void updateSlotForChild(Element element, dynamic newSlot) { assert(newSlot == null || newSlot == _omit || newSlot is Element); super.updateSlotForChild(element, newSlot); } + @override void insertChildRenderObject(RenderObject child, dynamic slot) { if (slot == _omit) return; @@ -626,6 +644,7 @@ class _MixedViewportElement extends RenderObjectElement { renderObject.insert(child, after: slot?.renderObject); } + @override void moveChildRenderObject(RenderObject child, dynamic slot) { if (slot == _omit) return; @@ -638,6 +657,7 @@ class _MixedViewportElement extends RenderObjectElement { renderObject.insert(child, after: previousSibling); } + @override void removeChildRenderObject(RenderObject child) { if (child.parent != renderObject) return; // probably had slot == _omit when inserted diff --git a/packages/flutter/lib/src/widgets/modal_barrier.dart b/packages/flutter/lib/src/widgets/modal_barrier.dart index 38e0699c8b..62c36ea5e2 100644 --- a/packages/flutter/lib/src/widgets/modal_barrier.dart +++ b/packages/flutter/lib/src/widgets/modal_barrier.dart @@ -22,6 +22,7 @@ class ModalBarrier extends StatelessWidget { /// Whether touching the barrier will pop the current route off the [Navigator]. final bool dismissable; + @override Widget build(BuildContext context) { return new Semantics( container: true, @@ -58,6 +59,7 @@ class AnimatedModalBarrier extends AnimatedWidget { /// Whether touching the barrier will pop the current route off the [Navigator]. final bool dismissable; + @override Widget build(BuildContext context) { return new ModalBarrier( color: color.value, diff --git a/packages/flutter/lib/src/widgets/navigator.dart b/packages/flutter/lib/src/widgets/navigator.dart index cf5eb51119..fa903c084e 100644 --- a/packages/flutter/lib/src/widgets/navigator.dart +++ b/packages/flutter/lib/src/widgets/navigator.dart @@ -97,6 +97,7 @@ class RouteSettings { /// The initial route typically skips any entrance transition to speed startup. final bool isInitialRoute; + @override String toString() { String result = '"$name"'; if (mostValuableKeys != null && mostValuableKeys.isNotEmpty) { @@ -271,6 +272,7 @@ class Navigator extends StatefulWidget { navigator.openTransaction(callback); } + @override NavigatorState createState() => new NavigatorState(); } @@ -279,6 +281,7 @@ class NavigatorState extends State { final GlobalKey _overlayKey = new GlobalKey(); final List> _history = new List>(); + @override void initState() { super.initState(); assert(config.observer == null || config.observer.navigator == null); @@ -289,6 +292,7 @@ class NavigatorState extends State { ))); } + @override void didUpdateConfig(Navigator oldConfig) { if (oldConfig.observer != config.observer) { oldConfig.observer?._navigator = null; @@ -297,6 +301,7 @@ class NavigatorState extends State { } } + @override void dispose() { assert(!_debugLocked); assert(() { _debugLocked = true; return true; }); @@ -481,6 +486,7 @@ class NavigatorState extends State { return true; } + @override Widget build(BuildContext context) { assert(!_debugLocked); assert(_history.isNotEmpty); diff --git a/packages/flutter/lib/src/widgets/notification_listener.dart b/packages/flutter/lib/src/widgets/notification_listener.dart index b47bd886da..4bd91b4090 100644 --- a/packages/flutter/lib/src/widgets/notification_listener.dart +++ b/packages/flutter/lib/src/widgets/notification_listener.dart @@ -42,6 +42,7 @@ class NotificationListener extends StatelessWidget { return false; } + @override Widget build(BuildContext context) => child; } diff --git a/packages/flutter/lib/src/widgets/overlay.dart b/packages/flutter/lib/src/widgets/overlay.dart index d7bf3e8d0a..deb3eab1e1 100644 --- a/packages/flutter/lib/src/widgets/overlay.dart +++ b/packages/flutter/lib/src/widgets/overlay.dart @@ -46,15 +46,21 @@ class OverlayEntry { _key.currentState?.setState(() { /* the state that changed is in the builder */ }); } + @override String toString() => '$runtimeType@$hashCode(opaque: $opaque)'; } class _OverlayEntry extends StatefulWidget { _OverlayEntry(OverlayEntry entry) : entry = entry, super(key: entry._key); + final OverlayEntry entry; + + @override _OverlayEntryState createState() => new _OverlayEntryState(); } + class _OverlayEntryState extends State<_OverlayEntry> { + @override Widget build(BuildContext context) => config.entry.builder(context); } @@ -98,6 +104,7 @@ class Overlay extends StatefulWidget { return result; } + @override OverlayState createState() => new OverlayState(); } @@ -105,6 +112,7 @@ class Overlay extends StatefulWidget { class OverlayState extends State { final List _entries = new List(); + @override void initState() { super.initState(); insertAll(config.initialEntries); @@ -171,6 +179,7 @@ class OverlayState extends State { return result; } + @override Widget build(BuildContext context) { List backwardsChildren = []; @@ -184,6 +193,7 @@ class OverlayState extends State { return new Stack(children: backwardsChildren.reversed.toList(growable: false)); } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('entries: $_entries'); diff --git a/packages/flutter/lib/src/widgets/page_storage.dart b/packages/flutter/lib/src/widgets/page_storage.dart index 6a2233b23f..69853a1faf 100644 --- a/packages/flutter/lib/src/widgets/page_storage.dart +++ b/packages/flutter/lib/src/widgets/page_storage.dart @@ -7,13 +7,17 @@ import 'framework.dart'; class _StorageEntryIdentifier { Type clientType; List keys; + void addKey(Key key) { assert(key != null); assert(key is! GlobalKey); keys ??= []; keys.add(key); } + GlobalKey scopeKey; + + @override bool operator ==(dynamic other) { if (other is! _StorageEntryIdentifier) return false; @@ -30,8 +34,11 @@ class _StorageEntryIdentifier { } return true; } + + @override int get hashCode => hashValues(clientType, scopeKey, hashList(keys)); + @override String toString() { return 'StorageEntryIdentifier($clientType, $scopeKey, ${keys?.join(":")})'; } @@ -102,5 +109,6 @@ class PageStorage extends StatelessWidget { return widget?.bucket; } + @override Widget build(BuildContext context) => child; } diff --git a/packages/flutter/lib/src/widgets/pageable_list.dart b/packages/flutter/lib/src/widgets/pageable_list.dart index 3cefe42b27..e06f8d07b0 100644 --- a/packages/flutter/lib/src/widgets/pageable_list.dart +++ b/packages/flutter/lib/src/widgets/pageable_list.dart @@ -73,6 +73,7 @@ class PageableList extends Scrollable { /// The list of pages themselves. final Iterable children; + @override PageableListState createState() => new PageableListState(); } @@ -96,11 +97,13 @@ class PageableListState extends ScrollableState { } } + @override double pixelOffsetToScrollOffset(double pixelOffset) { final double pixelsPerScrollUnit = _pixelsPerScrollUnit; return super.pixelOffsetToScrollOffset(pixelsPerScrollUnit == 0.0 ? 0.0 : pixelOffset / pixelsPerScrollUnit); } + @override double scrollOffsetToPixelOffset(double scrollOffset) { return super.scrollOffsetToPixelOffset(scrollOffset * _pixelsPerScrollUnit); } @@ -118,11 +121,13 @@ class PageableListState extends ScrollableState { } } + @override void initState() { super.initState(); _updateScrollBehavior(); } + @override void didUpdateConfig(PageableList oldConfig) { super.didUpdateConfig(oldConfig); @@ -149,21 +154,25 @@ class PageableListState extends ScrollableState { )); } + @override void dispatchOnScrollStart() { super.dispatchOnScrollStart(); config.scrollableListPainter?.scrollStarted(); } + @override void dispatchOnScroll() { super.dispatchOnScroll(); config.scrollableListPainter?.scrollOffset = scrollOffset; } + @override void dispatchOnScrollEnd() { super.dispatchOnScrollEnd(); config.scrollableListPainter?.scrollEnded(); } + @override Widget buildContent(BuildContext context) { return new PageViewport( itemsWrap: config.itemsWrap, @@ -178,6 +187,7 @@ class PageableListState extends ScrollableState { UnboundedBehavior _unboundedBehavior; OverscrollBehavior _overscrollBehavior; + @override ExtentScrollBehavior get scrollBehavior { if (config.itemsWrap) { _unboundedBehavior ??= new UnboundedBehavior(); @@ -187,10 +197,13 @@ class PageableListState extends ScrollableState { return _overscrollBehavior; } + @override ScrollBehavior createScrollBehavior() => scrollBehavior; + @override bool get shouldSnapScrollOffset => config.itemsSnapAlignment == PageableListFlingBehavior.canFlingAcrossMultiplePages; + @override double snapScrollOffset(double newScrollOffset) { final double previousItemOffset = newScrollOffset.floorToDouble(); final double nextItemOffset = newScrollOffset.ceilToDouble(); @@ -205,6 +218,7 @@ class PageableListState extends ScrollableState { .then(_notifyPageChanged); } + @override Future fling(double scrollVelocity) { switch(config.itemsSnapAlignment) { case PageableListFlingBehavior.canFlingAcrossMultiplePages: @@ -214,6 +228,7 @@ class PageableListState extends ScrollableState { } } + @override Future settleScrollOffset() { return scrollTo(snapScrollOffset(scrollOffset), duration: config.duration, curve: config.curve) .then(_notifyPageChanged); @@ -237,43 +252,57 @@ class PageViewport extends VirtualViewportFromIterable { assert(mainAxis != null); } + @override final double startOffset; + final Axis mainAxis; final ViewportAnchor anchor; final bool itemsWrap; final RenderObjectPainter overlayPainter; + + @override final Iterable children; + @override RenderList createRenderObject(BuildContext context) => new RenderList(); + @override _PageViewportElement createElement() => new _PageViewportElement(this); } class _PageViewportElement extends VirtualViewportElement { _PageViewportElement(PageViewport widget) : super(widget); + @override PageViewport get widget => super.widget; + @override RenderList get renderObject => super.renderObject; + @override int get materializedChildBase => _materializedChildBase; int _materializedChildBase; + @override int get materializedChildCount => _materializedChildCount; int _materializedChildCount; + @override double get startOffsetBase => _startOffsetBase; double _startOffsetBase; + @override double get startOffsetLimit =>_startOffsetLimit; double _startOffsetLimit; + @override double scrollOffsetToPixelOffset(double scrollOffset) { if (_containerExtent == null) return 0.0; return super.scrollOffsetToPixelOffset(scrollOffset) * _containerExtent; } + @override void updateRenderObject(PageViewport oldWidget) { renderObject ..mainAxis = widget.mainAxis @@ -298,6 +327,7 @@ class _PageViewportElement extends VirtualViewportElement { renderObject.dimensions = new ViewportDimensions(containerSize: containerSize, contentSize: materializedContentSize); } + @override void layout(BoxConstraints constraints) { final int length = renderObject.virtualChildCount; diff --git a/packages/flutter/lib/src/widgets/pages.dart b/packages/flutter/lib/src/widgets/pages.dart index f0abba46bd..5a29e603a6 100644 --- a/packages/flutter/lib/src/widgets/pages.dart +++ b/packages/flutter/lib/src/widgets/pages.dart @@ -15,11 +15,20 @@ abstract class PageRoute extends ModalRoute { Completer completer, RouteSettings settings: const RouteSettings() }) : super(completer: completer, settings: settings); + + @override bool get opaque => true; + + @override bool get barrierDismissable => false; + + @override bool canTransitionTo(TransitionRoute nextRoute) => nextRoute is PageRoute; + + @override bool canTransitionFrom(TransitionRoute nextRoute) => nextRoute is PageRoute; + @override AnimationController createAnimationController() { AnimationController controller = super.createAnimationController(); if (settings.isInitialRoute) diff --git a/packages/flutter/lib/src/widgets/performance_overlay.dart b/packages/flutter/lib/src/widgets/performance_overlay.dart index 3aa10457c2..0205071471 100644 --- a/packages/flutter/lib/src/widgets/performance_overlay.dart +++ b/packages/flutter/lib/src/widgets/performance_overlay.dart @@ -56,11 +56,13 @@ class PerformanceOverlay extends LeafRenderObjectWidget { /// how many frame intervals). final int rasterizerThreshold; + @override RenderPerformanceOverlay createRenderObject(BuildContext context) => new RenderPerformanceOverlay( optionsMask: optionsMask, rasterizerThreshold: rasterizerThreshold ); + @override void updateRenderObject(BuildContext context, RenderPerformanceOverlay renderObject) { renderObject ..optionsMask = optionsMask diff --git a/packages/flutter/lib/src/widgets/placeholder.dart b/packages/flutter/lib/src/widgets/placeholder.dart index aaccb3b354..6b40b211d7 100644 --- a/packages/flutter/lib/src/widgets/placeholder.dart +++ b/packages/flutter/lib/src/widgets/placeholder.dart @@ -9,6 +9,7 @@ import 'framework.dart'; class Placeholder extends StatefulWidget { Placeholder({ Key key }) : super(key: key); + @override PlaceholderState createState() => new PlaceholderState(); } @@ -29,6 +30,7 @@ class PlaceholderState extends State { }); } + @override Widget build(BuildContext context) { if (_child != null) return child; diff --git a/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart b/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart index 3e3088f18e..399813afcf 100644 --- a/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart +++ b/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart @@ -23,10 +23,12 @@ class RawKeyboardListener extends StatefulWidget { final ValueChanged onKey; final Widget child; + @override _RawKeyboardListenerState createState() => new _RawKeyboardListenerState(); } class _RawKeyboardListenerState extends State implements mojom.RawKeyboardListener { + @override void initState() { super.initState(); _attachOrDetachKeyboard(); @@ -34,10 +36,12 @@ class _RawKeyboardListenerState extends State implements mo mojom.RawKeyboardListenerStub _stub; + @override void didUpdateConfig(RawKeyboardListener oldConfig) { _attachOrDetachKeyboard(); } + @override void dispose() { _detachKeyboardIfAttached(); super.dispose(); @@ -65,11 +69,13 @@ class _RawKeyboardListenerState extends State implements mo _stub = null; } + @override void onKey(mojom.InputEvent event) { if (config.onKey != null) config.onKey(event); } + @override Widget build(BuildContext context) { return config.child; } diff --git a/packages/flutter/lib/src/widgets/routes.dart b/packages/flutter/lib/src/widgets/routes.dart index 0da4a7a83d..03939aa5ce 100644 --- a/packages/flutter/lib/src/widgets/routes.dart +++ b/packages/flutter/lib/src/widgets/routes.dart @@ -21,9 +21,11 @@ abstract class OverlayRoute extends Route { List get builders; /// The entries this route has placed in the overlay. + @override List get overlayEntries => _overlayEntries; final List _overlayEntries = []; + @override void install(OverlayEntry insertionPoint) { assert(_overlayEntries.isEmpty); for (WidgetBuilder builder in builders) @@ -40,6 +42,7 @@ abstract class OverlayRoute extends Route { /// responsibility of the Route to later call dispose(). /// /// Subclasses shouldn't call this if they want to delay the finished() call. + @override bool didPop(T result) { finished(); return true; @@ -58,6 +61,7 @@ abstract class OverlayRoute extends Route { _overlayEntries.clear(); } + @override void dispose() { finished(); } @@ -145,6 +149,7 @@ abstract class TransitionRoute extends OverlayRoute { Animation get forwardAnimation => _forwardAnimation; final ProxyAnimation _forwardAnimation = new ProxyAnimation(kAlwaysDismissedAnimation); + @override void install(OverlayEntry insertionPoint) { _controller = createAnimationController(); assert(_controller != null); @@ -153,12 +158,14 @@ abstract class TransitionRoute extends OverlayRoute { super.install(insertionPoint); } + @override void didPush() { _animation.addStatusListener(_handleStatusChanged); _controller.forward(); super.didPush(); } + @override void didReplace(Route oldRoute) { if (oldRoute is TransitionRoute) _controller.value = oldRoute._controller.value; @@ -166,6 +173,7 @@ abstract class TransitionRoute extends OverlayRoute { super.didReplace(oldRoute); } + @override bool didPop(T result) { _result = result; _controller.reverse(); @@ -173,11 +181,13 @@ abstract class TransitionRoute extends OverlayRoute { return true; } + @override void didPopNext(Route nextRoute) { _updateForwardAnimation(nextRoute); super.didPopNext(nextRoute); } + @override void didChangeNext(Route nextRoute) { _updateForwardAnimation(nextRoute); super.didChangeNext(nextRoute); @@ -224,17 +234,21 @@ abstract class TransitionRoute extends OverlayRoute { /// need to coordinate transitions with. bool canTransitionFrom(TransitionRoute nextRoute) => true; + @override void finished() { super.finished(); _transitionCompleter?.complete(_result); } + @override void dispose() { _controller.stop(); super.dispose(); } String get debugLabel => '$runtimeType'; + + @override String toString() => '$runtimeType(animation: $_controller)'; } @@ -295,6 +309,8 @@ abstract class LocalHistoryRoute extends Route { entry._owner = null; entry._notifyRemoved(); } + + @override bool didPop(T result) { if (_localHistory != null && _localHistory.length > 0) { LocalHistoryEntry entry = _localHistory.removeLast(); @@ -305,6 +321,8 @@ abstract class LocalHistoryRoute extends Route { } return super.didPop(result); } + + @override bool get willHandlePopInternally { return _localHistory != null && _localHistory.length > 0; } @@ -325,11 +343,13 @@ class _ModalScopeStatus extends InheritedWidget { final bool isCurrent; final Route route; + @override bool updateShouldNotify(_ModalScopeStatus old) { return isCurrent != old.isCurrent || route != old.route; } + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('${isCurrent ? "active" : "inactive"}'); @@ -344,20 +364,24 @@ class _ModalScope extends StatefulWidget { final ModalRoute route; + @override _ModalScopeState createState() => new _ModalScopeState(); } class _ModalScopeState extends State<_ModalScope> { + @override void initState() { super.initState(); config.route.animation?.addStatusListener(_animationStatusChanged); config.route.forwardAnimation?.addStatusListener(_animationStatusChanged); } + @override void didUpdateConfig(_ModalScope oldConfig) { assert(config.route == oldConfig.route); } + @override void dispose() { config.route.animation?.removeStatusListener(_animationStatusChanged); config.route.forwardAnimation?.removeStatusListener(_animationStatusChanged); @@ -370,6 +394,7 @@ class _ModalScopeState extends State<_ModalScope> { }); } + @override Widget build(BuildContext context) { Widget contents = new PageStorage( key: config.route._subtreeKey, @@ -486,6 +511,7 @@ abstract class ModalRoute extends TransitionRoute with LocalHistoryRoute extends TransitionRoute with LocalHistoryRoute get builders => [ _buildModalBarrier, _buildModalScope ]; + @override String toString() => '$runtimeType($settings, animation: $_animation)'; } /// A modal route that overlays a widget over the current route. abstract class PopupRoute extends ModalRoute { PopupRoute({ Completer completer }) : super(completer: completer); + + @override bool get opaque => false; + + @override void didChangeNext(Route nextRoute) { assert(nextRoute is! PageRoute); super.didChangeNext(nextRoute); diff --git a/packages/flutter/lib/src/widgets/scroll_behavior.dart b/packages/flutter/lib/src/widgets/scroll_behavior.dart index 01228d2931..beca2da3e1 100644 --- a/packages/flutter/lib/src/widgets/scroll_behavior.dart +++ b/packages/flutter/lib/src/widgets/scroll_behavior.dart @@ -36,6 +36,7 @@ abstract class ScrollBehavior { /// Whether this scroll behavior currently permits scrolling bool get isScrollable => true; + @override String toString() { List description = []; debugFillDescription(description); @@ -85,6 +86,7 @@ abstract class ExtentScrollBehavior extends ScrollBehavior { /// The maximum value the scroll offset can obtain. double get maxScrollOffset; + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('content: ${contentExtent.toStringAsFixed(1)}'); @@ -104,6 +106,7 @@ class BoundedBehavior extends ExtentScrollBehavior { double _minScrollOffset; + @override double updateExtents({ double contentExtent, double containerExtent, @@ -121,9 +124,13 @@ class BoundedBehavior extends ExtentScrollBehavior { ); } + @override double get minScrollOffset => _minScrollOffset; + + @override double get maxScrollOffset => math.max(minScrollOffset, minScrollOffset + _contentExtent - _containerExtent); + @override double applyCurve(double scrollOffset, double scrollDelta) { return (scrollOffset + scrollDelta).clamp(minScrollOffset, maxScrollOffset); } @@ -145,6 +152,7 @@ class UnboundedBehavior extends ExtentScrollBehavior { UnboundedBehavior({ double contentExtent: 0.0, double containerExtent: 0.0 }) : super(contentExtent: contentExtent, containerExtent: containerExtent); + @override Simulation createScrollSimulation(double position, double velocity) { double velocityPerSecond = velocity * 1000.0; return new BoundedFrictionSimulation( @@ -152,13 +160,18 @@ class UnboundedBehavior extends ExtentScrollBehavior { ); } + @override Simulation createSnapScrollSimulation(double startOffset, double endOffset, double startVelocity, double endVelocity) { return _createSnapScrollSimulation(startOffset, endOffset, startVelocity, endVelocity); } + @override double get minScrollOffset => double.NEGATIVE_INFINITY; + + @override double get maxScrollOffset => double.INFINITY; + @override double applyCurve(double scrollOffset, double scrollDelta) { return scrollOffset + scrollDelta; } @@ -169,14 +182,17 @@ class OverscrollBehavior extends BoundedBehavior { OverscrollBehavior({ double contentExtent: 0.0, double containerExtent: 0.0, double minScrollOffset: 0.0 }) : super(contentExtent: contentExtent, containerExtent: containerExtent, minScrollOffset: minScrollOffset); + @override Simulation createScrollSimulation(double position, double velocity) { return _createScrollSimulation(position, velocity, minScrollOffset, maxScrollOffset); } + @override Simulation createSnapScrollSimulation(double startOffset, double endOffset, double startVelocity, double endVelocity) { return _createSnapScrollSimulation(startOffset, endOffset, startVelocity, endVelocity); } + @override double applyCurve(double scrollOffset, double scrollDelta) { double newScrollOffset = scrollOffset + scrollDelta; // If we're overscrolling, we want move the scroll offset 2x @@ -199,14 +215,17 @@ class OverscrollWhenScrollableBehavior extends OverscrollBehavior { OverscrollWhenScrollableBehavior({ double contentExtent: 0.0, double containerExtent: 0.0, double minScrollOffset: 0.0 }) : super(contentExtent: contentExtent, containerExtent: containerExtent, minScrollOffset: minScrollOffset); + @override bool get isScrollable => contentExtent > containerExtent; + @override Simulation createScrollSimulation(double position, double velocity) { if (isScrollable || position < minScrollOffset || position > maxScrollOffset) return super.createScrollSimulation(position, velocity); return null; } + @override double applyCurve(double scrollOffset, double scrollDelta) { if (isScrollable) return super.applyCurve(scrollOffset, scrollDelta); diff --git a/packages/flutter/lib/src/widgets/scrollable.dart b/packages/flutter/lib/src/widgets/scrollable.dart index 065456e84f..4f606ff650 100644 --- a/packages/flutter/lib/src/widgets/scrollable.dart +++ b/packages/flutter/lib/src/widgets/scrollable.dart @@ -175,6 +175,7 @@ abstract class Scrollable extends StatefulWidget { return new Future.value(); } + @override ScrollableState createState(); } @@ -218,6 +219,7 @@ abstract class Scrollable extends StatefulWidget { /// terms of the [pixelOffsetToScrollOffset] and /// [scrollOffsetToPixelOffset] methods. abstract class ScrollableState extends State { + @override void initState() { super.initState(); _controller = new AnimationController.unbounded()..addListener(_handleAnimationChanged); @@ -226,6 +228,7 @@ abstract class ScrollableState extends State { AnimationController _controller; + @override void dispose() { _controller.stop(); super.dispose(); @@ -518,6 +521,7 @@ abstract class ScrollableState extends State { final GlobalKey _gestureDetectorKey = new GlobalKey(); + @override Widget build(BuildContext context) { return new RawGestureDetector( key: _gestureDetectorKey, @@ -629,11 +633,15 @@ class ScrollableViewport extends Scrollable { final Widget child; + @override ScrollableState createState() => new _ScrollableViewportState(); } class _ScrollableViewportState extends ScrollableState { + @override ScrollBehavior createScrollBehavior() => new OverscrollWhenScrollableBehavior(); + + @override OverscrollWhenScrollableBehavior get scrollBehavior => super.scrollBehavior; double _viewportSize = 0.0; @@ -655,6 +663,7 @@ class _ScrollableViewportState extends ScrollableState { return scrollOffsetToPixelDelta(scrollOffset); } + @override Widget buildContent(BuildContext context) { return new Viewport( paintOffset: scrollOffsetToPixelDelta(scrollOffset), @@ -692,6 +701,7 @@ class Block extends StatelessWidget { final ScrollListener onScroll; final Key scrollableKey; + @override Widget build(BuildContext context) { Widget contents = new BlockBody(children: children, mainAxis: scrollDirection); if (padding != null) @@ -708,12 +718,14 @@ class Block extends StatelessWidget { } abstract class ScrollableListPainter extends RenderObjectPainter { + @override void attach(RenderObject renderObject) { assert(renderObject is RenderBox); assert(renderObject is HasMainAxis); super.attach(renderObject); } + @override RenderBox get renderObject => super.renderObject; Axis get scrollDirection { @@ -784,10 +796,12 @@ class ScrollableMixedWidgetList extends Scrollable { final Object token; final InvalidatorAvailableCallback onInvalidatorAvailable; + @override ScrollableMixedWidgetListState createState() => new ScrollableMixedWidgetListState(); } class ScrollableMixedWidgetListState extends ScrollableState { + @override void initState() { super.initState(); scrollBehavior.updateExtents( @@ -795,7 +809,10 @@ class ScrollableMixedWidgetListState extends ScrollableState createScrollBehavior() => new OverscrollBehavior(); + + @override OverscrollBehavior get scrollBehavior => super.scrollBehavior; Offset _handlePaintOffsetUpdateNeeded(ViewportDimensions dimensions) { @@ -812,6 +829,7 @@ class ScrollableMixedWidgetListState extends ScrollableState children; + @override ScrollableState createState() => new _ScrollableGridState(); } class _ScrollableGridState extends ScrollableState { + @override ScrollBehavior createScrollBehavior() => new OverscrollBehavior(); + + @override ExtentScrollBehavior get scrollBehavior => super.scrollBehavior; void _handleExtentsChanged(double contentExtent, double containerExtent) { @@ -54,6 +58,7 @@ class _ScrollableGridState extends ScrollableState { }); } + @override Widget buildContent(BuildContext context) { return new GridViewport( startOffset: scrollOffset, @@ -72,38 +77,50 @@ class GridViewport extends VirtualViewportFromIterable { this.children }); + @override final double startOffset; final GridDelegate delegate; final ExtentsChangedCallback onExtentsChanged; + + @override final Iterable children; // TODO(abarth): Support horizontal grids. Axis get mainAxis => Axis.vertical; + @override RenderGrid createRenderObject(BuildContext context) => new RenderGrid(delegate: delegate); + @override _GridViewportElement createElement() => new _GridViewportElement(this); } class _GridViewportElement extends VirtualViewportElement { _GridViewportElement(GridViewport widget) : super(widget); + @override GridViewport get widget => super.widget; + @override RenderGrid get renderObject => super.renderObject; + @override int get materializedChildBase => _materializedChildBase; int _materializedChildBase; + @override int get materializedChildCount => _materializedChildCount; int _materializedChildCount; + @override double get startOffsetBase => _startOffsetBase; double _startOffsetBase; + @override double get startOffsetLimit =>_startOffsetLimit; double _startOffsetLimit; + @override void updateRenderObject(GridViewport oldWidget) { renderObject.delegate = widget.delegate; super.updateRenderObject(oldWidget); @@ -113,6 +130,7 @@ class _GridViewportElement extends VirtualViewportElement { double _containerExtent; GridSpecification _specification; + @override void layout(BoxConstraints constraints) { _specification = renderObject.specification; double contentExtent = _specification.gridSize.height; diff --git a/packages/flutter/lib/src/widgets/scrollable_list.dart b/packages/flutter/lib/src/widgets/scrollable_list.dart index b8bfbdce38..2c8a91505b 100644 --- a/packages/flutter/lib/src/widgets/scrollable_list.dart +++ b/packages/flutter/lib/src/widgets/scrollable_list.dart @@ -41,11 +41,15 @@ class ScrollableList extends Scrollable { final ScrollableListPainter scrollableListPainter; final Iterable children; + @override ScrollableState createState() => new _ScrollableListState(); } class _ScrollableListState extends ScrollableState { + @override ScrollBehavior createScrollBehavior() => new OverscrollWhenScrollableBehavior(); + + @override ExtentScrollBehavior get scrollBehavior => super.scrollBehavior; void _handleExtentsChanged(double contentExtent, double containerExtent) { @@ -59,21 +63,25 @@ class _ScrollableListState extends ScrollableState { }); } + @override void dispatchOnScrollStart() { super.dispatchOnScrollStart(); config.scrollableListPainter?.scrollStarted(); } + @override void dispatchOnScroll() { super.dispatchOnScroll(); config.scrollableListPainter?.scrollOffset = scrollOffset; } + @override void dispatchOnScrollEnd() { super.dispatchOnScrollEnd(); config.scrollableListPainter?.scrollEnded(); } + @override Widget buildContent(BuildContext context) { return new ListViewport( onExtentsChanged: _handleExtentsChanged, @@ -134,36 +142,46 @@ class _VirtualListViewport extends VirtualViewport { } } + @override double get startOffset { if (padding == null) return scrollOffset; return scrollOffset - _leadingPadding; } + @override RenderList createRenderObject(BuildContext context) => new RenderList(itemExtent: itemExtent); + @override _VirtualListViewportElement createElement() => new _VirtualListViewportElement(this); } class _VirtualListViewportElement extends VirtualViewportElement { _VirtualListViewportElement(VirtualViewport widget) : super(widget); + @override _VirtualListViewport get widget => super.widget; + @override RenderList get renderObject => super.renderObject; + @override int get materializedChildBase => _materializedChildBase; int _materializedChildBase; + @override int get materializedChildCount => _materializedChildCount; int _materializedChildCount; + @override double get startOffsetBase => _startOffsetBase; double _startOffsetBase; + @override double get startOffsetLimit =>_startOffsetLimit; double _startOffsetLimit; + @override void updateRenderObject(_VirtualListViewport oldWidget) { renderObject ..mainAxis = widget.mainAxis @@ -177,6 +195,7 @@ class _VirtualListViewportElement extends VirtualViewportElement { double _contentExtent; double _containerExtent; + @override void layout(BoxConstraints constraints) { final int length = renderObject.virtualChildCount; final double itemExtent = widget.itemExtent; @@ -264,6 +283,7 @@ class ListViewport extends _VirtualListViewport with VirtualViewportFromIterable overlayPainter ); + @override final Iterable children; } @@ -304,11 +324,15 @@ class ScrollableLazyList extends Scrollable { final EdgeInsets padding; final ScrollableListPainter scrollableListPainter; + @override ScrollableState createState() => new _ScrollableLazyListState(); } class _ScrollableLazyListState extends ScrollableState { + @override ScrollBehavior createScrollBehavior() => new OverscrollBehavior(); + + @override ExtentScrollBehavior get scrollBehavior => super.scrollBehavior; void _handleExtentsChanged(double contentExtent, double containerExtent) { @@ -322,21 +346,25 @@ class _ScrollableLazyListState extends ScrollableState { }); } + @override void dispatchOnScrollStart() { super.dispatchOnScrollStart(); config.scrollableListPainter?.scrollStarted(); } + @override void dispatchOnScroll() { super.dispatchOnScroll(); config.scrollableListPainter?.scrollOffset = scrollOffset; } + @override void dispatchOnScrollEnd() { super.dispatchOnScrollEnd(); config.scrollableListPainter?.scrollEnded(); } + @override Widget buildContent(BuildContext context) { return new LazyListViewport( onExtentsChanged: _handleExtentsChanged, @@ -374,6 +402,9 @@ class LazyListViewport extends _VirtualListViewport with VirtualViewportFromBuil overlayPainter ); + @override final int itemCount; + + @override final ItemListBuilder itemBuilder; } diff --git a/packages/flutter/lib/src/widgets/semantics_debugger.dart b/packages/flutter/lib/src/widgets/semantics_debugger.dart index e3f86bee92..7a09318bf5 100644 --- a/packages/flutter/lib/src/widgets/semantics_debugger.dart +++ b/packages/flutter/lib/src/widgets/semantics_debugger.dart @@ -20,30 +20,37 @@ class SemanticsDebugger extends StatefulWidget { final Widget child; + @override _SemanticsDebuggerState createState() => new _SemanticsDebuggerState(); } class _SemanticsDebuggerState extends State { + @override void initState() { super.initState(); _SemanticsDebuggerListener.ensureInstantiated(); _SemanticsDebuggerListener.instance.addListener(_update); } + + @override void dispose() { _SemanticsDebuggerListener.instance.removeListener(_update); super.dispose(); } + void _update() { setState(() { // the generation of the _SemanticsDebuggerListener has changed }); } + Point _lastPointerDownLocation; void _handlePointerDown(PointerDownEvent event) { setState(() { _lastPointerDownLocation = event.position; }); } + void _handleTap() { assert(_lastPointerDownLocation != null); _SemanticsDebuggerListener.instance.handleTap(_lastPointerDownLocation); @@ -65,6 +72,8 @@ class _SemanticsDebuggerState extends State { _lastPointerDownLocation = null; }); } + + @override Widget build(BuildContext context) { return new CustomPaint( foregroundPainter: new _SemanticsDebuggerPainter(_SemanticsDebuggerListener.instance.generation, _lastPointerDownLocation), @@ -104,6 +113,7 @@ class _SemanticsDebuggerEntry { Rect rect; List<_SemanticsDebuggerEntry> children; + @override String toString() { return '_SemanticsDebuggerEntry($id; $rect; "$label"' '${canBeTapped ? "; canBeTapped" : ""}' @@ -311,6 +321,7 @@ class _SemanticsDebuggerListener implements mojom.SemanticsListener { int generation = 0; + @override void updateSemanticsTree(List nodes) { generation += 1; for (mojom.SemanticsNode node in nodes) @@ -350,8 +361,11 @@ class _SemanticsDebuggerListener implements mojom.SemanticsListener { class _SemanticsDebuggerPainter extends CustomPainter { const _SemanticsDebuggerPainter(this.generation, this.pointerPosition); + final int generation; final Point pointerPosition; + + @override void paint(Canvas canvas, Size size) { _SemanticsDebuggerListener.instance.nodes[0]?.paint( canvas, @@ -363,6 +377,8 @@ class _SemanticsDebuggerPainter extends CustomPainter { canvas.drawCircle(pointerPosition, 10.0, paint); } } + + @override bool shouldRepaint(_SemanticsDebuggerPainter oldDelegate) { return generation != oldDelegate.generation || pointerPosition != oldDelegate.pointerPosition; diff --git a/packages/flutter/lib/src/widgets/status_transitions.dart b/packages/flutter/lib/src/widgets/status_transitions.dart index 211474e20a..d2a19613e9 100644 --- a/packages/flutter/lib/src/widgets/status_transitions.dart +++ b/packages/flutter/lib/src/widgets/status_transitions.dart @@ -19,15 +19,18 @@ abstract class StatusTransitionWidget extends StatefulWidget { Widget build(BuildContext context); + @override _StatusTransitionState createState() => new _StatusTransitionState(); } class _StatusTransitionState extends State { + @override void initState() { super.initState(); config.animation.addStatusListener(_animationStatusChanged); } + @override void didUpdateConfig(StatusTransitionWidget oldConfig) { if (config.animation != oldConfig.animation) { oldConfig.animation.removeStatusListener(_animationStatusChanged); @@ -35,6 +38,7 @@ class _StatusTransitionState extends State { } } + @override void dispose() { config.animation.removeStatusListener(_animationStatusChanged); super.dispose(); @@ -46,6 +50,7 @@ class _StatusTransitionState extends State { }); } + @override Widget build(BuildContext context) { return config.build(context); } diff --git a/packages/flutter/lib/src/widgets/title.dart b/packages/flutter/lib/src/widgets/title.dart index 74cda745d6..8e2f279c6d 100644 --- a/packages/flutter/lib/src/widgets/title.dart +++ b/packages/flutter/lib/src/widgets/title.dart @@ -24,11 +24,13 @@ class Title extends StatelessWidget { final Widget child; + @override Widget build(BuildContext context) { updateTaskDescription(label: title, color: color); return child; } + @override void debugFillDescription(List description) { super.debugFillDescription(description); if (title != null) diff --git a/packages/flutter/lib/src/widgets/transitions.dart b/packages/flutter/lib/src/widgets/transitions.dart index 2223cda1a9..ed4ad23d21 100644 --- a/packages/flutter/lib/src/widgets/transitions.dart +++ b/packages/flutter/lib/src/widgets/transitions.dart @@ -35,8 +35,10 @@ abstract class AnimatedWidget extends StatefulWidget { Widget build(BuildContext context); /// Subclasses typically do not override this method. + @override _AnimatedState createState() => new _AnimatedState(); + @override void debugFillDescription(List description) { super.debugFillDescription(description); description.add('animation: $animation'); @@ -44,11 +46,13 @@ abstract class AnimatedWidget extends StatefulWidget { } class _AnimatedState extends State { + @override void initState() { super.initState(); config.animation.addListener(_handleTick); } + @override void didUpdateConfig(AnimatedWidget oldConfig) { if (config.animation != oldConfig.animation) { oldConfig.animation.removeListener(_handleTick); @@ -56,6 +60,7 @@ class _AnimatedState extends State { } } + @override void dispose() { config.animation.removeListener(_handleTick); super.dispose(); @@ -67,6 +72,7 @@ class _AnimatedState extends State { }); } + @override Widget build(BuildContext context) { return config.build(context); } @@ -99,6 +105,7 @@ class SlideTransition extends AnimatedWidget { final Widget child; + @override Widget build(BuildContext context) { return new FractionalTranslation( translation: position.value, @@ -132,6 +139,7 @@ class ScaleTransition extends AnimatedWidget { final Widget child; + @override Widget build(BuildContext context) { double scaleValue = scale.value; Matrix4 transform = new Matrix4.identity() @@ -160,6 +168,7 @@ class RotationTransition extends AnimatedWidget { final Widget child; + @override Widget build(BuildContext context) { double turnsValue = turns.value; Matrix4 transform = new Matrix4.rotationZ(turnsValue * math.PI * 2.0); @@ -196,6 +205,7 @@ class SizeTransition extends AnimatedWidget { final Widget child; + @override Widget build(BuildContext context) { return new ClipRect( child: new Align( @@ -226,6 +236,7 @@ class FadeTransition extends AnimatedWidget { final Widget child; + @override Widget build(BuildContext context) { return new Opacity(opacity: opacity.value, child: child); } @@ -240,6 +251,7 @@ class RelativeRectTween extends Tween { RelativeRectTween({ RelativeRect begin, RelativeRect end }) : super(begin: begin, end: end); + @override RelativeRect lerp(double t) => RelativeRect.lerp(begin, end, t); } @@ -262,6 +274,7 @@ class PositionedTransition extends AnimatedWidget { final Widget child; + @override Widget build(BuildContext context) { return new Positioned( top: rect.value.top, @@ -318,6 +331,7 @@ class AnimatedBuilder extends AnimatedWidget { /// performance significantly in some cases and is therefore a good practice. final Widget child; + @override Widget build(BuildContext context) { return builder(context, child); } diff --git a/packages/flutter/lib/src/widgets/unique_widget.dart b/packages/flutter/lib/src/widgets/unique_widget.dart index ecf546be9f..b3c268f4f1 100644 --- a/packages/flutter/lib/src/widgets/unique_widget.dart +++ b/packages/flutter/lib/src/widgets/unique_widget.dart @@ -10,6 +10,7 @@ abstract class UniqueWidget extends StatefulWidget { assert(key != null); } + @override T createState(); /// The state for the unique inflated instance of this widget. diff --git a/packages/flutter/lib/src/widgets/virtual_viewport.dart b/packages/flutter/lib/src/widgets/virtual_viewport.dart index 7e9f6d4812..453ea4c9d7 100644 --- a/packages/flutter/lib/src/widgets/virtual_viewport.dart +++ b/packages/flutter/lib/src/widgets/virtual_viewport.dart @@ -34,6 +34,7 @@ abstract class _WidgetProvider { abstract class VirtualViewportElement extends RenderObjectElement { VirtualViewportElement(VirtualViewport widget) : super(widget); + @override VirtualViewport get widget => super.widget; /// The index of the first child to materialize. @@ -72,8 +73,10 @@ abstract class VirtualViewportElement extends RenderObjectElement { List _materializedChildren = const []; + @override RenderVirtualViewport> get renderObject => super.renderObject; + @override void visitChildren(ElementVisitor visitor) { if (_materializedChildren == null) return; @@ -83,6 +86,7 @@ abstract class VirtualViewportElement extends RenderObjectElement { _WidgetProvider _widgetProvider; + @override void mount(Element parent, dynamic newSlot) { _widgetProvider = widget._createWidgetProvider(); _widgetProvider.didUpdateWidget(null, widget); @@ -91,11 +95,13 @@ abstract class VirtualViewportElement extends RenderObjectElement { updateRenderObject(null); } + @override void unmount() { renderObject.callback = null; super.unmount(); } + @override void update(VirtualViewport newWidget) { VirtualViewport oldWidget = widget; _widgetProvider.didUpdateWidget(oldWidget, newWidget); @@ -169,15 +175,18 @@ abstract class VirtualViewportElement extends RenderObjectElement { _materializedChildren = updateChildren(_materializedChildren, newWidgets); } + @override void insertChildRenderObject(RenderObject child, Element slot) { renderObject.insert(child, after: slot?.renderObject); } + @override void moveChildRenderObject(RenderObject child, Element slot) { assert(child.parent == renderObject); renderObject.move(child, after: slot?.renderObject); } + @override void removeChildRenderObject(RenderObject child) { assert(child.parent == renderObject); renderObject.remove(child); @@ -192,6 +201,7 @@ abstract class VirtualViewportFromIterable extends VirtualViewport { /// The children, some of which might be materialized. Iterable get children; + @override _IterableWidgetProvider _createWidgetProvider() => new _IterableWidgetProvider(); } @@ -200,6 +210,7 @@ class _IterableWidgetProvider extends _WidgetProvider { Iterator _iterator; List _widgets; + @override void didUpdateWidget(VirtualViewportFromIterable oldWidget, VirtualViewportFromIterable newWidget) { if (oldWidget == null || newWidget.children != oldWidget.children) { _iterator = null; @@ -208,8 +219,10 @@ class _IterableWidgetProvider extends _WidgetProvider { } } + @override int get virtualChildCount => _length; + @override void prepareChildren(VirtualViewportElement context, int base, int count) { int limit = base < 0 ? _length : math.min(_length, base + count); if (limit <= _widgets.length) @@ -229,6 +242,7 @@ class _IterableWidgetProvider extends _WidgetProvider { } } + @override Widget getChild(int i) => _widgets[(i % _length).abs()]; } @@ -249,6 +263,7 @@ abstract class VirtualViewportFromBuilder extends VirtualViewport { /// determine which children are visible). ItemListBuilder get itemBuilder; + @override _LazyWidgetProvider _createWidgetProvider() => new _LazyWidgetProvider(); } @@ -257,6 +272,7 @@ class _LazyWidgetProvider extends _WidgetProvider { int _base; List _widgets; + @override void didUpdateWidget(VirtualViewportFromBuilder oldWidget, VirtualViewportFromBuilder newWidget) { // TODO(abarth): We shouldn't check the itemBuilder closure for equality with. // instead, we should use the widget's identity to decide whether to rebuild. @@ -267,8 +283,10 @@ class _LazyWidgetProvider extends _WidgetProvider { } } + @override int get virtualChildCount => _length; + @override void prepareChildren(VirtualViewportElement context, int base, int count) { if (_widgets != null && _widgets.length == count && _base == base) return; @@ -277,6 +295,7 @@ class _LazyWidgetProvider extends _WidgetProvider { _widgets = widget.itemBuilder(context, base, count); } + @override Widget getChild(int i) { int n = _length ?? _widgets.length; return _widgets[(i % n).abs()]; diff --git a/packages/flutter/test/gestures/arena_test.dart b/packages/flutter/test/gestures/arena_test.dart index 6692f383c4..4f49ec6311 100644 --- a/packages/flutter/test/gestures/arena_test.dart +++ b/packages/flutter/test/gestures/arena_test.dart @@ -11,11 +11,15 @@ const int primaryKey = 4; class TestGestureArenaMember extends GestureArenaMember { bool acceptRan = false; + + @override void acceptGesture(int key) { expect(key, equals(primaryKey)); acceptRan = true; } bool rejectRan = false; + + @override void rejectGesture(int key) { expect(key, equals(primaryKey)); rejectRan = true; diff --git a/packages/flutter/test/gestures/double_tap_test.dart b/packages/flutter/test/gestures/double_tap_test.dart index e080d2cde8..2f6d2590cd 100644 --- a/packages/flutter/test/gestures/double_tap_test.dart +++ b/packages/flutter/test/gestures/double_tap_test.dart @@ -9,12 +9,16 @@ import 'package:test/test.dart'; import 'gesture_tester.dart'; class TestGestureArenaMember extends GestureArenaMember { + @override void acceptGesture(int key) { accepted = true; } + + @override void rejectGesture(int key) { rejected = true; } + bool accepted = false; bool rejected = false; } diff --git a/packages/flutter/test/gestures/tap_test.dart b/packages/flutter/test/gestures/tap_test.dart index 9b8382a35b..c81f368a7b 100644 --- a/packages/flutter/test/gestures/tap_test.dart +++ b/packages/flutter/test/gestures/tap_test.dart @@ -9,7 +9,10 @@ import 'package:test/test.dart'; import 'gesture_tester.dart'; class TestGestureArenaMember extends GestureArenaMember { + @override void acceptGesture(int key) {} + + @override void rejectGesture(int key) {} } diff --git a/packages/flutter/test/painting/paint_image_test.dart b/packages/flutter/test/painting/paint_image_test.dart index 078d30e522..7b3f36e7a3 100644 --- a/packages/flutter/test/painting/paint_image_test.dart +++ b/packages/flutter/test/painting/paint_image_test.dart @@ -11,15 +11,20 @@ import 'package:test/test.dart'; class TestImage implements ui.Image { TestImage({ this.width, this.height }); + @override final int width; + + @override final int height; + @override void dispose() { } } class TestCanvas implements Canvas { final List invocations = []; + @override void noSuchMethod(Invocation invocation) { invocations.add(invocation); } diff --git a/packages/flutter/test/rendering/block_test.dart b/packages/flutter/test/rendering/block_test.dart index 9a67565aeb..724fb52bdb 100644 --- a/packages/flutter/test/rendering/block_test.dart +++ b/packages/flutter/test/rendering/block_test.dart @@ -9,6 +9,7 @@ import 'package:test/test.dart'; import 'rendering_tester.dart'; class TestBlockPainter extends RenderObjectPainter { + @override void paint(PaintingContext context, Offset offset) { } } diff --git a/packages/flutter/test/rendering/image_test.dart b/packages/flutter/test/rendering/image_test.dart index 264d60d21c..f5e30613f1 100644 --- a/packages/flutter/test/rendering/image_test.dart +++ b/packages/flutter/test/rendering/image_test.dart @@ -10,20 +10,35 @@ import 'package:test/test.dart'; import 'rendering_tester.dart'; class SquareImage implements ui.Image { + @override int get width => 10; + + @override int get height => 10; + + @override void dispose() { } } class WideImage implements ui.Image { + @override int get width => 20; + + @override int get height => 10; + + @override void dispose() { } } class TallImage implements ui.Image { + @override int get width => 10; + + @override int get height => 20; + + @override void dispose() { } } diff --git a/packages/flutter/test/rendering/intrinsic_width_test.dart b/packages/flutter/test/rendering/intrinsic_width_test.dart index 9f789e574f..c740e7c692 100644 --- a/packages/flutter/test/rendering/intrinsic_width_test.dart +++ b/packages/flutter/test/rendering/intrinsic_width_test.dart @@ -12,23 +12,30 @@ class RenderTestBox extends RenderBox { final BoxConstraints _intrinsicDimensions; + @override double getMinIntrinsicWidth(BoxConstraints constraints) { return constraints.constrainWidth(_intrinsicDimensions.minWidth); } + @override double getMaxIntrinsicWidth(BoxConstraints constraints) { return constraints.constrainWidth(_intrinsicDimensions.maxWidth); } + @override double getMinIntrinsicHeight(BoxConstraints constraints) { return constraints.constrainHeight(_intrinsicDimensions.minHeight); } + @override double getMaxIntrinsicHeight(BoxConstraints constraints) { return constraints.constrainHeight(_intrinsicDimensions.maxHeight); } + @override bool get sizedByParent => true; + + @override void performResize() { size = constraints.constrain(new Size(_intrinsicDimensions.minWidth + (_intrinsicDimensions.maxWidth-_intrinsicDimensions.minWidth) / 2.0, _intrinsicDimensions.minHeight + (_intrinsicDimensions.maxHeight-_intrinsicDimensions.minHeight) / 2.0)); diff --git a/packages/flutter/test/rendering/mutations_test.dart b/packages/flutter/test/rendering/mutations_test.dart index ce9a525658..1a1a24f276 100644 --- a/packages/flutter/test/rendering/mutations_test.dart +++ b/packages/flutter/test/rendering/mutations_test.dart @@ -10,7 +10,10 @@ import 'rendering_tester.dart'; class RenderLayoutTestBox extends RenderProxyBox { RenderLayoutTestBox(this.onLayout); + final VoidCallback onLayout; + + @override void layout(Constraints constraints, { bool parentUsesSize: false }) { // Doing this in tests is ok, but if you're writing your own // render object, you want to override performLayout(), not @@ -20,7 +23,11 @@ class RenderLayoutTestBox extends RenderProxyBox { super.layout(constraints, parentUsesSize: parentUsesSize); onLayout(); } + + @override bool get sizedByParent => true; + + @override void performLayout() { } } diff --git a/packages/flutter/test/rendering/rendering_tester.dart b/packages/flutter/test/rendering/rendering_tester.dart index 6ac6287faf..7719a4738b 100644 --- a/packages/flutter/test/rendering/rendering_tester.dart +++ b/packages/flutter/test/rendering/rendering_tester.dart @@ -13,6 +13,8 @@ class TestRenderView extends RenderView { TestRenderView() { configuration = new ViewConfiguration(size: _kTestViewSize); } + + @override void scheduleInitialFrame() { scheduleInitialLayout(); scheduleInitialPaint(new TransformLayer(transform: new Matrix4.identity())); @@ -27,6 +29,7 @@ enum EnginePhase { } class TestRenderingFlutterBinding extends BindingBase with Scheduler, Services, Renderer, Gesturer { + @override void initRenderView() { if (renderView == null) { renderView = new TestRenderView(); @@ -36,6 +39,7 @@ class TestRenderingFlutterBinding extends BindingBase with Scheduler, Services, EnginePhase phase = EnginePhase.composite; + @override void beginFrame() { RenderObject.flushLayout(); if (phase == EnginePhase.layout) @@ -83,9 +87,11 @@ class TestCallbackPainter extends CustomPainter { final VoidCallback onPaint; + @override void paint(Canvas canvas, Size size) { onPaint(); } + @override bool shouldRepaint(TestCallbackPainter oldPainter) => true; } diff --git a/packages/flutter/test/widget/asset_vendor_test.dart b/packages/flutter/test/widget/asset_vendor_test.dart index 206b516736..42e3775477 100644 --- a/packages/flutter/test/widget/asset_vendor_test.dart +++ b/packages/flutter/test/widget/asset_vendor_test.dart @@ -15,8 +15,14 @@ import 'package:test/test.dart'; class TestImage extends ui.Image { TestImage(this.scale); final double scale; + + @override int get width => (48*scale).floor(); + + @override int get height => (48*scale).floor(); + + @override void dispose() { } } @@ -38,12 +44,17 @@ String testManifest = ''' class TestAssetBundle extends AssetBundle { // Image loading logic routes through load(key) + @override ImageResource loadImage(String key) => null; + + @override Future loadString(String key) { if (key == 'AssetManifest.json') return (new Completer()..complete(testManifest)).future; return null; } + + @override Future load(String key) { core.MojoDataPipeConsumer pipe; switch (key) { @@ -65,6 +76,8 @@ class TestAssetBundle extends AssetBundle { } return (new Completer()..complete(pipe)).future; } + + @override String toString() => '$runtimeType@$hashCode()'; } diff --git a/packages/flutter/test/widget/build_scope_test.dart b/packages/flutter/test/widget/build_scope_test.dart index d95d2fb6ae..12e35cbbe0 100644 --- a/packages/flutter/test/widget/build_scope_test.dart +++ b/packages/flutter/test/widget/build_scope_test.dart @@ -10,21 +10,25 @@ import 'package:test/test.dart'; import 'test_widgets.dart'; class ProbeWidget extends StatefulWidget { + @override ProbeWidgetState createState() => new ProbeWidgetState(); } class ProbeWidgetState extends State { static int buildCount = 0; + @override void initState() { super.initState(); setState(() {}); } + @override void didUpdateConfig(ProbeWidget oldConfig) { setState(() {}); } + @override Widget build(BuildContext context) { setState(() {}); buildCount++; @@ -37,6 +41,7 @@ class BadWidget extends StatelessWidget { final State parentState; + @override Widget build(BuildContext context) { parentState.setState(() {}); return new Container(); @@ -44,24 +49,29 @@ class BadWidget extends StatelessWidget { } class BadWidgetParent extends StatefulWidget { + @override BadWidgetParentState createState() => new BadWidgetParentState(); } class BadWidgetParentState extends State { + @override Widget build(BuildContext context) { return new BadWidget(this); } } class BadDisposeWidget extends StatefulWidget { + @override BadDisposeWidgetState createState() => new BadDisposeWidgetState(); } class BadDisposeWidgetState extends State { + @override Widget build(BuildContext context) { return new Container(); } + @override void dispose() { setState(() {}); super.dispose(); diff --git a/packages/flutter/test/widget/custom_multi_child_layout_test.dart b/packages/flutter/test/widget/custom_multi_child_layout_test.dart index 9b741c896d..00101dd98b 100644 --- a/packages/flutter/test/widget/custom_multi_child_layout_test.dart +++ b/packages/flutter/test/widget/custom_multi_child_layout_test.dart @@ -10,6 +10,7 @@ import 'package:test/test.dart'; class TestMultiChildLayoutDelegate extends MultiChildLayoutDelegate { BoxConstraints getSizeConstraints; + @override Size getSize(BoxConstraints constraints) { if (!RenderObject.debugCheckingIntrinsics) getSizeConstraints = constraints; @@ -21,6 +22,7 @@ class TestMultiChildLayoutDelegate extends MultiChildLayoutDelegate { Size performLayoutSize1; bool performLayoutIsChild; + @override void performLayout(Size size) { assert(!RenderObject.debugCheckingIntrinsics); expect(() { @@ -34,6 +36,8 @@ class TestMultiChildLayoutDelegate extends MultiChildLayoutDelegate { bool shouldRelayoutCalled = false; bool shouldRelayoutValue = false; + + @override bool shouldRelayout(_) { assert(!RenderObject.debugCheckingIntrinsics); shouldRelayoutCalled = true; @@ -58,10 +62,13 @@ class PreferredSizeDelegate extends MultiChildLayoutDelegate { final Size preferredSize; + @override Size getSize(BoxConstraints constraints) => preferredSize; + @override void performLayout(Size size) { } + @override bool shouldRelayout(PreferredSizeDelegate oldDelegate) { return preferredSize != oldDelegate.preferredSize; } diff --git a/packages/flutter/test/widget/custom_one_child_layout_test.dart b/packages/flutter/test/widget/custom_one_child_layout_test.dart index 71e1e94b50..bc88e8a81d 100644 --- a/packages/flutter/test/widget/custom_one_child_layout_test.dart +++ b/packages/flutter/test/widget/custom_one_child_layout_test.dart @@ -13,12 +13,14 @@ class TestSingleChildLayoutDelegate extends SingleChildLayoutDelegate { Size sizeFromGetPositionForChild; Size childSizeFromGetPositionForChild; + @override Size getSize(BoxConstraints constraints) { if (!RenderObject.debugCheckingIntrinsics) constraintsFromGetSize = constraints; return new Size(200.0, 300.0); } + @override BoxConstraints getConstraintsForChild(BoxConstraints constraints) { assert(!RenderObject.debugCheckingIntrinsics); constraintsFromGetConstraintsForChild = constraints; @@ -30,6 +32,7 @@ class TestSingleChildLayoutDelegate extends SingleChildLayoutDelegate { ); } + @override Offset getPositionForChild(Size size, Size childSize) { assert(!RenderObject.debugCheckingIntrinsics); sizeFromGetPositionForChild = size; @@ -39,6 +42,8 @@ class TestSingleChildLayoutDelegate extends SingleChildLayoutDelegate { bool shouldRelayoutCalled = false; bool shouldRelayoutValue = false; + + @override bool shouldRelayout(_) { assert(!RenderObject.debugCheckingIntrinsics); shouldRelayoutCalled = true; diff --git a/packages/flutter/test/widget/custom_paint_test.dart b/packages/flutter/test/widget/custom_paint_test.dart index 7a34d850aa..b8371a0f81 100644 --- a/packages/flutter/test/widget/custom_paint_test.dart +++ b/packages/flutter/test/widget/custom_paint_test.dart @@ -12,10 +12,12 @@ class TestCustomPainter extends CustomPainter { List log; String name; + @override void paint(Canvas canvas, Size size) { log.add(name); } + @override bool shouldRepaint(TestCustomPainter oldPainter) => true; } diff --git a/packages/flutter/test/widget/dismissable_test.dart b/packages/flutter/test/widget/dismissable_test.dart index 1aaf250546..97a1e07366 100644 --- a/packages/flutter/test/widget/dismissable_test.dart +++ b/packages/flutter/test/widget/dismissable_test.dart @@ -107,7 +107,10 @@ void dismissItem(WidgetTester tester, int item, { DismissDirection gestureDirect class Test1215DismissableWidget extends StatelessWidget { Test1215DismissableWidget(this.text); + final String text; + + @override Widget build(BuildContext context) { return new Dismissable( key: new ObjectKey(text), diff --git a/packages/flutter/test/widget/duplicate_key_test.dart b/packages/flutter/test/widget/duplicate_key_test.dart index 0f4bd80530..75a0da3178 100644 --- a/packages/flutter/test/widget/duplicate_key_test.dart +++ b/packages/flutter/test/widget/duplicate_key_test.dart @@ -9,23 +9,32 @@ import 'package:test/test.dart'; class Item { GlobalKey key1 = new GlobalKey(); GlobalKey key2 = new GlobalKey(); + + @override String toString() => "Item($key1, $key2)"; } List items = [new Item(), new Item()]; class StatefulLeaf extends StatefulWidget { StatefulLeaf({ GlobalKey key }) : super(key: key); + + @override StatefulLeafState createState() => new StatefulLeafState(); } class StatefulLeafState extends State { void test() { setState(() { }); } + + @override Widget build(BuildContext context) => new Text('leaf'); } class KeyedWrapper extends StatelessWidget { KeyedWrapper(this.key1, this.key2); + Key key1, key2; + + @override Widget build(BuildContext context) { return new Container( key: key1, diff --git a/packages/flutter/test/widget/focus_test.dart b/packages/flutter/test/widget/focus_test.dart index bfe82b848a..6f206c8ec9 100644 --- a/packages/flutter/test/widget/focus_test.dart +++ b/packages/flutter/test/widget/focus_test.dart @@ -18,6 +18,7 @@ class TestFocusable extends StatelessWidget { final String yes; final bool autofocus; + @override Widget build(BuildContext context) { bool focused = Focus.at(context, autofocus: autofocus); return new GestureDetector( diff --git a/packages/flutter/test/widget/init_state_test.dart b/packages/flutter/test/widget/init_state_test.dart index 418f2ceda4..e0cd698c8c 100644 --- a/packages/flutter/test/widget/init_state_test.dart +++ b/packages/flutter/test/widget/init_state_test.dart @@ -9,10 +9,12 @@ import 'package:test/test.dart'; List ancestors = []; class TestWidget extends StatefulWidget { + @override TestWidgetState createState() => new TestWidgetState(); } class TestWidgetState extends State { + @override void initState() { super.initState(); context.visitAncestorElements((Element element) { @@ -21,6 +23,7 @@ class TestWidgetState extends State { }); } + @override Widget build(BuildContext context) => new Container(); } diff --git a/packages/flutter/test/widget/input_test.dart b/packages/flutter/test/widget/input_test.dart index bbccae3f93..5c6011ebac 100644 --- a/packages/flutter/test/widget/input_test.dart +++ b/packages/flutter/test/widget/input_test.dart @@ -11,14 +11,18 @@ import 'package:test/test.dart'; class MockKeyboard implements mojom.Keyboard { mojom.KeyboardClient client; + @override void setClient(mojom.KeyboardClientStub client, mojom.KeyboardConfiguration configuraiton) { this.client = client.impl; } + @override void show() {} + @override void hide() {} + @override void setEditingState(mojom.EditingState state) {} } diff --git a/packages/flutter/test/widget/modal_barrier_test.dart b/packages/flutter/test/widget/modal_barrier_test.dart index c7b6d19a69..1d2138a7eb 100644 --- a/packages/flutter/test/widget/modal_barrier_test.dart +++ b/packages/flutter/test/widget/modal_barrier_test.dart @@ -88,6 +88,7 @@ void main() { } class FirstWidget extends StatelessWidget { + @override Widget build(BuildContext context) { return new GestureDetector( onTap: () { @@ -101,6 +102,7 @@ class FirstWidget extends StatelessWidget { } class SecondWidget extends StatelessWidget { + @override Widget build(BuildContext context) { return new ModalBarrier( key: const ValueKey('barrier'), diff --git a/packages/flutter/test/widget/navigator_test.dart b/packages/flutter/test/widget/navigator_test.dart index 221d4d9232..df32bceaa9 100644 --- a/packages/flutter/test/widget/navigator_test.dart +++ b/packages/flutter/test/widget/navigator_test.dart @@ -7,6 +7,7 @@ import 'package:flutter/material.dart'; import 'package:test/test.dart'; class FirstWidget extends StatelessWidget { + @override Widget build(BuildContext context) { return new GestureDetector( onTap: () { @@ -23,10 +24,12 @@ class FirstWidget extends StatelessWidget { } class SecondWidget extends StatefulWidget { + @override SecondWidgetState createState() => new SecondWidgetState(); } class SecondWidgetState extends State { + @override Widget build(BuildContext context) { return new GestureDetector( onTap: () => Navigator.pop(context), @@ -48,6 +51,7 @@ class ThirdWidget extends StatelessWidget { final Key targetKey; final ExceptionCallback onException; + @override Widget build(BuildContext context) { return new GestureDetector( key: targetKey, diff --git a/packages/flutter/test/widget/page_forward_transitions_test.dart b/packages/flutter/test/widget/page_forward_transitions_test.dart index d350d317cd..a062eacd58 100644 --- a/packages/flutter/test/widget/page_forward_transitions_test.dart +++ b/packages/flutter/test/widget/page_forward_transitions_test.dart @@ -19,6 +19,7 @@ class TestTransition extends AnimatedWidget { final Widget childFirstHalf; final Widget childSecondHalf; + @override Widget build(BuildContext context) { final Animation animation = this.animation; if (animation.value >= 0.5) @@ -29,9 +30,16 @@ class TestTransition extends AnimatedWidget { class TestRoute extends PageRoute { TestRoute({ this.child, RouteSettings settings}) : super(settings: settings); + final Widget child; + + @override Duration get transitionDuration => kMaterialPageRouteTransitionDuration; + + @override Color get barrierColor => null; + + @override Widget buildPage(BuildContext context, Animation animation, Animation forwardAnimation) { return child; } diff --git a/packages/flutter/test/widget/page_transitions_test.dart b/packages/flutter/test/widget/page_transitions_test.dart index e3756c0e1c..20ed70fe8e 100644 --- a/packages/flutter/test/widget/page_transitions_test.dart +++ b/packages/flutter/test/widget/page_transitions_test.dart @@ -9,6 +9,7 @@ import 'package:test/test.dart'; import 'test_matchers.dart'; class TestOverlayRoute extends OverlayRoute { + @override List get builders => [ _build ]; Widget _build(BuildContext context) => new Text('Overlay'); } diff --git a/packages/flutter/test/widget/remember_scroll_position_test.dart b/packages/flutter/test/widget/remember_scroll_position_test.dart index 6e6b7e3bb8..cb770132a6 100644 --- a/packages/flutter/test/widget/remember_scroll_position_test.dart +++ b/packages/flutter/test/widget/remember_scroll_position_test.dart @@ -7,6 +7,7 @@ import 'package:flutter/material.dart'; import 'package:test/test.dart'; class ThePositiveNumbers extends StatelessWidget { + @override Widget build(BuildContext context) { return new ScrollableLazyList( itemExtent: 100.0, diff --git a/packages/flutter/test/widget/render_object_widget_test.dart b/packages/flutter/test/widget/render_object_widget_test.dart index ed70615805..f7301b6b04 100644 --- a/packages/flutter/test/widget/render_object_widget_test.dart +++ b/packages/flutter/test/widget/render_object_widget_test.dart @@ -13,7 +13,10 @@ final BoxDecoration kBoxDecorationC = new BoxDecoration(); class TestWidget extends StatelessWidget { const TestWidget({ this.child }); + final Widget child; + + @override Widget build(BuildContext context) => child; } diff --git a/packages/flutter/test/widget/reparent_state_test.dart b/packages/flutter/test/widget/reparent_state_test.dart index 5bc58715c9..d20d035d79 100644 --- a/packages/flutter/test/widget/reparent_state_test.dart +++ b/packages/flutter/test/widget/reparent_state_test.dart @@ -11,12 +11,14 @@ class StateMarker extends StatefulWidget { final Widget child; + @override StateMarkerState createState() => new StateMarkerState(); } class StateMarkerState extends State { String marker; + @override Widget build(BuildContext context) { if (config.child != null) return config.child; diff --git a/packages/flutter/test/widget/routes_test.dart b/packages/flutter/test/widget/routes_test.dart index 290ecb07e4..d6f083894a 100644 --- a/packages/flutter/test/widget/routes_test.dart +++ b/packages/flutter/test/widget/routes_test.dart @@ -16,6 +16,7 @@ class TestRoute extends Route { TestRoute(this.name); final String name; + @override List get overlayEntries => _entries; List _entries = []; @@ -24,6 +25,7 @@ class TestRoute extends Route { results.add('$name: $s'); } + @override void install(OverlayEntry insertionPoint) { log('install'); OverlayEntry entry = new OverlayEntry( @@ -35,14 +37,17 @@ class TestRoute extends Route { routes.add(this); } + @override void didPush() { log('didPush'); } + @override void didReplace(TestRoute oldRoute) { log('didReplace ${oldRoute.name}'); } + @override bool didPop(String result) { log('didPop $result'); bool returnValue; @@ -51,14 +56,17 @@ class TestRoute extends Route { return returnValue; } + @override void didPopNext(TestRoute nextRoute) { log('didPopNext ${nextRoute.name}'); } + @override void didChangeNext(TestRoute nextRoute) { log('didChangeNext ${nextRoute?.name}'); } + @override void dispose() { log('dispose'); _entries.forEach((OverlayEntry entry) { entry.remove(); }); diff --git a/packages/flutter/test/widget/set_state_3_test.dart b/packages/flutter/test/widget/set_state_3_test.dart index 0d8b221989..78599de6f9 100644 --- a/packages/flutter/test/widget/set_state_3_test.dart +++ b/packages/flutter/test/widget/set_state_3_test.dart @@ -13,12 +13,14 @@ class Changer extends StatefulWidget { final Widget child; + @override ChangerState createState() => new ChangerState(); } class ChangerState extends State { bool _state = false; + @override void initState() { super.initState(); changer = this; @@ -26,6 +28,7 @@ class ChangerState extends State { void test() { setState(() { _state = true; }); } + @override Widget build(BuildContext context) => _state ? new Wrapper(config.child) : config.child; } @@ -34,14 +37,17 @@ class Wrapper extends StatelessWidget { final Widget child; + @override Widget build(BuildContext context) => child; } class Leaf extends StatefulWidget { + @override LeafState createState() => new LeafState(); } class LeafState extends State { + @override Widget build(BuildContext context) => new Text("leaf"); } diff --git a/packages/flutter/test/widget/set_state_test.dart b/packages/flutter/test/widget/set_state_test.dart index c046ce8cb1..91c6d44ef4 100644 --- a/packages/flutter/test/widget/set_state_test.dart +++ b/packages/flutter/test/widget/set_state_test.dart @@ -7,10 +7,12 @@ import 'package:flutter/widgets.dart'; import 'package:test/test.dart'; class Inside extends StatefulWidget { + @override InsideState createState() => new InsideState(); } class InsideState extends State { + @override Widget build(BuildContext context) { return new Listener( onPointerDown: _handlePointerDown, @@ -28,10 +30,12 @@ class Middle extends StatefulWidget { final Inside child; + @override MiddleState createState() => new MiddleState(); } class MiddleState extends State { + @override Widget build(BuildContext context) { return new Listener( onPointerDown: _handlePointerDown, @@ -45,10 +49,12 @@ class MiddleState extends State { } class Outside extends StatefulWidget { + @override OutsideState createState() => new OutsideState(); } class OutsideState extends State { + @override Widget build(BuildContext context) { return new Middle(child: new Inside()); } diff --git a/packages/flutter/test/widget/stateful_components_test.dart b/packages/flutter/test/widget/stateful_components_test.dart index 179e7e4636..8233ef140e 100644 --- a/packages/flutter/test/widget/stateful_components_test.dart +++ b/packages/flutter/test/widget/stateful_components_test.dart @@ -8,17 +8,21 @@ import 'package:test/test.dart'; class InnerWidget extends StatefulWidget { InnerWidget({ Key key }) : super(key: key); + + @override InnerWidgetState createState() => new InnerWidgetState(); } class InnerWidgetState extends State { bool _didInitState = false; + @override void initState() { super.initState(); _didInitState = true; } + @override Widget build(BuildContext context) { return new Container(); } @@ -29,10 +33,12 @@ class OuterContainer extends StatefulWidget { final InnerWidget child; + @override OuterContainerState createState() => new OuterContainerState(); } class OuterContainerState extends State { + @override Widget build(BuildContext context) { return config.child; } diff --git a/packages/flutter/test/widget/syncing_test.dart b/packages/flutter/test/widget/syncing_test.dart index b6fedcb2ad..8723ebb6c6 100644 --- a/packages/flutter/test/widget/syncing_test.dart +++ b/packages/flutter/test/widget/syncing_test.dart @@ -13,6 +13,7 @@ class TestWidget extends StatefulWidget { final int persistentState; final int syncedState; + @override TestWidgetState createState() => new TestWidgetState(); } @@ -21,12 +22,14 @@ class TestWidgetState extends State { int syncedState; int updates = 0; + @override void initState() { super.initState(); persistentState = config.persistentState; syncedState = config.syncedState; } + @override void didUpdateConfig(TestWidget oldConfig) { syncedState = config.syncedState; // we explicitly do NOT sync the persistentState from the new instance @@ -34,6 +37,7 @@ class TestWidgetState extends State { updates += 1; } + @override Widget build(BuildContext context) => config.child; } diff --git a/packages/flutter/test/widget/test_matchers.dart b/packages/flutter/test/widget/test_matchers.dart index 2b395faa64..d46bddecdc 100644 --- a/packages/flutter/test/widget/test_matchers.dart +++ b/packages/flutter/test/widget/test_matchers.dart @@ -20,25 +20,41 @@ bool _hasAncestorOfType(Element element, Type targetType) { class _IsOnStage extends Matcher { const _IsOnStage(); + + @override bool matches(Element item, Map matchState) => !_hasAncestorOfType(item, OffStage); + + @override Description describe(Description description) => description.add('onstage'); } class _IsOffStage extends Matcher { const _IsOffStage(); + + @override bool matches(Element item, Map matchState) => _hasAncestorOfType(item, OffStage); + + @override Description describe(Description description) => description.add('offstage'); } class _IsInCard extends Matcher { const _IsInCard(); + + @override bool matches(Element item, Map matchState) => _hasAncestorOfType(item, Card); + + @override Description describe(Description description) => description.add('in card'); } class _IsNotInCard extends Matcher { const _IsNotInCard(); + + @override bool matches(Element item, Map matchState) => !_hasAncestorOfType(item, Card); + + @override Description describe(Description description) => description.add('not in card'); } diff --git a/packages/flutter/test/widget/test_semantics.dart b/packages/flutter/test/widget/test_semantics.dart index 9fa4a32777..9f399a3f38 100644 --- a/packages/flutter/test/widget/test_semantics.dart +++ b/packages/flutter/test/widget/test_semantics.dart @@ -9,7 +9,10 @@ class TestSemanticsListener implements mojom.SemanticsListener { TestSemanticsListener() { SemanticsNode.addListener(this); } + final List updates = []; + + @override void updateSemanticsTree(List nodes) { assert(!nodes.any((mojom.SemanticsNode node) => node == null)); updates.addAll(nodes); diff --git a/packages/flutter/test/widget/test_widgets.dart b/packages/flutter/test/widget/test_widgets.dart index 4b6fa29cb2..b48f38f779 100644 --- a/packages/flutter/test/widget/test_widgets.dart +++ b/packages/flutter/test/widget/test_widgets.dart @@ -21,6 +21,7 @@ final BoxDecoration kBoxDecorationC = new BoxDecoration( class TestBuildCounter extends StatelessWidget { static int buildCount = 0; + @override Widget build(BuildContext context) { ++buildCount; return new DecoratedBox(decoration: kBoxDecorationA); @@ -34,6 +35,7 @@ class FlipWidget extends StatefulWidget { final Widget left; final Widget right; + @override FlipWidgetState createState() => new FlipWidgetState(); } @@ -46,6 +48,7 @@ class FlipWidgetState extends State { }); } + @override Widget build(BuildContext context) { return _showLeft ? config.left : config.right; } diff --git a/packages/flutter_driver/lib/src/error.dart b/packages/flutter_driver/lib/src/error.dart index ebb4be356f..cba9e5dadb 100644 --- a/packages/flutter_driver/lib/src/error.dart +++ b/packages/flutter_driver/lib/src/error.dart @@ -15,6 +15,7 @@ class DriverError extends Error { final dynamic originalError; final dynamic originalStackTrace; + @override String toString() { return '''DriverError: $message Original error: $originalError @@ -56,6 +57,7 @@ class LogRecord { final String loggerName; final String message; + @override String toString() => '[${"$level".split(".").last}] $loggerName: $message'; } diff --git a/packages/flutter_driver/lib/src/find.dart b/packages/flutter_driver/lib/src/find.dart index efe7045d63..2b63a9c398 100644 --- a/packages/flutter_driver/lib/src/find.dart +++ b/packages/flutter_driver/lib/src/find.dart @@ -13,12 +13,14 @@ DriverError _createInvalidKeyValueTypeError(String invalidType) { /// Command to find an element. class Find extends Command { + @override final String kind = 'find'; Find(this.searchSpec); final SearchSpecification searchSpec; + @override Map serialize() => searchSpec.serialize(); static Find deserialize(Map json) { @@ -47,6 +49,7 @@ abstract class SearchSpecification { /// Tells [Find] to search by tooltip text. class ByTooltipMessage extends SearchSpecification { + @override final String searchSpecType = 'ByTooltipMessage'; ByTooltipMessage(this.text); @@ -54,6 +57,7 @@ class ByTooltipMessage extends SearchSpecification { /// Tooltip message text. final String text; + @override Map serialize() => super.serialize()..addAll({ 'text': text, }); @@ -65,12 +69,14 @@ class ByTooltipMessage extends SearchSpecification { /// Tells [Find] to search for `Text` widget by text. class ByText extends SearchSpecification { + @override final String searchSpecType = 'ByText'; ByText(this.text); final String text; + @override Map serialize() => super.serialize()..addAll({ 'text': text, }); @@ -82,6 +88,7 @@ class ByText extends SearchSpecification { /// Tells [Find] to search by `ValueKey`. class ByValueKey extends SearchSpecification { + @override final String searchSpecType = 'ByValueKey'; ByValueKey(dynamic keyValue) @@ -103,6 +110,7 @@ class ByValueKey extends SearchSpecification { /// May be one of "String", "int". The list of supported types may change. final String keyValueType; + @override Map serialize() => super.serialize()..addAll({ 'keyValueString': keyValueString, 'keyValueType': keyValueType, @@ -127,12 +135,14 @@ class GetText extends CommandWithTarget { /// [targetRef] identifies an element that contains a piece of text. GetText(ObjectRef targetRef) : super(targetRef); + @override final String kind = 'get_text'; static GetText deserialize(Map json) { return new GetText(new ObjectRef(json['targetRef'])); } + @override Map serialize() => super.serialize(); } @@ -145,6 +155,7 @@ class GetTextResult extends Result { return new GetTextResult(json['text']); } + @override Map toJson() => { 'text': text, }; diff --git a/packages/flutter_driver/lib/src/gesture.dart b/packages/flutter_driver/lib/src/gesture.dart index 4cf0339d90..f040d64288 100644 --- a/packages/flutter_driver/lib/src/gesture.dart +++ b/packages/flutter_driver/lib/src/gesture.dart @@ -5,6 +5,7 @@ import 'message.dart'; class Tap extends CommandWithTarget { + @override final String kind = 'tap'; Tap(ObjectRef targetRef) : super(targetRef); @@ -13,6 +14,7 @@ class Tap extends CommandWithTarget { return new Tap(new ObjectRef(json['targetRef'])); } + @override Map serialize() => super.serialize(); } @@ -21,12 +23,14 @@ class TapResult extends Result { return new TapResult(); } + @override Map toJson() => {}; } /// Command the driver to perform a scrolling action. class Scroll extends CommandWithTarget { + @override final String kind = 'scroll'; Scroll( @@ -59,6 +63,7 @@ class Scroll extends CommandWithTarget { /// The frequency in Hz of the generated move events. final int frequency; + @override Map serialize() => super.serialize()..addAll({ 'dx': '$dx', 'dy': '$dy', @@ -72,5 +77,6 @@ class ScrollResult extends Result { return new ScrollResult(); } + @override Map toJson() => {}; } diff --git a/packages/flutter_driver/lib/src/health.dart b/packages/flutter_driver/lib/src/health.dart index 1fffbe9740..2246f96a6f 100644 --- a/packages/flutter_driver/lib/src/health.dart +++ b/packages/flutter_driver/lib/src/health.dart @@ -7,10 +7,12 @@ import 'message.dart'; /// Requests an application health check. class GetHealth implements Command { + @override final String kind = 'get_health'; static GetHealth deserialize(Map json) => new GetHealth(); + @override Map serialize() => const {}; } @@ -39,6 +41,7 @@ class Health extends Result { /// Health status final HealthStatus status; + @override Map toJson() => { 'status': _healthStatusIndex.toSimpleName(status) }; diff --git a/packages/flutter_driver/lib/src/matcher_util.dart b/packages/flutter_driver/lib/src/matcher_util.dart index 12ab680fa5..39443818b0 100644 --- a/packages/flutter_driver/lib/src/matcher_util.dart +++ b/packages/flutter_driver/lib/src/matcher_util.dart @@ -36,19 +36,23 @@ class MatchResult { class _TextDescription implements Description { final StringBuffer _text = new StringBuffer(); + @override int get length => _text.length; + @override Description add(String text) { _text.write(text); return this; } + @override Description replace(String text) { _text.clear(); _text.write(text); return this; } + @override Description addDescriptionOf(dynamic value) { if (value is Matcher) { value.describe(this); @@ -58,6 +62,7 @@ class _TextDescription implements Description { } } + @override Description addAll(String start, String separator, String end, Iterable list) { add(start); if (list.isNotEmpty) { @@ -71,5 +76,6 @@ class _TextDescription implements Description { return this; } + @override String toString() => '$_text'; } diff --git a/packages/flutter_driver/lib/src/message.dart b/packages/flutter_driver/lib/src/message.dart index 4788c0c3c7..374d98583a 100644 --- a/packages/flutter_driver/lib/src/message.dart +++ b/packages/flutter_driver/lib/src/message.dart @@ -39,6 +39,7 @@ class ObjectRef extends Result { /// tests should not generate these keys. final String objectReferenceKey; + @override Map toJson() => { 'objectReferenceKey': objectReferenceKey, }; @@ -69,6 +70,7 @@ abstract class CommandWithTarget extends Command { /// Map toJson() => super.toJson()..addAll({ /// 'foo': this.foo, /// }); + @override Map serialize() => { 'targetRef': targetRef, }; diff --git a/packages/flutter_markdown/lib/src/markdown.dart b/packages/flutter_markdown/lib/src/markdown.dart index 5edfffdef2..3549ae47e0 100644 --- a/packages/flutter_markdown/lib/src/markdown.dart +++ b/packages/flutter_markdown/lib/src/markdown.dart @@ -34,6 +34,7 @@ class Markdown extends MarkdownRaw { onTapLink: onTapLink ); + @override MarkdownBody createMarkdownBody({ String data, MarkdownStyle markdownStyle, @@ -84,6 +85,7 @@ class MarkdownBody extends MarkdownBodyRaw { onTapLink: onTapLink ); + @override MarkdownStyle createDefaultStyle(BuildContext context) { return new MarkdownStyle.defaultFromTheme(Theme.of(context)); } diff --git a/packages/flutter_markdown/lib/src/markdown_raw.dart b/packages/flutter_markdown/lib/src/markdown_raw.dart index a7414c9f1e..adb2f72227 100644 --- a/packages/flutter_markdown/lib/src/markdown_raw.dart +++ b/packages/flutter_markdown/lib/src/markdown_raw.dart @@ -48,6 +48,7 @@ class MarkdownRaw extends StatelessWidget { /// Callback when a link is tapped final MarkdownLinkCallback onTapLink; + @override Widget build(BuildContext context) { return new ScrollableViewport( child: new Padding( @@ -120,6 +121,7 @@ class MarkdownBodyRaw extends StatefulWidget { /// Callback when a link is tapped final MarkdownLinkCallback onTapLink; + @override _MarkdownBodyRawState createState() => new _MarkdownBodyRawState(); MarkdownStyleRaw createDefaultStyle(BuildContext context) => null; @@ -127,16 +129,19 @@ class MarkdownBodyRaw extends StatefulWidget { class _MarkdownBodyRawState extends State { + @override void initState() { super.initState(); _buildMarkdownCache(); } + @override void dispose() { _linkHandler.dispose(); super.dispose(); } + @override void didUpdateConfig(MarkdownBodyRaw oldConfig) { super.didUpdateConfig(oldConfig); @@ -165,6 +170,7 @@ class _MarkdownBodyRawState extends State { List<_Block> _cachedBlocks; _LinkHandler _linkHandler; + @override Widget build(BuildContext context) { List blocks = []; for (_Block block in _cachedBlocks) { @@ -177,6 +183,7 @@ class _MarkdownBodyRawState extends State { ); } + @override void debugFillDescription(List description) { description.add('cached blocks identity: ${_cachedBlocks.hashCode}'); } @@ -205,6 +212,7 @@ class _Renderer implements md.NodeVisitor { SyntaxHighlighter _syntaxHighlighter; _LinkHandler _linkHandler; + @override void visitText(md.Text text) { _MarkdownNodeList topList = _currentBlock.stack.last; List<_MarkdownNode> top = topList.list; @@ -215,6 +223,7 @@ class _Renderer implements md.NodeVisitor { top.add(new _MarkdownNodeString(text.text)); } + @override bool visitElementBefore(md.Element element) { if (_isListTag(element.tag)) _listIndents.add(element.tag); @@ -241,6 +250,7 @@ class _Renderer implements md.NodeVisitor { return true; } + @override void visitElementAfter(md.Element element) { if (_isListTag(element.tag)) _listIndents.removeLast(); @@ -520,6 +530,7 @@ class _DefaultSyntaxHighlighter extends SyntaxHighlighter{ final TextStyle style; + @override TextSpan format(String source) { return new TextSpan(style: style, children: [new TextSpan(text: source)]); } diff --git a/packages/flutter_sprites/lib/src/action.dart b/packages/flutter_sprites/lib/src/action.dart index d0b6cf9376..c77298ffe4 100644 --- a/packages/flutter_sprites/lib/src/action.dart +++ b/packages/flutter_sprites/lib/src/action.dart @@ -47,6 +47,7 @@ abstract class ActionInterval extends Action { /// The duration, in seconds, of the action. /// /// double myTime = myAction.duration; + @override double get duration => _duration; double _duration; @@ -58,6 +59,7 @@ abstract class ActionInterval extends Action { bool _firstTick = true; double _elapsed = 0.0; + @override void step(double dt) { if (_firstTick) { _firstTick = false; @@ -96,6 +98,7 @@ class ActionRepeat extends ActionInterval { _duration = action.duration * numRepeats; } + @override void update(double t) { int currentRepeat = math.min((t * numRepeats.toDouble()).toInt(), numRepeats - 1); for (int i = math.max(_lastFinishedRepeat, 0); i < currentRepeat; i++) { @@ -124,6 +127,7 @@ class ActionRepeatForever extends Action { /// var myInifiniteLoop = new ActionRepeatForever(myAction); ActionRepeatForever(this.action); + @override void step(double dt) { _elapsedInAction += dt; while (_elapsedInAction > action.duration) { @@ -176,6 +180,7 @@ class ActionSequence extends ActionInterval { } } + @override void update(double t) { if (t < _split) { // Play first action @@ -225,6 +230,7 @@ class ActionSequence extends ActionInterval { action._finished = true; } + @override void _reset() { super._reset(); _a._reset(); @@ -249,6 +255,7 @@ class ActionGroup extends ActionInterval { } } + @override void update(double t) { if (t >= 1.0) { // Finish all unfinished actions @@ -289,6 +296,7 @@ class ActionGroup extends ActionInterval { } } + @override void _reset() { for (Action action in _actions) { action._reset(); @@ -307,9 +315,11 @@ class ActionDelay extends ActionInterval { /// create custom instant actions, only the [fire] method should be overriden. abstract class ActionInstant extends Action { + @override void step(double dt) { } + @override void update(double t) { fire(); _finished = true; @@ -327,6 +337,7 @@ class ActionCallFunction extends ActionInstant { /// var myAction = new ActionCallFunction(() { print("Hello!";) }); ActionCallFunction(this._function); + @override void fire() { _function(); } @@ -341,6 +352,7 @@ class ActionRemoveNode extends ActionInstant { /// var myAction = new ActionRemoveNode(myNode); ActionRemoveNode(this._node); + @override void fire() { _node.removeFromParent(); } @@ -423,6 +435,7 @@ class ActionTween extends ActionInterval { } } + @override void update(double t) { dynamic newVal; diff --git a/packages/flutter_sprites/lib/src/action_spline.dart b/packages/flutter_sprites/lib/src/action_spline.dart index beef3147cf..c6abc13791 100644 --- a/packages/flutter_sprites/lib/src/action_spline.dart +++ b/packages/flutter_sprites/lib/src/action_spline.dart @@ -42,6 +42,7 @@ class ActionSpline extends ActionInterval { double _dt; + @override void update(double t) { int p; diff --git a/packages/flutter_sprites/lib/src/constraint.dart b/packages/flutter_sprites/lib/src/constraint.dart index 99296cf1d3..343cff56fe 100644 --- a/packages/flutter_sprites/lib/src/constraint.dart +++ b/packages/flutter_sprites/lib/src/constraint.dart @@ -48,10 +48,12 @@ class ConstraintRotationToMovement extends Constraint { Point _lastPosition; + @override void preUpdate(Node node, double dt) { _lastPosition = node.position; } + @override void constrain(Node node, double dt) { if (_lastPosition == null) return; if (_lastPosition == node.position) return; @@ -83,6 +85,7 @@ class ConstraintRotationToNode extends Constraint { /// values are in the range 0.0 to 1.0 final double dampening; + @override void constrain(Node node, double dt) { Offset offset; @@ -117,6 +120,7 @@ class ConstraintPositionToNode extends Constraint { final Offset offset; final double dampening; + @override void constrain(Node node, double dt) { Point targetPosition; diff --git a/packages/flutter_sprites/lib/src/effect_line.dart b/packages/flutter_sprites/lib/src/effect_line.dart index 1f94fce6f1..2c8af3647c 100644 --- a/packages/flutter_sprites/lib/src/effect_line.dart +++ b/packages/flutter_sprites/lib/src/effect_line.dart @@ -89,6 +89,7 @@ class EffectLine extends Node { TexturedLinePainter _painter; double _offset = 0.0; + @override void update(double dt) { // Update scrolling position if (animationMode == EffectLineAnimationMode.scroll) { @@ -121,6 +122,7 @@ class EffectLine extends Node { } } + @override void paint(Canvas canvas) { if (points.length < 2) return; diff --git a/packages/flutter_sprites/lib/src/label.dart b/packages/flutter_sprites/lib/src/label.dart index 0318cdc599..218e509388 100644 --- a/packages/flutter_sprites/lib/src/label.dart +++ b/packages/flutter_sprites/lib/src/label.dart @@ -33,6 +33,7 @@ class Label extends Node { TextPainter _painter; double _width; + @override void paint(Canvas canvas) { if (_painter == null) { _painter = new TextPainter(new TextSpan(style: _textStyle, text: _text)); diff --git a/packages/flutter_sprites/lib/src/layer.dart b/packages/flutter_sprites/lib/src/layer.dart index 8c8e5927e2..2c4bb1d1f5 100644 --- a/packages/flutter_sprites/lib/src/layer.dart +++ b/packages/flutter_sprites/lib/src/layer.dart @@ -25,6 +25,7 @@ class Layer extends Node with SpritePaint { ..filterQuality = FilterQuality.low ..isAntiAlias = false; + @override void _prePaint(Canvas canvas, Matrix4 matrix) { super._prePaint(canvas, matrix); @@ -32,6 +33,7 @@ class Layer extends Node with SpritePaint { canvas.saveLayer(layerRect, _cachedPaint); } + @override void _postPaint(Canvas canvas, Matrix4 totalMatrix) { canvas.restore(); super._postPaint(canvas, totalMatrix); diff --git a/packages/flutter_sprites/lib/src/node3d.dart b/packages/flutter_sprites/lib/src/node3d.dart index 1424a215b0..6cc7777c42 100644 --- a/packages/flutter_sprites/lib/src/node3d.dart +++ b/packages/flutter_sprites/lib/src/node3d.dart @@ -38,6 +38,7 @@ class Node3D extends Node { invalidateTransformMatrix(); } + @override Matrix4 computeTransformMatrix() { // Apply normal 2d transforms Matrix4 matrix = super.computeTransformMatrix(); diff --git a/packages/flutter_sprites/lib/src/node_with_size.dart b/packages/flutter_sprites/lib/src/node_with_size.dart index 7cba2e52a5..068d4be2cb 100644 --- a/packages/flutter_sprites/lib/src/node_with_size.dart +++ b/packages/flutter_sprites/lib/src/node_with_size.dart @@ -49,6 +49,7 @@ class NodeWithSize extends Node { } } + @override bool isPointInside (Point nodePoint) { double minX = -size.width * pivot.x; diff --git a/packages/flutter_sprites/lib/src/particle_system.dart b/packages/flutter_sprites/lib/src/particle_system.dart index 3b8fb40aac..7f6c435d81 100644 --- a/packages/flutter_sprites/lib/src/particle_system.dart +++ b/packages/flutter_sprites/lib/src/particle_system.dart @@ -196,6 +196,7 @@ class ParticleSystem extends Node { if (colorSequence == null) colorSequence = new ColorSequence.fromStartAndEndColor(new Color(0xffffffff), new Color(0x00ffffff)); } + @override void update(double dt) { // TODO: Fix this (it's a temp fix for low framerates) if (dt > 0.1) dt = 0.1; @@ -359,6 +360,7 @@ class ParticleSystem extends Node { _numEmittedParticles++; } + @override void paint(Canvas canvas) { if (opacity == 0.0) return; diff --git a/packages/flutter_sprites/lib/src/physics_debug.dart b/packages/flutter_sprites/lib/src/physics_debug.dart index 24616390e1..e254b40a2d 100644 --- a/packages/flutter_sprites/lib/src/physics_debug.dart +++ b/packages/flutter_sprites/lib/src/physics_debug.dart @@ -16,6 +16,7 @@ class _PhysicsDebugDraw extends box2d.DebugDraw { Canvas canvas; + @override void drawSegment(Vector2 p1, Vector2 p2, box2d.Color3i color) { Paint paint = new Paint() ..color = _toColor(color) @@ -23,6 +24,7 @@ class _PhysicsDebugDraw extends box2d.DebugDraw { canvas.drawLine(_toPoint(p1), _toPoint(p2), paint); } + @override void drawSolidPolygon( List vertices, int vertexCount, @@ -40,6 +42,7 @@ class _PhysicsDebugDraw extends box2d.DebugDraw { canvas.drawPath(path, paint); } + @override void drawCircle(Vector2 center, num radius, box2d.Color3i color, [Vector2 axis]) { Paint paint = new Paint() ..color = _toColor(color) @@ -49,6 +52,7 @@ class _PhysicsDebugDraw extends box2d.DebugDraw { canvas.drawCircle(_toPoint(center), _scale(radius), paint); } + @override void drawSolidCircle(Vector2 center, num radius, Vector2 axis, box2d.Color3i color) { Paint paint = new Paint() ..color = _toColor(color); @@ -56,10 +60,12 @@ class _PhysicsDebugDraw extends box2d.DebugDraw { canvas.drawCircle(_toPoint(center), _scale(radius), paint); } + @override void drawPoint(Vector2 point, num radiusOnScreen, box2d.Color3i color) { drawSolidCircle(point, radiusOnScreen, null, color); } + @override void drawParticles( List centers, double radius, @@ -69,6 +75,7 @@ class _PhysicsDebugDraw extends box2d.DebugDraw { // TODO: Implement } + @override void drawParticlesWireframe( List centers, double radius, @@ -78,11 +85,13 @@ class _PhysicsDebugDraw extends box2d.DebugDraw { // TODO: Implement } + @override void drawTransform(box2d.Transform xf, box2d.Color3i color) { drawCircle(xf.p, 0.1, color); // TODO: Improve } + @override void drawStringXY(num x, num y, String s, box2d.Color3i color) { // TODO: Implement } diff --git a/packages/flutter_sprites/lib/src/physics_group.dart b/packages/flutter_sprites/lib/src/physics_group.dart index 36cefa5f59..d6c361dd59 100644 --- a/packages/flutter_sprites/lib/src/physics_group.dart +++ b/packages/flutter_sprites/lib/src/physics_group.dart @@ -9,36 +9,44 @@ part of flutter_sprites; /// group.addChild(myNode); class PhysicsGroup extends Node { + @override void set scaleX(double scaleX) { assert(false); } + @override void set scaleY(double scaleX) { assert(false); } + @override void set skewX(double scaleX) { assert(false); } + @override void set skewY(double scaleX) { assert(false); } + @override void set physicsBody(PhysicsBody body) { assert(false); } + @override void set position(Point position) { super.position = position; _invalidatePhysicsBodies(this); } + @override void set rotation(double rotation) { super.rotation = rotation; _invalidatePhysicsBodies(this); } + @override void set scale(double scale) { super.scale = scale; _invalidatePhysicsBodies(this); @@ -57,6 +65,7 @@ class PhysicsGroup extends Node { } } + @override void addChild(Node node) { super.addChild(node); @@ -80,6 +89,7 @@ class PhysicsGroup extends Node { } } + @override void removeChild(Node node) { super.removeChild(node); diff --git a/packages/flutter_sprites/lib/src/physics_joint.dart b/packages/flutter_sprites/lib/src/physics_joint.dart index f409f4de5d..865870aeff 100644 --- a/packages/flutter_sprites/lib/src/physics_joint.dart +++ b/packages/flutter_sprites/lib/src/physics_joint.dart @@ -183,6 +183,7 @@ class PhysicsJointRevolute extends PhysicsJoint { } } + @override box2d.Joint _createB2Joint(PhysicsWorld physicsNode) { // Create Joint Definition Vector2 vecAnchor = new Vector2( @@ -288,6 +289,7 @@ class PhysicsJointPrismatic extends PhysicsJoint { } } + @override box2d.Joint _createB2Joint(PhysicsWorld physicsNode) { box2d.PrismaticJointDef b2Def = new box2d.PrismaticJointDef(); b2Def.initialize(bodyA._body, bodyB._body, bodyA._body.position, new Vector2(axis.dx, axis.dy)); @@ -318,6 +320,7 @@ class PhysicsJointWeld extends PhysicsJoint { final double dampening; final double frequency; + @override box2d.Joint _createB2Joint(PhysicsWorld physicsNode) { box2d.WeldJointDef b2Def = new box2d.WeldJointDef(); Vector2 middle = new Vector2( @@ -369,6 +372,7 @@ class PhysicsJointPulley extends PhysicsJoint { final Point anchorB; final double ratio; + @override box2d.Joint _createB2Joint(PhysicsWorld physicsNode) { box2d.PulleyJointDef b2Def = new box2d.PulleyJointDef(); b2Def.initialize( @@ -407,6 +411,7 @@ class PhysicsJointGear extends PhysicsJoint { /// The ratio of the rotation for bodyA relative bodyB. final double ratio; + @override box2d.Joint _createB2Joint(PhysicsWorld physicsNode) { box2d.GearJointDef b2Def = new box2d.GearJointDef(); b2Def.bodyA = bodyA._body; @@ -452,6 +457,7 @@ class PhysicsJointDistance extends PhysicsJoint { /// Dampening frequency. final double frequency; + @override box2d.Joint _createB2Joint(PhysicsWorld physicsNode) { box2d.DistanceJointDef b2Def = new box2d.DistanceJointDef(); b2Def.initialize( @@ -498,6 +504,7 @@ class PhysicsJointWheel extends PhysicsJoint { /// Dampening frequency. final double frequency; + @override box2d.Joint _createB2Joint(PhysicsWorld physicsNode) { box2d.WheelJointDef b2Def = new box2d.WheelJointDef(); b2Def.initialize( @@ -533,6 +540,7 @@ class PhysicsJointFriction extends PhysicsJoint { final double maxForce; final double maxTorque; + @override box2d.Joint _createB2Joint(PhysicsWorld physicsNode) { box2d.FrictionJointDef b2Def = new box2d.FrictionJointDef(); b2Def.initialize( @@ -565,6 +573,7 @@ class PhysicsJointConstantVolume extends PhysicsJoint { final double dampening; final double frequency; + @override box2d.Joint _createB2Joint(PhysicsWorld physicsNode) { box2d.ConstantVolumeJointDef b2Def = new box2d.ConstantVolumeJointDef(); for (PhysicsBody body in bodies) { diff --git a/packages/flutter_sprites/lib/src/physics_shape.dart b/packages/flutter_sprites/lib/src/physics_shape.dart index 8f7eef9980..2abbce5b76 100644 --- a/packages/flutter_sprites/lib/src/physics_shape.dart +++ b/packages/flutter_sprites/lib/src/physics_shape.dart @@ -30,6 +30,7 @@ class PhysicsShapeCircle extends PhysicsShape { final Point point; final double radius; + @override box2d.Shape _createB2Shape(PhysicsWorld node, double scale) { box2d.CircleShape shape = new box2d.CircleShape(); shape.p.x = scale * point.x / node.b2WorldToNodeConversionFactor; @@ -52,6 +53,7 @@ class PhysicsShapePolygon extends PhysicsShape { final List points; + @override box2d.Shape _createB2Shape(PhysicsWorld node, double scale) { List vectors = []; for (Point point in points) { @@ -84,6 +86,7 @@ class PhysicsShapeBox extends PhysicsShape { final Point center; final double rotation; + @override box2d.Shape _createB2Shape(PhysicsWorld node, double scale) { box2d.PolygonShape shape = new box2d.PolygonShape(); shape.setAsBox( @@ -114,6 +117,7 @@ class PhysicsShapeChain extends PhysicsShape { final List points; final bool loop; + @override box2d.Shape _createB2Shape(PhysicsWorld node, double scale) { List vectors = []; for (Point point in points) { @@ -145,6 +149,7 @@ class PhysicsShapeEdge extends PhysicsShape { final Point pointA; final Point pointB; + @override box2d.Shape _createB2Shape(PhysicsWorld node, double scale) { box2d.EdgeShape shape = new box2d.EdgeShape(); shape.set( @@ -172,10 +177,12 @@ class PhysicsShapeGroup extends PhysicsShape { final List shapes; + @override box2d.Shape _createB2Shape(PhysicsWorld node, double scale) { return null; } + @override void _invalidate() { for (PhysicsShape shape in shapes) { shape._invalidate(); diff --git a/packages/flutter_sprites/lib/src/physics_world.dart b/packages/flutter_sprites/lib/src/physics_world.dart index df974e9dbd..7a7ed5776a 100644 --- a/packages/flutter_sprites/lib/src/physics_world.dart +++ b/packages/flutter_sprites/lib/src/physics_world.dart @@ -229,6 +229,7 @@ class PhysicsWorld extends Node { } } + @override void addChild(Node node) { super.addChild(node); if (node.physicsBody != null) { @@ -236,6 +237,7 @@ class PhysicsWorld extends Node { } } + @override void removeChild(Node node) { super.removeChild(node); if (node.physicsBody != null) { @@ -267,6 +269,7 @@ class PhysicsWorld extends Node { _contactHandler.addContactCallback(callback, tagA, tagB, type); } + @override void paint(Canvas canvas) { if (drawDebug) { _debugDrawTransform = new Matrix4.fromFloat64List(canvas.getTotalMatrix()); @@ -423,17 +426,22 @@ class _ContactHandler extends box2d.ContactListener { } } + @override void beginContact(box2d.Contact contact) { handleCallback(PhysicsContactType.begin, contact, null, null); } + @override void endContact(box2d.Contact contact) { handleCallback(PhysicsContactType.end, contact, null, null); } + @override void preSolve(box2d.Contact contact, box2d.Manifold oldManifold) { handleCallback(PhysicsContactType.preSolve, contact, oldManifold, null); } + + @override void postSolve(box2d.Contact contact, box2d.ContactImpulse impulse) { handleCallback(PhysicsContactType.postSolve, contact, null, impulse); } diff --git a/packages/flutter_sprites/lib/src/sprite.dart b/packages/flutter_sprites/lib/src/sprite.dart index b770b9d3aa..8ea0ef1f23 100644 --- a/packages/flutter_sprites/lib/src/sprite.dart +++ b/packages/flutter_sprites/lib/src/sprite.dart @@ -44,6 +44,7 @@ class Sprite extends NodeWithSize with SpritePaint { pivot = new Point(0.5, 0.5); } + @override void paint(Canvas canvas) { // Account for pivot point applyTransformForPivot(canvas); diff --git a/packages/flutter_sprites/lib/src/sprite_box.dart b/packages/flutter_sprites/lib/src/sprite_box.dart index 8595d80e95..51c126e5e1 100644 --- a/packages/flutter_sprites/lib/src/sprite_box.dart +++ b/packages/flutter_sprites/lib/src/sprite_box.dart @@ -57,6 +57,7 @@ class SpriteBox extends RenderBox { } } + @override void attach() { super.attach(); _scheduleTick(); @@ -138,6 +139,7 @@ class SpriteBox extends RenderBox { /// var rootNode = mySpriteBox.rootNode; NodeWithSize get rootNode => _rootNode; + @override void performLayout() { size = constraints.biggest; _invalidateTransformMatrix(); @@ -189,6 +191,7 @@ class SpriteBox extends RenderBox { } } + @override void handleEvent(PointerEvent event, _SpriteBoxHitTestEntry entry) { if (!attached) return; @@ -238,6 +241,7 @@ class SpriteBox extends RenderBox { } } + @override bool hitTest(HitTestResult result, { Point position }) { result.add(new _SpriteBoxHitTestEntry(this, position)); return true; @@ -333,6 +337,7 @@ class SpriteBox extends RenderBox { _rootNode._invalidateToBoxTransformMatrix(); } + @override void paint(PaintingContext context, Offset offset) { final Canvas canvas = context.canvas; canvas.save(); diff --git a/packages/flutter_sprites/lib/src/sprite_widget.dart b/packages/flutter_sprites/lib/src/sprite_widget.dart index 37336aff11..58ca2b0104 100644 --- a/packages/flutter_sprites/lib/src/sprite_widget.dart +++ b/packages/flutter_sprites/lib/src/sprite_widget.dart @@ -24,8 +24,10 @@ class SpriteWidget extends SingleChildRenderObjectWidget { /// var mySpriteWidget = new SpriteWidget(mySpriteTree, SpriteBoxTransformMode.fixedHeight); SpriteWidget(this.rootNode, [this.transformMode = SpriteBoxTransformMode.letterbox]); + @override SpriteBox createRenderObject(BuildContext context) => new SpriteBox(rootNode, transformMode); + @override void updateRenderObject(BuildContext context, SpriteBox renderObject) { renderObject ..rootNode = rootNode diff --git a/packages/flutter_sprites/lib/src/textured_line.dart b/packages/flutter_sprites/lib/src/textured_line.dart index 8a36eeac49..59d2c34a24 100644 --- a/packages/flutter_sprites/lib/src/textured_line.dart +++ b/packages/flutter_sprites/lib/src/textured_line.dart @@ -7,6 +7,7 @@ class TexturedLine extends Node { TexturedLinePainter painter; + @override void paint(Canvas canvas) { painter.paint(canvas); } diff --git a/packages/flutter_sprites/lib/src/virtual_joystick.dart b/packages/flutter_sprites/lib/src/virtual_joystick.dart index d4a2695059..612e5d2b50 100644 --- a/packages/flutter_sprites/lib/src/virtual_joystick.dart +++ b/packages/flutter_sprites/lib/src/virtual_joystick.dart @@ -30,6 +30,7 @@ class VirtualJoystick extends NodeWithSize { Paint _paintHandle; Paint _paintControl; + @override bool handleEvent(SpriteBoxEvent event) { if (event.type == PointerDownEvent) { _pointerDownAt = event.boxPosition; @@ -54,6 +55,7 @@ class VirtualJoystick extends NodeWithSize { return true; } + @override void paint(Canvas canvas) { applyTransformForPivot(canvas); canvas.drawCircle(_handlePos, 25.0, _paintHandle); diff --git a/packages/flutter_test/lib/src/widget_tester.dart b/packages/flutter_test/lib/src/widget_tester.dart index 07647bc5a0..a09562ab8e 100644 --- a/packages/flutter_test/lib/src/widget_tester.dart +++ b/packages/flutter_test/lib/src/widget_tester.dart @@ -36,6 +36,7 @@ class _SteppedWidgetFlutterBinding extends WidgetFlutterBinding { EnginePhase phase = EnginePhase.sendSemanticsTree; // Pump the rendering pipeline up to the given phase. + @override void beginFrame() { buildDirtyElements(); _beginFrame(); @@ -123,6 +124,7 @@ class WidgetTester extends Instrumentation { async.flushMicrotasks(); } + @override void dispatchEvent(PointerEvent event, HitTestResult result) { super.dispatchEvent(event, result); async.flushMicrotasks(); diff --git a/packages/flutter_tools/.analysis_options b/packages/flutter_tools/.analysis_options index c773324135..f1976ecc8a 100644 --- a/packages/flutter_tools/.analysis_options +++ b/packages/flutter_tools/.analysis_options @@ -22,7 +22,7 @@ linter: - avoid_empty_else - always_declare_return_types - always_specify_types - # - annotate_overrides # still a lot of work to do before enabling this one + - annotate_overrides # - avoid_as # https://github.com/dart-lang/linter/issues/195 - avoid_init_to_null # - avoid_return_types_on_setters # https://github.com/dart-lang/linter/issues/202 diff --git a/packages/flutter_tools/lib/src/android/adb.dart b/packages/flutter_tools/lib/src/android/adb.dart index 9d35daa23d..afaf6a8485 100644 --- a/packages/flutter_tools/lib/src/android/adb.dart +++ b/packages/flutter_tools/lib/src/android/adb.dart @@ -214,6 +214,7 @@ class AdbDevice { /// Device product; can be null. `peregrine_retus`, `nakasi` String get productID => _info['product']; + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -223,8 +224,10 @@ class AdbDevice { return id == typedOther.id; } + @override int get hashCode => id.hashCode; + @override String toString() { if (modelID == null) { return '$id ($status)'; diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart index b1b1d50aef..bf9515d3cf 100644 --- a/packages/flutter_tools/lib/src/android/android_device.dart +++ b/packages/flutter_tools/lib/src/android/android_device.dart @@ -32,7 +32,10 @@ const String _deviceSnapshotPath = '/data/local/tmp/dev_snapshot.bin'; class AndroidDevices extends PollingDeviceDiscovery { AndroidDevices() : super('AndroidDevices'); + @override bool get supportsPlatform => true; + + @override List pollingGetDevices() => getAdbDevices(); } @@ -50,6 +53,7 @@ class AndroidDevice extends Device { bool _isLocalEmulator; + @override bool get isLocalEmulator { if (_isLocalEmulator == null) { // http://developer.android.com/ndk/guides/abis.html (x86, armeabi-v7a, ...) @@ -152,6 +156,7 @@ class AndroidDevice extends Device { return shaFile.existsSync() ? shaFile.readAsStringSync() : ''; } + @override String get name => modelID; @override @@ -279,6 +284,7 @@ class AndroidDevice extends Device { } } + @override Future stopApp(ApplicationPackage app) { List command = adbCommandForDevice(['shell', 'am', 'force-stop', app.id]); return runCommandAndStreamOutput(command).then((int exitCode) => exitCode == 0); @@ -288,16 +294,19 @@ class AndroidDevice extends Device { @override TargetPlatform get platform => TargetPlatform.android_arm; + @override void clearLogs() { runSync(adbCommandForDevice(['logcat', '-c'])); } + @override DeviceLogReader get logReader { if (_logReader == null) _logReader = new _AdbLogReader(this); return _logReader; } + @override DevicePortForwarder get portForwarder { if (_portForwarder == null) _portForwarder = new _AndroidDevicePortForwarder(this); @@ -382,6 +391,7 @@ class AndroidDevice extends Device { return null; } + @override bool isSupported() => true; Future refreshSnapshot(AndroidApk apk, String snapshotPath) async { @@ -488,14 +498,19 @@ class _AdbLogReader extends DeviceLogReader { StreamSubscription _stdoutSubscription; StreamSubscription _stderrSubscription; + @override Stream get lines => _linesStreamController.stream; + @override String get name => device.name; + @override bool get isReading => _process != null; + @override Future get finished => _process != null ? _process.exitCode : new Future.value(0); + @override Future start() async { if (_process != null) throw new StateError('_AdbLogReader must be stopped before it can be started.'); @@ -516,6 +531,7 @@ class _AdbLogReader extends DeviceLogReader { _process.exitCode.then(_onExit); } + @override Future stop() async { if (_process == null) throw new StateError('_AdbLogReader must be started before it can be stopped.'); @@ -540,8 +556,10 @@ class _AdbLogReader extends DeviceLogReader { _linesStreamController.add(line); } + @override int get hashCode => name.hashCode; + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -560,6 +578,7 @@ class _AndroidDevicePortForwarder extends DevicePortForwarder { return int.parse(portString.trim(), onError: (_) => null); } + @override List get forwardedPorts { final List ports = []; @@ -591,6 +610,7 @@ class _AndroidDevicePortForwarder extends DevicePortForwarder { return ports; } + @override Future forward(int devicePort, { int hostPort }) async { if ((hostPort == null) || (hostPort == 0)) { // Auto select host port. @@ -604,6 +624,7 @@ class _AndroidDevicePortForwarder extends DevicePortForwarder { return hostPort; } + @override Future unforward(ForwardedPort forwardedPort) async { runCheckedSync(device.adbCommandForDevice( ['forward', '--remove', 'tcp:${forwardedPort.hostPort}'] diff --git a/packages/flutter_tools/lib/src/android/android_sdk.dart b/packages/flutter_tools/lib/src/android/android_sdk.dart index 819f64f812..0e605f47c4 100644 --- a/packages/flutter_tools/lib/src/android/android_sdk.dart +++ b/packages/flutter_tools/lib/src/android/android_sdk.dart @@ -175,6 +175,7 @@ class AndroidSdk { _latestVersion = _sdkVersions.isEmpty ? null : _sdkVersions.last; } + @override String toString() => 'AndroidSdk: $directory'; } @@ -211,10 +212,12 @@ class AndroidSdkVersion implements Comparable { return path.join(sdk.directory, 'build-tools', buildToolsVersion, binaryName); } + @override int compareTo(AndroidSdkVersion other) { return sdkLevel - other.sdkLevel; } + @override String toString() => '[${sdk.directory}, SDK version $sdkLevel, build-tools $buildToolsVersion]'; bool _exists(String path, { bool complain: false }) { diff --git a/packages/flutter_tools/lib/src/android/android_workflow.dart b/packages/flutter_tools/lib/src/android/android_workflow.dart index 21a912b47b..9bccb0a443 100644 --- a/packages/flutter_tools/lib/src/android/android_workflow.dart +++ b/packages/flutter_tools/lib/src/android/android_workflow.dart @@ -7,14 +7,19 @@ import '../globals.dart'; import 'android_sdk.dart'; class AndroidWorkflow extends Workflow { + @override String get label => 'Android toolchain'; + @override bool get appliesToHostPlatform => true; + @override bool get canListDevices => getAdbPath(androidSdk) != null; + @override bool get canLaunchDevices => androidSdk != null && androidSdk.validateSdkWellFormed(complain: false); + @override ValidationResult validate() { Validator androidValidator = new Validator( label, @@ -36,5 +41,6 @@ class AndroidWorkflow extends Workflow { return androidValidator.validate(); } + @override void diagnose() => validate().print(); } diff --git a/packages/flutter_tools/lib/src/application_package.dart b/packages/flutter_tools/lib/src/application_package.dart index 1b233b645e..d37690588f 100644 --- a/packages/flutter_tools/lib/src/application_package.dart +++ b/packages/flutter_tools/lib/src/application_package.dart @@ -31,6 +31,7 @@ abstract class ApplicationPackage { String get displayName => name; + @override String toString() => displayName; } @@ -95,6 +96,7 @@ class IOSApp extends ApplicationPackage { return new IOSApp(iosProjectDir: projectDir, iosProjectBundleId: value); } + @override String get displayName => id; } diff --git a/packages/flutter_tools/lib/src/base/logger.dart b/packages/flutter_tools/lib/src/base/logger.dart index 46a3791044..7f2842ca9d 100644 --- a/packages/flutter_tools/lib/src/base/logger.dart +++ b/packages/flutter_tools/lib/src/base/logger.dart @@ -26,22 +26,28 @@ abstract class Logger { } class StdoutLogger implements Logger { + @override bool get isVerbose => false; + @override void printError(String message, [StackTrace stackTrace]) { stderr.writeln(message); if (stackTrace != null) stderr.writeln(stackTrace); } + @override void printStatus(String message) => print(message); + @override void printTrace(String message) { } + @override void flush() { } } class BufferLogger implements Logger { + @override bool get isVerbose => false; StringBuffer _error = new StringBuffer(); @@ -52,33 +58,44 @@ class BufferLogger implements Logger { String get statusText => _status.toString(); String get traceText => _trace.toString(); + @override void printError(String message, [StackTrace stackTrace]) => _error.writeln(message); + + @override void printStatus(String message) => _status.writeln(message); + + @override void printTrace(String message) => _trace.writeln(message); + @override void flush() { } } class VerboseLogger implements Logger { _LogMessage lastMessage; + @override bool get isVerbose => true; + @override void printError(String message, [StackTrace stackTrace]) { _emit(); lastMessage = new _LogMessage(_LogType.error, message, stackTrace); } + @override void printStatus(String message) { _emit(); lastMessage = new _LogMessage(_LogType.status, message); } + @override void printTrace(String message) { _emit(); lastMessage = new _LogMessage(_LogType.trace, message); } + @override void flush() => _emit(); void _emit() { diff --git a/packages/flutter_tools/lib/src/base/os.dart b/packages/flutter_tools/lib/src/base/os.dart index 973b421500..99be5a8b65 100644 --- a/packages/flutter_tools/lib/src/base/os.dart +++ b/packages/flutter_tools/lib/src/base/os.dart @@ -38,12 +38,14 @@ abstract class OperatingSystemUtils { class _PosixUtils extends OperatingSystemUtils { _PosixUtils() : super._private(); + @override ProcessResult makeExecutable(File file) { return Process.runSync('chmod', ['u+x', file.path]); } /// Return the path (with symlinks resolved) to the given executable, or `null` /// if `which` was not able to locate the binary. + @override File which(String execName) { ProcessResult result = Process.runSync('which', [execName]); if (result.exitCode != 0) @@ -57,10 +59,12 @@ class _WindowsUtils extends OperatingSystemUtils { _WindowsUtils() : super._private(); // This is a no-op. + @override ProcessResult makeExecutable(File file) { return new ProcessResult(0, 0, null, null); } + @override File which(String execName) { throw new UnimplementedError('_WindowsUtils.which'); } diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart index db37581efc..25b8bb347e 100644 --- a/packages/flutter_tools/lib/src/base/process.dart +++ b/packages/flutter_tools/lib/src/base/process.dart @@ -136,8 +136,12 @@ String _runWithLoggingSync(List cmd, { } class ProcessExit implements Exception { - final int exitCode; ProcessExit(this.exitCode); + + final int exitCode; + String get message => 'ProcessExit: $exitCode'; + + @override String toString() => message; } diff --git a/packages/flutter_tools/lib/src/commands/analyze.dart b/packages/flutter_tools/lib/src/commands/analyze.dart index f1326c375e..b0a2ab31c7 100644 --- a/packages/flutter_tools/lib/src/commands/analyze.dart +++ b/packages/flutter_tools/lib/src/commands/analyze.dart @@ -118,8 +118,13 @@ class AnalyzeCommand extends FlutterCommand { argParser.addFlag('watch', help: 'Run analysis continuously, watching the filesystem for changes.', negatable: false); } + @override String get name => 'analyze'; + + @override String get description => 'Analyze the project\'s Dart code.'; + + @override bool get requiresProjectRoot => false; bool get isFlutterRepo { @@ -760,6 +765,7 @@ class AnalysisError implements Comparable { int get startColumn => json['location']['startColumn']; int get offset => json['location']['offset']; + @override int compareTo(AnalysisError other) { // Sort in order of file path, error location, severity, and message. if (file != other.file) @@ -775,6 +781,7 @@ class AnalysisError implements Comparable { return message.compareTo(other.message); } + @override String toString() { String relativePath = path.relative(file); return '${severity.toLowerCase().padLeft(7)} • $message • $relativePath:$startLine:$startColumn'; diff --git a/packages/flutter_tools/lib/src/commands/apk.dart b/packages/flutter_tools/lib/src/commands/apk.dart index d6dc01be74..6b13c7ec15 100644 --- a/packages/flutter_tools/lib/src/commands/apk.dart +++ b/packages/flutter_tools/lib/src/commands/apk.dart @@ -136,7 +136,10 @@ class ApkKeystoreInfo { } class ApkCommand extends FlutterCommand { + @override final String name = 'apk'; + + @override final String description = 'Build an Android APK package.'; ApkCommand() { diff --git a/packages/flutter_tools/lib/src/commands/build.dart b/packages/flutter_tools/lib/src/commands/build.dart index 04d80ce8d8..54a54478c9 100644 --- a/packages/flutter_tools/lib/src/commands/build.dart +++ b/packages/flutter_tools/lib/src/commands/build.dart @@ -11,7 +11,10 @@ import '../runner/flutter_command.dart'; import '../toolchain.dart'; class BuildCommand extends FlutterCommand { + @override final String name = 'build'; + + @override final String description = 'Package your Flutter app into an FLX.'; BuildCommand() { @@ -42,6 +45,7 @@ class BuildCommand extends FlutterCommand { return await super.run(); } + @override Future runInProject() async { String compilerPath = argResults['compiler']; diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart index 4024580369..0610177c0f 100644 --- a/packages/flutter_tools/lib/src/commands/create.dart +++ b/packages/flutter_tools/lib/src/commands/create.dart @@ -16,8 +16,13 @@ import '../globals.dart'; import '../template.dart'; class CreateCommand extends Command { + @override final String name = 'create'; + + @override final String description = 'Create a new Flutter project.'; + + @override final List aliases = ['init']; CreateCommand() { @@ -38,6 +43,7 @@ class CreateCommand extends Command { ); } + @override String get invocation => "${runner.executableName} $name "; @override diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart index e2a477a33e..4f205e4502 100644 --- a/packages/flutter_tools/lib/src/commands/daemon.dart +++ b/packages/flutter_tools/lib/src/commands/daemon.dart @@ -28,14 +28,20 @@ const String protocolVersion = '0.1.0'; class DaemonCommand extends FlutterCommand { DaemonCommand({ bool hideCommand: false }) : _hideCommand = hideCommand; + @override final String name = 'daemon'; + + @override final String description = 'Run a persistent, JSON-RPC based server to communicate with devices.'; final bool _hideCommand; + @override bool get requiresProjectRoot => false; + @override bool get hidden => _hideCommand; + @override Future runInProject() { printStatus('Starting device daemon...'); @@ -155,6 +161,7 @@ abstract class Domain { FlutterCommand get command => daemon.daemonCommand; + @override String toString() => name; void handleCommand(String command, dynamic id, dynamic args) { @@ -220,6 +227,7 @@ class DaemonDomain extends Domain { return new Future.value(); } + @override void dispose() { _subscription?.cancel(); } @@ -371,6 +379,7 @@ class DeviceDomain extends Domain { return new Future.value(); } + @override void dispose() { for (PollingDeviceDiscovery discoverer in _discoverers) { discoverer.dispose(); @@ -410,14 +419,17 @@ class NotifyingLogger extends Logger { Stream get onMessage => _messageController.stream; + @override void printError(String message, [StackTrace stackTrace]) { _messageController.add(new LogMessage('error', message, stackTrace)); } + @override void printStatus(String message) { _messageController.add(new LogMessage('status', message)); } + @override void printTrace(String message) { // This is a lot of traffic to send over the wire. } diff --git a/packages/flutter_tools/lib/src/commands/devices.dart b/packages/flutter_tools/lib/src/commands/devices.dart index 1f3b071014..dd9430972e 100644 --- a/packages/flutter_tools/lib/src/commands/devices.dart +++ b/packages/flutter_tools/lib/src/commands/devices.dart @@ -10,12 +10,19 @@ import '../globals.dart'; import '../runner/flutter_command.dart'; class DevicesCommand extends FlutterCommand { + @override final String name = 'devices'; + + @override final String description = 'List all connected devices.'; + + @override final List aliases = ['list']; + @override bool get requiresProjectRoot => false; + @override Future runInProject() async { if (!doctor.canListAnything) { printError("Unable to locate a development device; please run 'flutter doctor' for " diff --git a/packages/flutter_tools/lib/src/commands/doctor.dart b/packages/flutter_tools/lib/src/commands/doctor.dart index dd30c60ce1..188024d1c9 100644 --- a/packages/flutter_tools/lib/src/commands/doctor.dart +++ b/packages/flutter_tools/lib/src/commands/doctor.dart @@ -10,11 +10,16 @@ import '../runner/flutter_command.dart'; import '../runner/version.dart'; class DoctorCommand extends FlutterCommand { + @override final String name = 'doctor'; + + @override final String description = 'Show information about the installed tooling.'; + @override bool get requiresProjectRoot => false; + @override Future runInProject() async { // general info String flutterRoot = ArtifactStore.flutterRoot; diff --git a/packages/flutter_tools/lib/src/commands/drive.dart b/packages/flutter_tools/lib/src/commands/drive.dart index 5cbbe6fdf5..72e4e700b5 100644 --- a/packages/flutter_tools/lib/src/commands/drive.dart +++ b/packages/flutter_tools/lib/src/commands/drive.dart @@ -64,8 +64,13 @@ class DriveCommand extends RunCommandBase { help: 'Listen to the given port for a debug connection.'); } + @override final String name = 'drive'; + + @override final String description = 'Runs Flutter Driver tests for the current project.'; + + @override final List aliases = ['driver']; Device _device; diff --git a/packages/flutter_tools/lib/src/commands/install.dart b/packages/flutter_tools/lib/src/commands/install.dart index a801b221ff..3e68041f23 100644 --- a/packages/flutter_tools/lib/src/commands/install.dart +++ b/packages/flutter_tools/lib/src/commands/install.dart @@ -10,9 +10,13 @@ import '../globals.dart'; import '../runner/flutter_command.dart'; class InstallCommand extends FlutterCommand { + @override final String name = 'install'; + + @override final String description = 'Install a Flutter app on an attached device.'; + @override bool get requiresDevice => true; @override diff --git a/packages/flutter_tools/lib/src/commands/listen.dart b/packages/flutter_tools/lib/src/commands/listen.dart index 14cc781943..1550a08cd8 100644 --- a/packages/flutter_tools/lib/src/commands/listen.dart +++ b/packages/flutter_tools/lib/src/commands/listen.dart @@ -10,9 +10,14 @@ import '../globals.dart'; import 'run.dart'; class ListenCommand extends RunCommandBase { + @override final String name = 'listen'; + + @override final String description = 'Listen for changes to files and reload the running app (Android only).'; + + @override final String usageFooter = 'By default, only listens to "./" and "./lib/". To listen to additional directories, list them on\n' 'the command line.'; @@ -22,8 +27,10 @@ class ListenCommand extends RunCommandBase { ListenCommand({ this.singleRun: false }); + @override bool get androidOnly => true; + @override bool get requiresDevice => true; @override diff --git a/packages/flutter_tools/lib/src/commands/logs.dart b/packages/flutter_tools/lib/src/commands/logs.dart index 9170c12ba3..5190685de5 100644 --- a/packages/flutter_tools/lib/src/commands/logs.dart +++ b/packages/flutter_tools/lib/src/commands/logs.dart @@ -9,7 +9,10 @@ import '../globals.dart'; import '../runner/flutter_command.dart'; class LogsCommand extends FlutterCommand { + @override final String name = 'logs'; + + @override final String description = 'Show log output for running Flutter apps.'; LogsCommand() { @@ -20,10 +23,13 @@ class LogsCommand extends FlutterCommand { ); } + @override bool get requiresProjectRoot => false; + @override bool get requiresDevice => true; + @override Future runInProject() async { Device device = deviceForCommand; diff --git a/packages/flutter_tools/lib/src/commands/refresh.dart b/packages/flutter_tools/lib/src/commands/refresh.dart index 7f7ced0b30..1c4b54bb28 100644 --- a/packages/flutter_tools/lib/src/commands/refresh.dart +++ b/packages/flutter_tools/lib/src/commands/refresh.dart @@ -12,15 +12,20 @@ import '../globals.dart'; import '../runner/flutter_command.dart'; class RefreshCommand extends FlutterCommand { + @override final String name = 'refresh'; + + @override final String description = 'Build and deploy the Dart code in a Flutter app (Android only).'; RefreshCommand() { addTargetOption(); } + @override bool get androidOnly => true; + @override bool get requiresDevice => true; @override diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index 09f627e471..eefe53566a 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -53,8 +53,13 @@ abstract class RunCommandBase extends FlutterCommand { } class RunCommand extends RunCommandBase { + @override final String name = 'run'; + + @override final String description = 'Run your Flutter app on an attached device.'; + + @override final List aliases = ['start']; RunCommand() { @@ -76,6 +81,7 @@ class RunCommand extends RunCommandBase { help: 'Listen to the given port for a debug connection.'); } + @override bool get requiresDevice => true; @override diff --git a/packages/flutter_tools/lib/src/commands/run_mojo.dart b/packages/flutter_tools/lib/src/commands/run_mojo.dart index 3f9bde43c1..d7e1642a9a 100644 --- a/packages/flutter_tools/lib/src/commands/run_mojo.dart +++ b/packages/flutter_tools/lib/src/commands/run_mojo.dart @@ -18,7 +18,10 @@ import 'run.dart'; const String _kDefaultBundlePath = 'build/app.flx'; class RunMojoCommand extends FlutterCommand { + @override final String name = 'run_mojo'; + + @override final String description = 'Run a Flutter app in mojo (from github.com/domokit/mojo).'; final bool _hideCommand; @@ -37,7 +40,10 @@ class RunMojoCommand extends FlutterCommand { argParser.addOption('devtools-path', help: 'Path to mojo devtools\' mojo_run command.'); } + @override bool get requiresProjectRoot => false; + + @override bool get hidden => _hideCommand; // TODO(abarth): Why not use path.absolute? diff --git a/packages/flutter_tools/lib/src/commands/stop.dart b/packages/flutter_tools/lib/src/commands/stop.dart index fd38f3846c..9a4ad86c36 100644 --- a/packages/flutter_tools/lib/src/commands/stop.dart +++ b/packages/flutter_tools/lib/src/commands/stop.dart @@ -10,9 +10,13 @@ import '../globals.dart'; import '../runner/flutter_command.dart'; class StopCommand extends FlutterCommand { + @override final String name = 'stop'; + + @override final String description = 'Stop your Flutter app on an attached device.'; + @override bool get requiresDevice => true; @override diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart index c50cece064..50d1e8e4b0 100644 --- a/packages/flutter_tools/lib/src/commands/test.dart +++ b/packages/flutter_tools/lib/src/commands/test.dart @@ -23,8 +23,13 @@ class TestCommand extends FlutterCommand { ); } + @override String get name => 'test'; + + @override String get description => 'Run Flutter unit tests for the current project (Linux only).'; + + @override bool get requiresProjectRoot => false; @override diff --git a/packages/flutter_tools/lib/src/commands/trace.dart b/packages/flutter_tools/lib/src/commands/trace.dart index 4387a60269..fe6a54fb25 100644 --- a/packages/flutter_tools/lib/src/commands/trace.dart +++ b/packages/flutter_tools/lib/src/commands/trace.dart @@ -10,8 +10,13 @@ import '../globals.dart'; import '../runner/flutter_command.dart'; class TraceCommand extends FlutterCommand { + @override final String name = 'trace'; + + @override final String description = 'Start and stop tracing for a running Flutter app (Android only).'; + + @override final String usageFooter = '\`trace\` called with no arguments will automatically start tracing, delay a set amount of\n' 'time (controlled by --duration), and stop tracing. To explicitly control tracing, call trace\n' @@ -25,8 +30,10 @@ class TraceCommand extends FlutterCommand { defaultsTo: '10', abbr: 'd', help: 'Duration in seconds to trace.'); } + @override bool get androidOnly => true; + @override bool get requiresDevice => true; @override diff --git a/packages/flutter_tools/lib/src/commands/update_packages.dart b/packages/flutter_tools/lib/src/commands/update_packages.dart index e89c3dab28..4f08273774 100644 --- a/packages/flutter_tools/lib/src/commands/update_packages.dart +++ b/packages/flutter_tools/lib/src/commands/update_packages.dart @@ -32,12 +32,17 @@ class UpdatePackagesCommand extends FlutterCommand { ); } + @override final String name = 'update-packages'; + + @override final String description = 'Update the packages inside the Flutter repo.'; + @override bool get hidden => _hideCommand; final bool _hideCommand; + @override bool get requiresProjectRoot => false; @override diff --git a/packages/flutter_tools/lib/src/commands/upgrade.dart b/packages/flutter_tools/lib/src/commands/upgrade.dart index fbe67eedf9..a4b327f031 100644 --- a/packages/flutter_tools/lib/src/commands/upgrade.dart +++ b/packages/flutter_tools/lib/src/commands/upgrade.dart @@ -11,7 +11,10 @@ import '../runner/flutter_command.dart'; import '../runner/version.dart'; class UpgradeCommand extends FlutterCommand { + @override final String name = 'upgrade'; + + @override final String description = 'Upgrade your copy of Flutter.'; @override diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart index feacb2b8b7..1764dc1f22 100644 --- a/packages/flutter_tools/lib/src/device.dart +++ b/packages/flutter_tools/lib/src/device.dart @@ -111,6 +111,7 @@ abstract class PollingDeviceDiscovery extends DeviceDiscovery { _timer = null; } + @override List get devices { if (_items == null) _items = new ItemListNotifier.from(pollingGetDevices()); @@ -131,6 +132,7 @@ abstract class PollingDeviceDiscovery extends DeviceDiscovery { void dispose() => stopPolling(); + @override String toString() => '$name device discovery'; } @@ -189,8 +191,10 @@ abstract class Device { /// Stop an app package on the current device. Future stopApp(ApplicationPackage app); + @override int get hashCode => id.hashCode; + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -199,6 +203,7 @@ abstract class Device { return id == other.id; } + @override String toString() => name; static void printDevices(List devices) { @@ -225,6 +230,7 @@ class ForwardedPort { final int hostPort; final int devicePort; + @override String toString() => 'ForwardedPort HOST:$hostPort to DEVICE:$devicePort'; } @@ -266,8 +272,12 @@ abstract class DeviceLogReader { /// Completes when the log is finished. Future get finished; + @override int get hashCode; + + @override bool operator ==(dynamic other); + @override String toString() => name; } diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart index cbd9b03baf..41c75cbb69 100644 --- a/packages/flutter_tools/lib/src/doctor.dart +++ b/packages/flutter_tools/lib/src/doctor.dart @@ -228,8 +228,10 @@ class _AtomValidator extends DoctorValidator { : path.join(env['HOME'], '.atom'); } + @override String get label => 'Atom development environment'; + @override ValidationResult validate() { Validator atomValidator = new Validator( label, @@ -263,5 +265,6 @@ class _AtomValidator extends DoctorValidator { return atomValidator.validate(); } + @override void diagnose() => validate().print(); } diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart index 6f9157567c..c7f84d3b06 100644 --- a/packages/flutter_tools/lib/src/ios/devices.dart +++ b/packages/flutter_tools/lib/src/ios/devices.dart @@ -25,7 +25,10 @@ const String _ideviceinstallerInstructions = class IOSDevices extends PollingDeviceDiscovery { IOSDevices() : super('IOSDevices'); + @override bool get supportsPlatform => Platform.isMacOS; + + @override List pollingGetDevices() => IOSDevice.getAttachedDevices(); } @@ -62,14 +65,17 @@ class IOSDevice extends Device { String _pusherPath; String get pusherPath => _pusherPath; + @override final String name; _IOSDeviceLogReader _logReader; _IOSDevicePortForwarder _portForwarder; + @override bool get isLocalEmulator => false; + @override bool get supportsStartPaused => false; static List getAttachedDevices([IOSDevice mockIOS]) { @@ -226,6 +232,7 @@ class IOSDevice extends Device { @override TargetPlatform get platform => TargetPlatform.ios_arm; + @override DeviceLogReader get logReader { if (_logReader == null) _logReader = new _IOSDeviceLogReader(this); @@ -233,6 +240,7 @@ class IOSDevice extends Device { return _logReader; } + @override DevicePortForwarder get portForwarder { if (_portForwarder == null) _portForwarder = new _IOSDevicePortForwarder(this); @@ -240,6 +248,7 @@ class IOSDevice extends Device { return _portForwarder; } + @override void clearLogs() { } } @@ -256,16 +265,21 @@ class _IOSDeviceLogReader extends DeviceLogReader { StreamSubscription _stdoutSubscription; StreamSubscription _stderrSubscription; + @override Stream get lines => _linesStreamController.stream; + @override String get name => device.name; + @override bool get isReading => _process != null; + @override Future get finished { return _process != null ? _process.exitCode : new Future.value(0); } + @override Future start() async { if (_process != null) { throw new StateError( @@ -282,6 +296,7 @@ class _IOSDeviceLogReader extends DeviceLogReader { _process.exitCode.then(_onExit); } + @override Future stop() async { if (_process == null) { throw new StateError( @@ -313,8 +328,10 @@ class _IOSDeviceLogReader extends DeviceLogReader { _linesStreamController.add(line); } + @override int get hashCode => name.hashCode; + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -329,12 +346,14 @@ class _IOSDevicePortForwarder extends DevicePortForwarder { final IOSDevice device; + @override List get forwardedPorts { final List ports = []; // TODO(chinmaygarde): Implement. return ports; } + @override Future forward(int devicePort, {int hostPort: null}) async { if ((hostPort == null) || (hostPort == 0)) { // Auto select host port. @@ -344,6 +363,7 @@ class _IOSDevicePortForwarder extends DevicePortForwarder { return hostPort; } + @override Future unforward(ForwardedPort forwardedPort) async { // TODO(chinmaygarde): Implement. } diff --git a/packages/flutter_tools/lib/src/ios/ios_workflow.dart b/packages/flutter_tools/lib/src/ios/ios_workflow.dart index 67eda8daf1..10b1447c3a 100644 --- a/packages/flutter_tools/lib/src/ios/ios_workflow.dart +++ b/packages/flutter_tools/lib/src/ios/ios_workflow.dart @@ -9,17 +9,22 @@ import '../doctor.dart'; import 'mac.dart'; class IOSWorkflow extends Workflow { + @override String get label => 'iOS toolchain'; + @override bool get appliesToHostPlatform => Platform.isMacOS; // We need xcode (+simctl) to list simulator devices, and idevice_id to list real devices. + @override bool get canListDevices => XCode.instance.isInstalledAndMeetsVersionCheck; // We need xcode to launch simulator devices, and ideviceinstaller and ios-deploy // for real devices. + @override bool get canLaunchDevices => XCode.instance.isInstalledAndMeetsVersionCheck; + @override ValidationResult validate() { Validator iosValidator = new Validator( label, @@ -101,6 +106,7 @@ class IOSWorkflow extends Workflow { return iosValidator.validate(); } + @override void diagnose() => validate().print(); bool get hasIdeviceId => exitsHappy(['idevice_id', '-h']); diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart index 7cf761d615..962364286c 100644 --- a/packages/flutter_tools/lib/src/ios/simulators.dart +++ b/packages/flutter_tools/lib/src/ios/simulators.dart @@ -27,7 +27,10 @@ const String _kFlutterTestDevice = 'flutter.test.device'; class IOSSimulators extends PollingDeviceDiscovery { IOSSimulators() : super('IOSSimulators'); + @override bool get supportsPlatform => Platform.isMacOS; + + @override List pollingGetDevices() => IOSSimulatorUtils.instance.getAttachedDevices(); } @@ -314,8 +317,10 @@ class SimDevice { class IOSSimulator extends Device { IOSSimulator(String id, { this.name }) : super(id); + @override final String name; + @override bool get isLocalEmulator => true; _IOSSimulatorLogReader _logReader; @@ -536,6 +541,7 @@ class IOSSimulator extends Device { @override TargetPlatform get platform => TargetPlatform.ios_x64; + @override DeviceLogReader get logReader { if (_logReader == null) _logReader = new _IOSSimulatorLogReader(this); @@ -543,6 +549,7 @@ class IOSSimulator extends Device { return _logReader; } + @override DevicePortForwarder get portForwarder { if (_portForwarder == null) _portForwarder = new _IOSSimulatorDevicePortForwarder(this); @@ -550,6 +557,7 @@ class IOSSimulator extends Device { return _portForwarder; } + @override void clearLogs() { File logFile = new File(logFilePath); if (logFile.existsSync()) { @@ -585,16 +593,21 @@ class _IOSSimulatorLogReader extends DeviceLogReader { StreamSubscription _systemStdoutSubscription; StreamSubscription _systemStderrSubscription; + @override Stream get lines => _linesStreamController.stream; + @override String get name => device.name; + @override bool get isReading => (_deviceProcess != null) && (_systemProcess != null); + @override Future get finished { return (_deviceProcess != null) ? _deviceProcess.exitCode : new Future.value(0); } + @override Future start() async { if (isReading) { throw new StateError( @@ -630,6 +643,7 @@ class _IOSSimulatorLogReader extends DeviceLogReader { _systemProcess.exitCode.then(_onSystemExit); } + @override Future stop() async { if (!isReading) { throw new StateError( @@ -727,8 +741,10 @@ class _IOSSimulatorLogReader extends DeviceLogReader { _linesStreamController.add(filteredLine); } + @override int get hashCode => device.logFilePath.hashCode; + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -789,10 +805,12 @@ class _IOSSimulatorDevicePortForwarder extends DevicePortForwarder { final List _ports = []; + @override List get forwardedPorts { return _ports; } + @override Future forward(int devicePort, {int hostPort: null}) async { if ((hostPort == null) || (hostPort == 0)) { hostPort = devicePort; @@ -802,6 +820,7 @@ class _IOSSimulatorDevicePortForwarder extends DevicePortForwarder { return hostPort; } + @override Future unforward(ForwardedPort forwardedPort) async { _ports.remove(forwardedPort); } diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index b763f8e81c..d20c7b2d0b 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart @@ -18,6 +18,7 @@ import 'flutter_command_runner.dart'; typedef bool Validator(); abstract class FlutterCommand extends Command { + @override FlutterCommandRunner get runner => super.runner; /// Whether this command needs to be run from the root of a project. @@ -43,6 +44,7 @@ abstract class FlutterCommand extends Command { applicationPackages ??= await ApplicationPackageStore.forConfigs(buildConfigurations); } + @override Future run() { Stopwatch stopwatch = new Stopwatch()..start(); diff --git a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart index b89c9ece44..630f01d489 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart @@ -124,6 +124,7 @@ class FlutterCommandRunner extends CommandRunner { defaultsTo: 'out/ios_sim_Release/'); } + @override String get usageFooter { return 'Run "flutter -h -v" for verbose help output, including less commonly used options.\n' '\n' @@ -165,6 +166,7 @@ class FlutterCommandRunner extends CommandRunner { return '.'; } + @override Future run(Iterable args) { return super.run(args).then((dynamic result) { logger.flush(); @@ -172,6 +174,7 @@ class FlutterCommandRunner extends CommandRunner { }); } + @override Future runCommand(ArgResults globalResults) { _globalResults = globalResults; diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart index 61cbba08d5..f2db4172ff 100644 --- a/packages/flutter_tools/lib/src/test/flutter_platform.dart +++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart @@ -55,6 +55,7 @@ Future _startProcess(String mainPath, { String packageRoot }) { } class FlutterPlatform extends PlatformPlugin { + @override StreamChannel loadChannel(String mainPath, TestPlatform platform) { return StreamChannelCompleter.fromFuture(_startTest(mainPath)); } diff --git a/packages/flutter_tools/lib/src/zip.dart b/packages/flutter_tools/lib/src/zip.dart index fb6c28ef18..f607ed9ba9 100644 --- a/packages/flutter_tools/lib/src/zip.dart +++ b/packages/flutter_tools/lib/src/zip.dart @@ -48,6 +48,7 @@ class ZipEntry { class _ArchiveZipBuilder extends ZipBuilder { _ArchiveZipBuilder() : super._(); + @override void createZip(File outFile, Directory zipBuildDir) { Archive archive = new Archive(); @@ -69,6 +70,7 @@ class _ArchiveZipBuilder extends ZipBuilder { class _ZipToolBuilder extends ZipBuilder { _ZipToolBuilder() : super._(); + @override void createZip(File outFile, Directory zipBuildDir) { if (outFile.existsSync()) outFile.deleteSync(); diff --git a/packages/flutter_tools/test/src/context.dart b/packages/flutter_tools/test/src/context.dart index db5283c39a..c06c0b713c 100644 --- a/packages/flutter_tools/test/src/context.dart +++ b/packages/flutter_tools/test/src/context.dart @@ -69,16 +69,22 @@ void testUsingContext(String description, dynamic testMethod(), { class MockDeviceManager implements DeviceManager { List devices = []; + @override String specifiedDeviceId; + + @override bool get hasSpecifiedDeviceId => specifiedDeviceId != null; + @override Future> getAllConnectedDevices() => new Future>.value(devices); + @override Future getDeviceById(String deviceId) { Device device = devices.firstWhere((Device device) => device.id == deviceId, orElse: () => null); return new Future.value(device); } + @override Future> getDevices() async { if (specifiedDeviceId == null) { return getAllConnectedDevices(); @@ -93,6 +99,7 @@ class MockDeviceManager implements DeviceManager { class MockDoctor extends Doctor { // True for testing. + @override bool get canLaunchAnything => true; } diff --git a/packages/flutter_tools/test/src/mocks.dart b/packages/flutter_tools/test/src/mocks.dart index 52db59ea99..dba59e90e0 100644 --- a/packages/flutter_tools/test/src/mocks.dart +++ b/packages/flutter_tools/test/src/mocks.dart @@ -36,21 +36,31 @@ class MockToolchain extends Toolchain { } class MockAndroidDevice extends Mock implements AndroidDevice { + @override TargetPlatform get platform => TargetPlatform.android_arm; + + @override bool isSupported() => true; } class MockIOSDevice extends Mock implements IOSDevice { + @override TargetPlatform get platform => TargetPlatform.ios_arm; + + @override bool isSupported() => true; } class MockIOSSimulator extends Mock implements IOSSimulator { + @override TargetPlatform get platform => TargetPlatform.ios_x64; + + @override bool isSupported() => true; } class MockDeviceLogReader extends DeviceLogReader { + @override String get name => 'MockLogReader'; final StreamController _linesStreamController = @@ -58,6 +68,7 @@ class MockDeviceLogReader extends DeviceLogReader { final Completer _finishedCompleter = new Completer(); + @override Stream get lines => _linesStreamController.stream; void addLine(String line) { @@ -66,19 +77,23 @@ class MockDeviceLogReader extends DeviceLogReader { bool _started = false; + @override Future start() async { assert(!_started); _started = true; } + @override bool get isReading => _started; + @override Future stop() { assert(_started); _started = false; return new Future.value(); } + @override Future get finished => _finishedCompleter.future; } diff --git a/packages/newton/lib/src/clamped_simulation.dart b/packages/newton/lib/src/clamped_simulation.dart index b56abf7cbc..daa172b722 100644 --- a/packages/newton/lib/src/clamped_simulation.dart +++ b/packages/newton/lib/src/clamped_simulation.dart @@ -22,7 +22,12 @@ class ClampedSimulation extends Simulation { final double dxMin; final double dxMax; + @override double x(double time) => simulation.x(time).clamp(xMin, xMax); + + @override double dx(double time) => simulation.dx(time).clamp(dxMin, dxMax); + + @override bool isDone(double time) => simulation.isDone(time); } diff --git a/packages/newton/lib/src/friction_simulation.dart b/packages/newton/lib/src/friction_simulation.dart index 9ab0af12d9..d663e660e6 100644 --- a/packages/newton/lib/src/friction_simulation.dart +++ b/packages/newton/lib/src/friction_simulation.dart @@ -40,8 +40,10 @@ class FrictionSimulation extends Simulation { return math.pow(math.E, (startVelocity - endVelocity) / (startPosition - endPosition)); } + @override double x(double time) => _x + _v * math.pow(_drag, time) / _dragLog - _v / _dragLog; + @override double dx(double time) => _v * math.pow(_drag, time); @override @@ -60,10 +62,12 @@ class BoundedFrictionSimulation extends FrictionSimulation { final double _minX; final double _maxX; + @override double x(double time) { return super.x(time).clamp(_minX, _maxX); } + @override bool isDone(double time) { return super.isDone(time) || (x(time) - _minX).abs() < tolerance.distance || diff --git a/packages/newton/lib/src/gravity_simulation.dart b/packages/newton/lib/src/gravity_simulation.dart index 7a59a187b0..a53ad9341c 100644 --- a/packages/newton/lib/src/gravity_simulation.dart +++ b/packages/newton/lib/src/gravity_simulation.dart @@ -17,8 +17,10 @@ class GravitySimulation extends Simulation { _v = velocity, _end = endDistance; + @override double x(double time) => _x + _v * time + 0.5 * _a * time * time; + @override double dx(double time) => _v + time * _a; @override diff --git a/packages/newton/lib/src/scroll_simulation.dart b/packages/newton/lib/src/scroll_simulation.dart index d73ae88851..70efad2fd0 100644 --- a/packages/newton/lib/src/scroll_simulation.dart +++ b/packages/newton/lib/src/scroll_simulation.dart @@ -68,6 +68,7 @@ class ScrollSimulation extends SimulationGroup { return false; } + @override String toString() { return 'ScrollSimulation(leadingExtent: $_leadingExtent, trailingExtent: $_trailingExtent)'; } diff --git a/packages/newton/lib/src/simulation_group.dart b/packages/newton/lib/src/simulation_group.dart index fe36d739d9..83269be603 100644 --- a/packages/newton/lib/src/simulation_group.dart +++ b/packages/newton/lib/src/simulation_group.dart @@ -25,11 +25,13 @@ abstract class SimulationGroup extends Simulation { /// The result is whether the simulation was switched in this step. bool step(double time); + @override double x(double time) { _stepIfNecessary(time); return currentSimulation.x(time - currentIntervalOffset); } + @override double dx(double time) { _stepIfNecessary(time); return currentSimulation.dx(time - currentIntervalOffset); diff --git a/packages/newton/lib/src/spring_simulation.dart b/packages/newton/lib/src/spring_simulation.dart index 324a753b16..c205119ec9 100644 --- a/packages/newton/lib/src/spring_simulation.dart +++ b/packages/newton/lib/src/spring_simulation.dart @@ -47,15 +47,18 @@ class _CriticalSolution implements _SpringSolution { final double _r, _c1, _c2; + @override double x(double time) { return (_c1 + _c2 * time) * math.pow(math.E, _r * time); } + @override double dx(double time) { final double power = math.pow(math.E, _r * time); return _r * (_c1 + _c2 * time) * power + _c2 * power; } + @override SpringType get type => SpringType.criticallyDamped; } @@ -81,16 +84,19 @@ class _OverdampedSolution implements _SpringSolution { final double _r1, _r2, _c1, _c2; + @override double x(double time) { return _c1 * math.pow(math.E, _r1 * time) + _c2 * math.pow(math.E, _r2 * time); } + @override double dx(double time) { return _c1 * _r1 * math.pow(math.E, _r1 * time) + _c2 * _r2 * math.pow(math.E, _r2 * time); } + @override SpringType get type => SpringType.overDamped; } @@ -116,11 +122,13 @@ class _UnderdampedSolution implements _SpringSolution { final double _w, _r, _c1, _c2; + @override double x(double time) { return math.pow(math.E, _r * time) * (_c1 * math.cos(_w * time) + _c2 * math.sin(_w * time)); } + @override double dx(double time) { final double power = math.pow(math.E, _r * time); final double cosine = math.cos(_w * time); @@ -129,6 +137,7 @@ class _UnderdampedSolution implements _SpringSolution { _r * power * (_c2 * sine + _c1 * cosine); } + @override SpringType get type => SpringType.underDamped; } @@ -185,10 +194,13 @@ class SpringSimulation extends Simulation { SpringType get type => _solution.type; + @override double x(double time) => _endPosition + _solution.x(time); + @override double dx(double time) => _solution.dx(time); + @override bool isDone(double time) { return nearZero(_solution.x(time), tolerance.distance) && nearZero(_solution.dx(time), tolerance.velocity); @@ -205,5 +217,6 @@ class ScrollSpringSimulation extends SpringSimulation { double velocity ) : super(desc, start, end, velocity); + @override double x(double time) => isDone(time) ? _endPosition : super.x(time); } diff --git a/packages/newton/lib/src/tolerance.dart b/packages/newton/lib/src/tolerance.dart index 5b764d8924..5ff48c7351 100644 --- a/packages/newton/lib/src/tolerance.dart +++ b/packages/newton/lib/src/tolerance.dart @@ -10,6 +10,7 @@ class Tolerance { const Tolerance({this.distance: epsilonDefault, this.time: epsilonDefault, this.velocity: epsilonDefault}); + @override String toString() => 'Tolerance(distance: $distance, time=$time, velocity: $velocity)'; }