diff --git a/CHANGELOG.md b/CHANGELOG.md index 86ca15c..cfc7a26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +## 0.7.5 +- Support for hot reload when using HotSwapLoader (thanks @wrbl606) +- Update example project (thanks @wrbl606) +- Move JSON binding generation to a separate `tool/` directory (thanks + @wrbl606) +- Add OverlayEntry, Animation, AnimationController, Route, OverlayRoute, + TransitionRoute, PageRoute, MaterialPageRoute, Listenable, + ValueListenable, Ticker, TickerProvider, TickerFuture, and RouteSettings +- Support for most Navigator methods +- Fix for runtime error when using Align +- Deprecated `setupFlutterForCompile` / `setupFlutterForRuntime` in favor of + Compiler.addPlugin / Runtime.addPlugin() + ## 0.7.4 - Add Alignment, AspectRatio, Align, Radius, BorderRadiusGeometry, BorderRadius, Baseline, ClipRRect, ColoredBox, Directionality, diff --git a/README.md b/README.md index 0be5612..57aa56d 100644 --- a/README.md +++ b/README.md @@ -233,36 +233,36 @@ To allow access to a MethodChannel, add a `MethodChannelPermission` to the `perm ## Supported widgets and classes Currently supported widgets and classes include: -- `Widget`, `StatelessWidget`, `StatefulWidget`, `State`; -- `ChangeNotifier`, `Key`, `BuildContext`; -- `WidgetsApp`, `Container`, `Column`, `Row`, `Center`; -- `Alignment`, `Align`, `AspectRatio`, `Baseline`; -- `Radius`, `BorderRadius`, `BorderRadiusGeometry`, `Clip`, `ClipRRect`; -- `SizedBox`, `FittedBox`, `FractionallySizedBox`, `ColoredBox`; -- `Stack`, `Positioned`, `StackFit`; -- `Padding`, `EdgeInsetsGeometry`, `EdgeInsets`, `Axis`, `Size`; -- `Offset`, `Velocity`; -- `MainAxisAlignment`, `MainAxisSize`, `CrossAxisAlignment`; -- `AlignmentGeometry`, `Alignment`, `Constraints`, `BoxConstraints`; -- `Color`, `ColorSwatch`, `Colors`, `FontWeight`, `FontStyle`; -- `MaterialApp`, `MaterialColor`, `MaterialAccentColor`; -- `Theme`, `ThemeData`, `TextTheme`, `Directionality`; -- `Decoration`, `BoxDecoration`, `BoxBorder`, `Border`, `BorderSide`; -- `IconData`, `Icons`, `Icon`; -- `Curve`, `Curves`, `SawTooth`, `Interval`, `Threshold`, `Cubic`; -- `Text`, `TextStyle`, `TextEditingController`, `TextField`; -- `TextDirection`, `VerticalDirection`, `TextBaseline` -- `Scaffold`, `ScaffoldMessenger`, `AppBar`, `SnackBar`, `FloatingActionButton`; -- `InkWell`, `TextButton`, `ElevatedButton`, `IconButton`; -- `Card`, `Drawer`, `ListView`, `ListTile`, `Spacer`; -- `Image`, `ImageProvider`, `NetworkImage`, `MemoryImage`; -- `Navigator`, `NavigatorState`, `Builder`; -- `PointerDeviceKind`, `HitTestBehavior`; -- `GestureDetector`, `TapDownDetails`, `TapUpDetails`; -- `LongPressStartDetails`, `LongPressMoveUpdateDetails`, `LongPressEndDetails`; -- `DragStartDetails`, `DragUpdateDetails`, `DragEndDetails`, `DragDownDetails`; - -Note that many of these have only partial support. +- Widget, StatelessWidget, StatefulWidget, State; +- ChangeNotifier, Key, BuildContext; +- WidgetsApp, Container, Column, Row, Center; +- Alignment, Align, AspectRatio, Baseline; +- Radius, BorderRadius, BorderRadiusGeometry, Clip, ClipRRect; +- SizedBox, FittedBox, FractionallySizedBox, ColoredBox; +- Stack, Positioned, StackFit; +- Padding, EdgeInsetsGeometry, EdgeInsets, Axis, Size; +- Offset, Velocity; +- MainAxisAlignment, MainAxisSize, CrossAxisAlignment; +- AlignmentGeometry, Alignment, Constraints, BoxConstraints; +- Color, ColorSwatch, Colors, FontWeight, FontStyle; +- MaterialApp, MaterialColor, MaterialAccentColor; +- Theme, ThemeData, TextTheme, Directionality; +- Decoration, BoxDecoration, BoxBorder, Border, BorderSide; +- IconData, Icons, Icon; +- Curve, Curves, SawTooth, Interval, Threshold, Cubic; +- Text, TextStyle, TextEditingController, TextField; +- TextDirection, VerticalDirection, TextBaseline +- Scaffold, ScaffoldMessenger, AppBar, SnackBar, FloatingActionButton; +- InkWell, TextButton, ElevatedButton, IconButton; +- Card, Drawer, ListView, ListTile, Spacer; +- Image, ImageProvider, NetworkImage, MemoryImage; +- Navigator, NavigatorState, Builder; +- PointerDeviceKind, HitTestBehavior; +- GestureDetector, TapDownDetails, TapUpDetails; +- LongPressStartDetails, LongPressMoveUpdateDetails, LongPressEndDetails; +- DragStartDetails, DragUpdateDetails, DragEndDetails, DragDownDetails; + +Note that some of these have only partial support. ## App size measurements diff --git a/lib/flutter_eval.dart b/lib/flutter_eval.dart index 737fae7..17689b5 100644 --- a/lib/flutter_eval.dart +++ b/lib/flutter_eval.dart @@ -1,3 +1,5 @@ +/// Provides a bridge between the Flutter framework and the dart_eval library, +/// as well as helper classes to enable code-push and server-driven UI. library flutter_eval; export 'src/flutter_eval.dart'; @@ -5,6 +7,8 @@ export 'src/flutter_eval.dart'; import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter_eval/src/animation.dart'; +import 'package:flutter_eval/src/animation/animation.dart'; +import 'package:flutter_eval/src/animation/animation_controller.dart'; import 'package:flutter_eval/src/animation/curves.dart'; import 'package:flutter_eval/src/foundation.dart'; import 'package:flutter_eval/src/foundation/change_notifier.dart'; @@ -26,6 +30,7 @@ import 'package:flutter_eval/src/material/icon_button.dart'; import 'package:flutter_eval/src/material/icons.dart'; import 'package:flutter_eval/src/material/ink_well.dart'; import 'package:flutter_eval/src/material/list_tile.dart'; +import 'package:flutter_eval/src/material/page.dart'; import 'package:flutter_eval/src/material/scaffold.dart'; import 'package:flutter_eval/src/material/snack_bar.dart'; import 'package:flutter_eval/src/material/text_button.dart'; @@ -52,6 +57,8 @@ import 'package:flutter_eval/src/rendering/flex.dart'; import 'package:flutter_eval/src/rendering/object.dart'; import 'package:flutter_eval/src/rendering/proxy_box.dart'; import 'package:flutter_eval/src/rendering/stack.dart'; +import 'package:flutter_eval/src/scheduler.dart'; +import 'package:flutter_eval/src/scheduler/ticker.dart'; import 'package:flutter_eval/src/services.dart'; import 'package:flutter_eval/src/services/binary_messenger.dart'; import 'package:flutter_eval/src/services/message_codec.dart'; @@ -73,6 +80,9 @@ import 'package:flutter_eval/src/widgets/icon.dart'; import 'package:flutter_eval/src/widgets/icon_data.dart'; import 'package:flutter_eval/src/widgets/image.dart'; import 'package:flutter_eval/src/widgets/navigator.dart'; +import 'package:flutter_eval/src/widgets/overlay.dart'; +import 'package:flutter_eval/src/widgets/pages.dart'; +import 'package:flutter_eval/src/widgets/routes.dart'; import 'package:flutter_eval/src/widgets/scroll_controller.dart'; import 'package:flutter_eval/src/widgets/scroll_view.dart'; import 'package:flutter_eval/src/widgets/spacer.dart'; @@ -82,12 +92,14 @@ import 'package:flutter_eval/src/widgets/text.dart'; const flutterEvalPlugin = FlutterEvalPlugin(); /// Setup flutter_eval classes for use in a dart_eval [Compiler]. +@Deprecated("Use compiler.addPlugin(flutterEvalPlugin) instead.") void setupFlutterForCompile(EvalPluginRegistry registry) { registry.addPlugin(flutterEvalPlugin); } /// Setup Flutter classes for use in a dart_eval [Runtime]. After /// calling this function, you must call `runtime.setup()`. +@Deprecated("Use runtime.addPlugin(flutterEvalPlugin) instead.") void setupFlutterForRuntime(Runtime runtime) { runtime.addPlugin(flutterEvalPlugin); } @@ -104,6 +116,11 @@ class FlutterEvalPlugin implements EvalPlugin { $Widget.$declaration, $StatelessWidget$bridge.$declaration, $StatefulWidget$bridge.$declaration, + $Listenable.$declaration, + $ValueListenable.$declaration, + $Ticker.$declaration, + $TickerProvider.$declaration, + $TickerFuture.$declaration, $ChangeNotifier$bridge.$declaration, $State$bridge.$declaration, $BuildContext.$declaration, @@ -206,7 +223,16 @@ class FlutterEvalPlugin implements EvalPlugin { $FractionallySizedBox.$declaration, $Stack.$declaration, $Positioned.$declaration, - $SizedBox.$declaration + $SizedBox.$declaration, + $OverlayEntry.$declaration, + $Animation.$declaration, + $AnimationController.$declaration, + $Route.$declaration, + $OverlayRoute.$declaration, + $TransitionRoute.$declaration, + $PageRoute$bridge.$declaration, + $MaterialPageRoute.$declaration, + $RouteSettings.$declaration, ]; for (final cls in classes) { @@ -229,11 +255,15 @@ class FlutterEvalPlugin implements EvalPlugin { registry.defineBridgeEnum($HitTestBehavior.$declaration); registry.defineBridgeEnum($Clip.$declaration); registry.defineBridgeEnum($StackFit.$declaration); + registry.defineBridgeEnum($AnimationStatus.$declaration); registry.addSource(DartSource('dart:ui', dartUiSource)); registry.addSource( DartSource('package:flutter/animation.dart', animationSource)); + registry.addSource(DartSource( + 'package:flutter/src/animation/animation_controller.dart', + animationControllerSource)); registry.addSource(DartSource( 'package:flutter/src/animation/curves.dart', animationCurvesSource)); @@ -262,6 +292,9 @@ class FlutterEvalPlugin implements EvalPlugin { registry.addSource( DartSource('package:flutter/rendering.dart', renderingSource)); + registry.addSource( + DartSource('package:flutter/scheduler.dart', schedulerSource)); + registry .addSource(DartSource('package:flutter/services.dart', servicesSource)); @@ -347,6 +380,10 @@ class FlutterEvalPlugin implements EvalPlugin { 'EdgeInsets.symmetric', $EdgeInsets.$symmetric) ..registerBridgeFunc('package:flutter/src/painting/text_style.dart', 'TextStyle.', $TextStyle.$new) + ..registerBridgeFunc( + 'package:flutter/src/animation/animation_controller.dart', + 'AnimationController.', + $AnimationController.$new) ..registerBridgeFunc( 'package:flutter/src/animation/curves.dart', '_Linear._', $_Linear.$_) ..registerBridgeFunc('package:flutter/src/animation/curves.dart', @@ -373,10 +410,12 @@ class FlutterEvalPlugin implements EvalPlugin { 'BoxConstraints.tightForFinite', $BoxConstraints.$tightForFinite) ..registerBridgeFunc('package:flutter/src/rendering/box.dart', 'BoxConstraints.expand', $BoxConstraints.$expand) + ..registerBridgeFunc( + 'package:flutter/src/scheduler/ticker.dart', 'Ticker.', $Ticker.$new) ..registerBridgeFunc('package:flutter/src/widgets/app.dart', 'WidgetsApp.', $WidgetsApp.$new) - ..registerBridgeFunc('package:flutter/src/widgets/basic.dart', - 'Alignment.', $Alignment.$new) + ..registerBridgeFunc( + 'package:flutter/src/widgets/basic.dart', 'Align.', $Align.$new) ..registerBridgeFunc('package:flutter/src/widgets/basic.dart', 'AspectRatio.', $AspectRatio.$new) ..registerBridgeFunc( @@ -433,12 +472,32 @@ class FlutterEvalPlugin implements EvalPlugin { 'MaterialApp.', $MaterialApp.$new) ..registerBridgeFunc( 'package:flutter/src/material/app_bar.dart', 'AppBar.', $AppBar.$new) + ..registerBridgeFunc( + 'package:flutter/src/material/card.dart', 'Card.', $Card.$new) + ..registerBridgeFunc( + 'package:flutter/src/material/drawer.dart', 'Drawer.', $Drawer.$new) ..registerBridgeFunc('package:flutter/src/material/colors.dart', 'MaterialColor.', $MaterialColor.$new) ..registerBridgeFunc('package:flutter/src/material/colors.dart', 'MaterialAccentColor.', $MaterialAccentColor.$new) ..registerBridgeFunc('package:flutter/src/material/elevated_button.dart', 'ElevatedButton.', $ElevatedButton.$new) + ..registerBridgeFunc( + 'package:flutter/src/material/floating_action_button.dart', + 'FloatingActionButton.', + $FloatingActionButton.$new) + ..registerBridgeFunc('package:flutter/src/material/icon_button.dart', + 'IconButton.', $IconButton.$new) + ..registerBridgeFunc( + 'package:flutter/src/widgets/image.dart', 'Image.', $Image.$new) + ..registerBridgeFunc('package:flutter/src/widgets/image.dart', + 'Image.network', $Image.$network) + ..registerBridgeFunc('package:flutter/src/widgets/image.dart', + 'Image.asset', $Image.$asset) + ..registerBridgeFunc('package:flutter/src/material/list_tile.dart', + 'ListTile.', $ListTile.$new) + ..registerBridgeFunc('package:flutter/src/material/page.dart', + 'MaterialPageRoute.', $MaterialPageRoute.$new) ..registerBridgeFunc('package:flutter/src/material/scaffold.dart', 'Scaffold.', $Scaffold.$new) ..registerBridgeFunc('package:flutter/src/material/scaffold.dart', @@ -447,8 +506,6 @@ class FlutterEvalPlugin implements EvalPlugin { 'ScaffoldMessenger.of', $ScaffoldMessenger.$of) ..registerBridgeFunc('package:flutter/src/material/snack_bar.dart', 'SnackBar.', $SnackBar.$new) - ..registerBridgeFunc('package:flutter/src/material/icon_button.dart', - 'IconButton.', $IconButton.$new) ..registerBridgeFunc('package:flutter/src/material/text_button.dart', 'TextButton.', $TextButton.$new) ..registerBridgeFunc('package:flutter/src/material/text_field.dart', @@ -457,26 +514,10 @@ class FlutterEvalPlugin implements EvalPlugin { 'TextTheme.', $TextTheme.$new) ..registerBridgeFunc('package:flutter/src/material/theme_data.dart', 'ThemeData.', $ThemeData.$new) - ..registerBridgeFunc('package:flutter/src/material/list_tile.dart', - 'ListTile.', $ListTile.$new) - ..registerBridgeFunc( - 'package:flutter/src/material/drawer.dart', 'Drawer.', $Drawer.$new) - ..registerBridgeFunc( - 'package:flutter/src/material/card.dart', 'Card.', $Card.$new) - ..registerBridgeFunc( - 'package:flutter/src/widgets/image.dart', 'Image.', $Image.$new) - ..registerBridgeFunc('package:flutter/src/widgets/image.dart', - 'Image.network', $Image.$network) - ..registerBridgeFunc('package:flutter/src/widgets/image.dart', - 'Image.asset', $Image.$asset) ..registerBridgeFunc( 'package:flutter/src/material/theme.dart', 'Theme.of', $Theme.$of) ..registerBridgeFunc( 'package:flutter/src/material/theme.dart', 'Theme.', $Theme.$new) - ..registerBridgeFunc( - 'package:flutter/src/material/floating_action_button.dart', - 'FloatingActionButton.', - $FloatingActionButton.$new) ..registerBridgeFunc('package:flutter/src/widgets/navigator.dart', 'Navigator.', $Navigator.$new) ..registerBridgeFunc('package:flutter/src/widgets/navigator.dart', diff --git a/lib/src/animation.dart b/lib/src/animation.dart index 34a4057..a157cd8 100644 --- a/lib/src/animation.dart +++ b/lib/src/animation.dart @@ -1,5 +1,7 @@ const animationSource = ''' library animation; +export 'src/animation/animation.dart'; +export 'src/animation/animation_controller.dart'; export 'src/animation/curves.dart'; '''; diff --git a/lib/src/animation/animation.dart b/lib/src/animation/animation.dart new file mode 100644 index 0000000..9f3bb87 --- /dev/null +++ b/lib/src/animation/animation.dart @@ -0,0 +1,124 @@ +import 'package:dart_eval/dart_eval_bridge.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_eval/src/foundation/change_notifier.dart'; + +/// dart_eval wrapper for [AnimationStatus] +class $AnimationStatus implements $Instance { + /// dart_eval type definition for [AnimationStatus] + static const $type = BridgeTypeRef(BridgeTypeSpec( + 'package:flutter/src/animation/animation.dart', 'AnimationStatus')); + + /// dart_eval class declaration for [AnimationStatus] + static const $declaration = BridgeEnumDef($type, + values: ['dismissed', 'forward', 'reverse', 'completed'], fields: {}); + + /// Runtime enum values + static final $values = { + 'dismissed': $AnimationStatus.wrap(AnimationStatus.dismissed), + 'forward': $AnimationStatus.wrap(AnimationStatus.forward), + 'reverse': $AnimationStatus.wrap(AnimationStatus.reverse), + 'completed': $AnimationStatus.wrap(AnimationStatus.completed), + }; + + $AnimationStatus.wrap(this.$value); + + @override + final AnimationStatus $value; + + @override + get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + throw UnimplementedError(); + } + + @override + int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + throw UnimplementedError(); + } +} + +/// dart_eval wrapper for [Animation] +class $Animation implements $Instance { + static const $spec = BridgeTypeSpec( + 'package:flutter/src/animation/animation.dart', 'Animation'); + static const $type = BridgeTypeRef($spec); + + static const $methods = { + 'addStatusListener': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)), + params: [ + BridgeParameter('listener', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), false), + ])), + 'removeStatusListener': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)), + params: [ + BridgeParameter('listener', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), false), + ])), + }; + + static const $declaration = BridgeClassDef( + BridgeClassType($type, + isAbstract: true, + generics: {'T': BridgeGenericParam()}, + $implements: [ + BridgeTypeRef( + BridgeTypeSpec( + 'package:flutter/src/foundation/change_notifier.dart', + 'ValueListenable'), + [BridgeTypeRef.ref('T')]) + ], + $extends: $Listenable.$type), + constructors: {}, + methods: $methods, + wrap: true); + + late final $Instance _superclass = $ValueListenable.wrap($value); + + $Animation.wrap(this.$value); + + @override + final Animation $value; + + final _$statusListenerCache = + {}; + + @override + Animation get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + switch (identifier) { + case 'addStatusListener': + return $Function((runtime, target, args) { + final listener = args[0] as EvalCallable; + void fn(AnimationStatus status) => + listener.call(runtime, null, [$AnimationStatus.wrap(status)]); + _$statusListenerCache[listener] = fn; + (target!.$value as Animation).addStatusListener(fn); + return null; + }); + case 'removeStatusListener': + return $Function((runtime, target, args) { + (target!.$value as Animation).removeStatusListener( + _$statusListenerCache[args[0] as EvalCallable]!); + return null; + }); + } + return _superclass.$getProperty(runtime, identifier); + } + + @override + int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + return _superclass.$setProperty(runtime, identifier, value); + } +} diff --git a/lib/src/animation/animation_controller.dart b/lib/src/animation/animation_controller.dart new file mode 100644 index 0000000..ad6a6d1 --- /dev/null +++ b/lib/src/animation/animation_controller.dart @@ -0,0 +1,222 @@ +import 'package:dart_eval/dart_eval_bridge.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_eval/animation.dart'; +import 'package:flutter_eval/src/animation/animation.dart'; +import 'package:flutter_eval/src/scheduler/ticker.dart'; + +const animationControllerSource = ''' +//export 'package:flutter/physics.dart' show Simulation, SpringDescription; +export 'package:flutter/scheduler.dart' show TickerFuture, TickerProvider; + +export 'animation.dart' show Animation, AnimationStatus; +export 'curves.dart' show Curve; +'''; + +/// dart_eval wrapper for [AnimationController] +class $AnimationController implements $Instance { + /// Compile-time type reference for [AnimationController] + static const $type = BridgeTypeRef(BridgeTypeSpec( + 'package:flutter/src/animation/animation.dart', 'AnimationController')); + + static const _$methods = { + 'forward': BridgeMethodDef(BridgeFunctionDef(namedParams: [ + BridgeParameter( + 'from', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.double), nullable: true), + true), + ], returns: BridgeTypeAnnotation($TickerFuture.$type))), + 'reverse': BridgeMethodDef(BridgeFunctionDef(namedParams: [ + BridgeParameter( + 'from', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.double), nullable: true), + true), + ], returns: BridgeTypeAnnotation($TickerFuture.$type))), + 'animateTo': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($TickerFuture.$type), + params: [ + BridgeParameter('target', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.double)), false), + ], + namedParams: [ + BridgeParameter( + 'duration', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.duration), + nullable: true), + true), + BridgeParameter('curve', BridgeTypeAnnotation($Curve.$type), true), + ])), + 'animateBack': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($TickerFuture.$type), + params: [ + BridgeParameter('target', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.double)), false), + ], + namedParams: [ + BridgeParameter( + 'duration', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.duration), + nullable: true), + true), + BridgeParameter('curve', BridgeTypeAnnotation($Curve.$type), true), + ])), + 'repeat': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($TickerFuture.$type), + params: [ + BridgeParameter( + 'min', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.double), + nullable: true), + true), + BridgeParameter( + 'max', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.double), + nullable: true), + true), + BridgeParameter('reverse', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)), true), + BridgeParameter( + 'period', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.duration), + nullable: true), + true), + ])), + }; + + /// Compile-time class declaration of [$AnimationController] + static const $declaration = + BridgeClassDef(BridgeClassType($type, $extends: $Animation.$type), + constructors: { + '': BridgeConstructorDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($type), + namedParams: [ + BridgeParameter( + 'value', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.double), + nullable: true), + true), + BridgeParameter( + 'duration', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.duration), + nullable: true), + true), + BridgeParameter( + 'reverseDuration', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.duration), + nullable: true), + true), + BridgeParameter( + 'debugLabel', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string), + nullable: true), + true), + BridgeParameter( + 'lowerBound', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.double)), + true), + BridgeParameter( + 'upperBound', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.double)), + true), + BridgeParameter('vsync', + BridgeTypeAnnotation($TickerProvider.$type), false), + ], + )) + }, + methods: _$methods, + wrap: true); + + late final $Instance _superclass = $Animation.wrap($value); + + /// Wrap a [AnimationController] in a [$AnimationController] + $AnimationController.wrap(this.$value); + + /// Create a new instance of [$AnimationController] from [args] + static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { + return $AnimationController.wrap(AnimationController( + value: args[0]?.$value, + duration: args[1]?.$value, + reverseDuration: args[2]?.$value, + debugLabel: args[3]?.$value, + lowerBound: args[4]?.$value, + upperBound: args[5]?.$value, + vsync: args[6]?.$value, + )); + } + + @override + final AnimationController $value; + + @override + AnimationController get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + switch (identifier) { + case 'forward': + return __forward; + case 'reverse': + return __reverse; + case 'animateTo': + return __animateTo; + case 'animateBack': + return __animateBack; + case 'repeat': + return __repeat; + default: + return _superclass.$getProperty(runtime, identifier); + } + } + + static const $Function __forward = $Function(_forward); + static $Value? _forward(Runtime runtime, $Value? target, List<$Value?> args) { + return $TickerFuture.wrap((target!.$value as AnimationController).forward( + from: args[0]?.$value, + )); + } + + static const $Function __reverse = $Function(_reverse); + static $Value? _reverse(Runtime runtime, $Value? target, List<$Value?> args) { + return $TickerFuture.wrap((target!.$value as AnimationController).reverse( + from: args[0]?.$value, + )); + } + + static const $Function __animateTo = $Function(_animateTo); + static $Value? _animateTo( + Runtime runtime, $Value? target, List<$Value?> args) { + return $TickerFuture.wrap((target!.$value as AnimationController).animateTo( + args[0]!.$value, + duration: args[1]?.$value, + curve: args[2]?.$value, + )); + } + + static const $Function __animateBack = $Function(_animateBack); + static $Value? _animateBack( + Runtime runtime, $Value? target, List<$Value?> args) { + return $TickerFuture + .wrap((target!.$value as AnimationController).animateBack( + args[0]!.$value, + duration: args[1]?.$value, + curve: args[2]?.$value, + )); + } + + static const $Function __repeat = $Function(_repeat); + static $Value? _repeat(Runtime runtime, $Value? target, List<$Value?> args) { + return $TickerFuture.wrap((target!.$value as AnimationController).repeat( + min: args[0]?.$value, + max: args[1]?.$value, + reverse: args[2]?.$value, + period: args[3]?.$value, + )); + } + + @override + int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + return _superclass.$setProperty(runtime, identifier, value); + } +} diff --git a/lib/src/animation/curves.dart b/lib/src/animation/curves.dart index 458115e..452a8ab 100644 --- a/lib/src/animation/curves.dart +++ b/lib/src/animation/curves.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/animation.dart'; diff --git a/lib/src/flutter_eval.dart b/lib/src/flutter_eval.dart index e0d9902..9352a31 100644 --- a/lib/src/flutter_eval.dart +++ b/lib/src/flutter_eval.dart @@ -129,7 +129,7 @@ class _CompilerWidgetState extends State { for (final permission in widget.permissions) { runtime.grant(permission); } - setupFlutterForRuntime(runtime); + runtime.addPlugin(flutterEvalPlugin); } if (!inBuild) { @@ -301,7 +301,7 @@ class _RuntimeWidgetState extends State { for (final permission in widget.permissions) { runtime!.grant(permission); } - setupFlutterForRuntime(runtime!); + runtime!.addPlugin(flutterEvalPlugin); setupError = null; } catch (e, stackTrace) { if (!_setError(e, stackTrace, false)) { @@ -467,7 +467,7 @@ class _EvalWidgetState extends State { void setupRuntime() { runtime = Runtime.ofProgram(program); - setupFlutterForRuntime(runtime!); + runtime!.addPlugin(flutterEvalPlugin); } if (!inBuild) { @@ -513,7 +513,7 @@ class _EvalWidgetState extends State { for (final permission in widget.permissions) { runtime!.grant(permission); } - setupFlutterForRuntime(runtime!); + runtime!.addPlugin(flutterEvalPlugin); setupError = null; } catch (e, stackTrace) { if (!_setError(e, stackTrace, false)) { @@ -777,7 +777,7 @@ Multiple HotSwapLoaders in the widget tree are not supported. for (final permission in widget.permissions) { runtime!.grant(permission); } - setupFlutterForRuntime(runtime!); + runtime!.addPlugin(flutterEvalPlugin); runtime!.loadGlobalOverrides(); } catch (e, stackTrace) { if (!_setError(e, stackTrace, false)) { diff --git a/lib/src/foundation/change_notifier.dart b/lib/src/foundation/change_notifier.dart index b4d1f59..1902cf2 100644 --- a/lib/src/foundation/change_notifier.dart +++ b/lib/src/foundation/change_notifier.dart @@ -1,11 +1,11 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/foundation.dart'; -class $ChangeNotifier implements $Instance { +/// dart_eval wrapper for [Listenable] +class $Listenable implements $Instance { static const $type = BridgeTypeRef(BridgeTypeSpec( - 'package:flutter/src/foundation/change_notifier.dart', 'ChangeNotifier')); + 'package:flutter/src/foundation/change_notifier.dart', 'Listenable')); static const $methods = { 'addListener': BridgeMethodDef(BridgeFunctionDef( @@ -14,10 +14,6 @@ class $ChangeNotifier implements $Instance { BridgeParameter('listener', BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), false), ])), - 'dispose': BridgeMethodDef(BridgeFunctionDef( - returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), - 'notifyListeners': BridgeMethodDef(BridgeFunctionDef( - returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), 'removeListener': BridgeMethodDef(BridgeFunctionDef( returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)), params: [ @@ -26,30 +22,23 @@ class $ChangeNotifier implements $Instance { ])), }; - static const $declaration = - BridgeClassDef(BridgeClassType($type, isAbstract: false), - constructors: { - '': BridgeConstructorDef( - BridgeFunctionDef(returns: BridgeTypeAnnotation($type))) - }, - methods: $methods, - wrap: true); + static const $declaration = BridgeClassDef( + BridgeClassType($type, isAbstract: true), + constructors: {}, + methods: $methods, + wrap: true); late final $Instance _superclass = $Object(this); - $ChangeNotifier.wrap(this.$value); - - static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { - return $ChangeNotifier.wrap(ChangeNotifier()); - } + $Listenable.wrap(this.$value); @override - final ChangeNotifier $value; + final Listenable $value; final _$listenerCache = {}; @override - ChangeNotifier get $reified => $value; + Listenable get $reified => $value; @override $Value? $getProperty(Runtime runtime, String identifier) { @@ -59,9 +48,105 @@ class $ChangeNotifier implements $Instance { final listener = args[0] as EvalCallable; void fn() => listener.call(runtime, null, []); _$listenerCache[listener] = fn; - (target!.$value as ChangeNotifier).addListener(fn); + (target!.$value as Listenable).addListener(fn); + return null; + }); + case 'removeListener': + return $Function((runtime, target, args) { + (target!.$value as Listenable) + .removeListener(_$listenerCache[args[0] as EvalCallable]!); return null; }); + } + return _superclass.$getProperty(runtime, identifier); + } + + @override + int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + return _superclass.$setProperty(runtime, identifier, value); + } +} + +/// dart_eval wrapper for [ValueListenable] +class $ValueListenable implements $Instance { + static const $spec = BridgeTypeSpec( + 'package:flutter/src/foundation/change_notifier.dart', 'ValueListenable'); + static const $type = BridgeTypeRef($spec); + + static const $methods = { + 'value': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef.ref('T')))), + }; + + static const $declaration = BridgeClassDef( + BridgeClassType($type, + isAbstract: true, + generics: {'T': BridgeGenericParam()}, + $extends: $Listenable.$type), + constructors: {}, + methods: $methods, + wrap: true); + + late final $Instance _superclass = $Listenable.wrap($value); + + $ValueListenable.wrap(this.$value); + + @override + final ValueListenable $value; + + @override + ValueListenable get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + switch (identifier) { + case 'value': + return runtime.wrap($value.value); + } + return _superclass.$getProperty(runtime, identifier); + } + + @override + int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + return _superclass.$setProperty(runtime, identifier, value); + } +} + +/// dart_eval wrapper for [ChangeNotifier] +class $ChangeNotifier implements $Instance { + static const $type = BridgeTypeRef(BridgeTypeSpec( + 'package:flutter/src/foundation/change_notifier.dart', 'ChangeNotifier')); + + static const $methods = { + 'dispose': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), + 'notifyListeners': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), + }; + + late final $Instance _superclass = $Listenable.wrap($value); + + $ChangeNotifier.wrap(this.$value); + + static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { + return $ChangeNotifier.wrap(ChangeNotifier()); + } + + @override + final ChangeNotifier $value; + + @override + ChangeNotifier get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + switch (identifier) { case 'dispose': return $Function((runtime, target, args) { (target!.$value as ChangeNotifier).dispose(); @@ -73,12 +158,6 @@ class $ChangeNotifier implements $Instance { (target!.$value as ChangeNotifier).notifyListeners(); return null; }); - case 'removeListener': - return $Function((runtime, target, args) { - (target!.$value as ChangeNotifier) - .removeListener(_$listenerCache[args[0] as EvalCallable]!); - return null; - }); } return _superclass.$getProperty(runtime, identifier); } @@ -94,14 +173,15 @@ class $ChangeNotifier implements $Instance { class $ChangeNotifier$bridge extends ChangeNotifier with $Bridge { - static const $declaration = - BridgeClassDef(BridgeClassType($ChangeNotifier.$type, isAbstract: false), - constructors: { - '': BridgeConstructorDef(BridgeFunctionDef( - returns: BridgeTypeAnnotation($ChangeNotifier.$type))) - }, - methods: $ChangeNotifier.$methods, - bridge: true); + static const $declaration = BridgeClassDef( + BridgeClassType($ChangeNotifier.$type, + isAbstract: false, $extends: $Listenable.$type), + constructors: { + '': BridgeConstructorDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($ChangeNotifier.$type))) + }, + methods: $ChangeNotifier.$methods, + bridge: true); static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { // ignore: prefer_const_constructors @@ -139,12 +219,12 @@ class $ChangeNotifier$bridge extends ChangeNotifier }); } - throw UnimplementedError('Property does not exist: $identifier'); + throw UnimplementedError(); } @override void $bridgeSet(String identifier, $Value value) { - throw UnimplementedError('Property cannot be set: $identifier'); + throw UnimplementedError(); } @override diff --git a/lib/src/foundation/diagnostics.dart b/lib/src/foundation/diagnostics.dart index b691d38..82d3b58 100644 --- a/lib/src/foundation/diagnostics.dart +++ b/lib/src/foundation/diagnostics.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/foundation.dart'; diff --git a/lib/src/foundation/key.dart b/lib/src/foundation/key.dart index 4eff094..68f31c7 100644 --- a/lib/src/foundation/key.dart +++ b/lib/src/foundation/key.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/widgets.dart'; diff --git a/lib/src/gestures/drag_details.dart b/lib/src/gestures/drag_details.dart index f03b2bc..15057d4 100644 --- a/lib/src/gestures/drag_details.dart +++ b/lib/src/gestures/drag_details.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/gestures/long_press.dart b/lib/src/gestures/long_press.dart index ba105e6..784125d 100644 --- a/lib/src/gestures/long_press.dart +++ b/lib/src/gestures/long_press.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/gestures.dart'; diff --git a/lib/src/gestures/tap.dart b/lib/src/gestures/tap.dart index c4494d1..33c30b2 100644 --- a/lib/src/gestures/tap.dart +++ b/lib/src/gestures/tap.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/gestures/velocity_tracker.dart b/lib/src/gestures/velocity_tracker.dart index a9e1e72..3a99334 100644 --- a/lib/src/gestures/velocity_tracker.dart +++ b/lib/src/gestures/velocity_tracker.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/gestures.dart'; diff --git a/lib/src/material.dart b/lib/src/material.dart index 02dac3b..e79f59e 100644 --- a/lib/src/material.dart +++ b/lib/src/material.dart @@ -12,6 +12,7 @@ export 'src/material/floating_action_button.dart'; export 'src/material/icons.dart'; export 'src/material/icon_button.dart'; export 'src/material/list_tile.dart'; +export 'src/material/page.dart'; export 'src/material/scaffold.dart'; export 'src/material/snack_bar.dart'; export 'src/material/text_button.dart'; diff --git a/lib/src/material/app.dart b/lib/src/material/app.dart index 8b32ee2..090c996 100644 --- a/lib/src/material/app.dart +++ b/lib/src/material/app.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/material.dart'; @@ -8,7 +7,7 @@ import 'package:flutter_eval/src/sky_engine/ui/painting.dart'; import 'package:flutter_eval/src/widgets/app.dart'; import 'package:flutter_eval/src/widgets/framework.dart'; -/// dart_eval bridge wrapper for [MaterialApp] +/// dart_eval wrapper for [MaterialApp] class $MaterialApp implements $Instance { /// Bridge type reference for [$MaterialApp] static const $type = BridgeTypeRef( diff --git a/lib/src/material/app_bar.dart b/lib/src/material/app_bar.dart index 20cf29f..e69096e 100644 --- a/lib/src/material/app_bar.dart +++ b/lib/src/material/app_bar.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; import 'package:flutter_eval/src/sky_engine/ui/painting.dart'; @@ -6,7 +5,7 @@ import 'package:flutter_eval/src/widgets/text.dart'; import '../widgets/framework.dart'; -/// dart_eval bridge wrapper for [AppBar] +/// dart_eval wrapper for [AppBar] class $AppBar implements $Instance { /// Bridge type reference for [$AppBar] static const $type = BridgeTypeRef( diff --git a/lib/src/material/card.dart b/lib/src/material/card.dart index fba2706..f236a6a 100644 --- a/lib/src/material/card.dart +++ b/lib/src/material/card.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; import 'package:flutter_eval/src/foundation/key.dart'; @@ -6,7 +5,7 @@ import 'package:flutter_eval/src/painting/edge_insets.dart'; import 'package:flutter_eval/src/sky_engine/ui/painting.dart'; import 'package:flutter_eval/src/widgets/framework.dart'; -/// dart_eval bridge wrapper for [Card] +/// dart_eval wrapper for [Card] class $Card implements $Instance { /// Compile-type type reference for [Card] static const $type = BridgeTypeRef( diff --git a/lib/src/material/colors.dart b/lib/src/material/colors.dart index c4b4d65..1c2b727 100644 --- a/lib/src/material/colors.dart +++ b/lib/src/material/colors.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; import 'package:flutter_eval/src/painting/colors.dart'; diff --git a/lib/src/material/drawer.dart b/lib/src/material/drawer.dart index 944e0b9..6bc328f 100644 --- a/lib/src/material/drawer.dart +++ b/lib/src/material/drawer.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; import 'package:flutter_eval/src/foundation/key.dart'; diff --git a/lib/src/material/elevated_button.dart b/lib/src/material/elevated_button.dart index 8fde6fa..b277d2d 100644 --- a/lib/src/material/elevated_button.dart +++ b/lib/src/material/elevated_button.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; import 'package:flutter_eval/src/widgets/framework.dart'; diff --git a/lib/src/material/floating_action_button.dart b/lib/src/material/floating_action_button.dart index 5226dc2..4339a32 100644 --- a/lib/src/material/floating_action_button.dart +++ b/lib/src/material/floating_action_button.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; import 'package:flutter_eval/src/sky_engine/ui/painting.dart'; diff --git a/lib/src/material/icon_button.dart b/lib/src/material/icon_button.dart index 2e8f0be..b466763 100644 --- a/lib/src/material/icon_button.dart +++ b/lib/src/material/icon_button.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/material/ink_well.dart b/lib/src/material/ink_well.dart index 4b78400..d40de9a 100644 --- a/lib/src/material/ink_well.dart +++ b/lib/src/material/ink_well.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; import 'package:flutter_eval/src/foundation/key.dart'; diff --git a/lib/src/material/list_tile.dart b/lib/src/material/list_tile.dart index 933e199..c7227e0 100644 --- a/lib/src/material/list_tile.dart +++ b/lib/src/material/list_tile.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; import 'package:flutter_eval/src/foundation/key.dart'; diff --git a/lib/src/material/page.dart b/lib/src/material/page.dart new file mode 100644 index 0000000..2cf4841 --- /dev/null +++ b/lib/src/material/page.dart @@ -0,0 +1,84 @@ +import 'package:dart_eval/dart_eval_bridge.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_eval/src/widgets/framework.dart'; +import 'package:flutter_eval/src/widgets/overlay.dart'; +import 'package:flutter_eval/src/widgets/pages.dart'; + +/// dart_eval wrapper for [MaterialPageRoute] +class $MaterialPageRoute implements $Instance { + /// Compile-type type reference for [MaterialPageRoute] + static const $type = BridgeTypeRef(BridgeTypeSpec( + 'package:flutter/src/material/page.dart', 'MaterialPageRoute')); + + /// Compile-type class declaration for [MaterialPageRoute] + static const $declaration = BridgeClassDef( + BridgeClassType($type, + isAbstract: true, + generics: {'T': BridgeGenericParam()}, + $extends: + BridgeTypeRef($PageRoute$bridge.$spec, [BridgeTypeRef.ref('T')])), + constructors: { + '': BridgeConstructorDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($type), + namedParams: [ + BridgeParameter( + 'builder', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), + false), + BridgeParameter( + 'settings', + BridgeTypeAnnotation($RouteSettings.$type, nullable: true), + true), + BridgeParameter('maintainState', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)), true), + BridgeParameter('fullscreenDialog', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)), true), + BridgeParameter('allowSnapshotting', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)), true), + BridgeParameter('barrierDismissible', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)), true), + ])), + }, + getters: { + 'maintainState': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)))), + }, + methods: {}, + wrap: true); + + late final $Instance _superclass = $PageRoute.wrap($value); + + static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { + return $MaterialPageRoute.wrap(MaterialPageRoute( + builder: (context) => (args[0] as EvalCallable) + .call(runtime, null, [$BuildContext.wrap(context)])!.$value, + settings: args[1]?.$value, + maintainState: args[2]?.$value ?? true, + fullscreenDialog: args[3]?.$value ?? false, + allowSnapshotting: args[4]?.$value ?? true, + barrierDismissible: args[5]?.$value ?? false, + )); + } + + /// Wrap a [MaterialPageRoute] in a [$MaterialPageRoute] + $MaterialPageRoute.wrap(this.$value); + + @override + final MaterialPageRoute $value; + + @override + MaterialPageRoute get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + return _superclass.$getProperty(runtime, identifier); + } + + @override + int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + return _superclass.$setProperty(runtime, identifier, value); + } +} diff --git a/lib/src/material/scaffold.dart b/lib/src/material/scaffold.dart index d06241a..bffa1fd 100644 --- a/lib/src/material/scaffold.dart +++ b/lib/src/material/scaffold.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; import 'package:flutter_eval/src/material/app_bar.dart'; @@ -7,7 +6,7 @@ import 'package:flutter_eval/src/material/snack_bar.dart'; import '../widgets/framework.dart'; -/// dart_eval bridge wrapper for [Scaffold] +/// dart_eval wrapper for [Scaffold] class $Scaffold implements $Instance { /// Bridge type reference for [$Scaffold] static const $type = BridgeTypeRef( diff --git a/lib/src/material/snack_bar.dart b/lib/src/material/snack_bar.dart index f6dd8c3..c0ce311 100644 --- a/lib/src/material/snack_bar.dart +++ b/lib/src/material/snack_bar.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; import 'package:flutter_eval/src/painting/edge_insets.dart'; diff --git a/lib/src/material/text_button.dart b/lib/src/material/text_button.dart index 33f723d..c86e69f 100644 --- a/lib/src/material/text_button.dart +++ b/lib/src/material/text_button.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/material/text_field.dart b/lib/src/material/text_field.dart index 67cacab..05049fa 100644 --- a/lib/src/material/text_field.dart +++ b/lib/src/material/text_field.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/material/text_theme.dart b/lib/src/material/text_theme.dart index ae376a5..4a4f417 100644 --- a/lib/src/material/text_theme.dart +++ b/lib/src/material/text_theme.dart @@ -1,6 +1,5 @@ // ignore_for_file: deprecated_member_use -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/material/theme.dart b/lib/src/material/theme.dart index 1a02cd5..62f9237 100644 --- a/lib/src/material/theme.dart +++ b/lib/src/material/theme.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; import 'package:flutter_eval/src/material/theme_data.dart'; diff --git a/lib/src/material/theme_data.dart b/lib/src/material/theme_data.dart index abab2a3..58008d2 100644 --- a/lib/src/material/theme_data.dart +++ b/lib/src/material/theme_data.dart @@ -1,6 +1,5 @@ // ignore_for_file: deprecated_member_use -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/painting/alignment.dart b/lib/src/painting/alignment.dart index e111152..060926a 100644 --- a/lib/src/painting/alignment.dart +++ b/lib/src/painting/alignment.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/painting/basic_types.dart b/lib/src/painting/basic_types.dart index 48ae4fc..65f4127 100644 --- a/lib/src/painting/basic_types.dart +++ b/lib/src/painting/basic_types.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/painting/border_radius.dart b/lib/src/painting/border_radius.dart index fdfda11..7e0a8e1 100644 --- a/lib/src/painting/border_radius.dart +++ b/lib/src/painting/border_radius.dart @@ -1,10 +1,9 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/material.dart'; import 'package:flutter_eval/src/sky_engine/ui/geometry.dart'; -/// dart_eval bridge wrapper for [BorderRadiusGeometry] +/// dart_eval wrapper for [BorderRadiusGeometry] class $BorderRadiusGeometry implements $Instance { /// dart_eval type definition for [BorderRadiusGeometry] static const $type = BridgeTypeRef(BridgeTypeSpec( @@ -41,7 +40,7 @@ class $BorderRadiusGeometry implements $Instance { } } -/// dart_eval bridge wrapper for [BorderRadius] +/// dart_eval wrapper for [BorderRadius] class $BorderRadius implements $Instance { /// dart_eval type definition for [BorderRadius] static const $type = BridgeTypeRef(BridgeTypeSpec( diff --git a/lib/src/painting/borders.dart b/lib/src/painting/borders.dart index 5b334c0..7c045ab 100644 --- a/lib/src/painting/borders.dart +++ b/lib/src/painting/borders.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/painting.dart'; diff --git a/lib/src/painting/box_border.dart b/lib/src/painting/box_border.dart index 9197eae..22e64f1 100644 --- a/lib/src/painting/box_border.dart +++ b/lib/src/painting/box_border.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/painting.dart'; import 'package:flutter_eval/src/painting/borders.dart'; diff --git a/lib/src/painting/box_decoration.dart b/lib/src/painting/box_decoration.dart index 32a27ff..1a8edb1 100644 --- a/lib/src/painting/box_decoration.dart +++ b/lib/src/painting/box_decoration.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/painting.dart'; import 'package:flutter_eval/src/painting/box_border.dart'; diff --git a/lib/src/painting/box_fit.dart b/lib/src/painting/box_fit.dart index f7dbe64..15ca402 100644 --- a/lib/src/painting/box_fit.dart +++ b/lib/src/painting/box_fit.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/painting/colors.dart b/lib/src/painting/colors.dart index 2d9b3db..fb91029 100644 --- a/lib/src/painting/colors.dart +++ b/lib/src/painting/colors.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/cupertino.dart'; diff --git a/lib/src/painting/decoration.dart b/lib/src/painting/decoration.dart index cf0f78a..0b91e00 100644 --- a/lib/src/painting/decoration.dart +++ b/lib/src/painting/decoration.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/painting.dart'; diff --git a/lib/src/painting/edge_insets.dart b/lib/src/painting/edge_insets.dart index 4e1f09a..0b0cbe6 100644 --- a/lib/src/painting/edge_insets.dart +++ b/lib/src/painting/edge_insets.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/cupertino.dart'; diff --git a/lib/src/painting/image_provider.dart b/lib/src/painting/image_provider.dart index 5466b6e..5f4a3b6 100644 --- a/lib/src/painting/image_provider.dart +++ b/lib/src/painting/image_provider.dart @@ -1,6 +1,5 @@ import 'dart:typed_data'; -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/painting.dart'; diff --git a/lib/src/painting/text_style.dart b/lib/src/painting/text_style.dart index 68d33a6..1dbd6d8 100644 --- a/lib/src/painting/text_style.dart +++ b/lib/src/painting/text_style.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/widgets.dart'; diff --git a/lib/src/rendering/box.dart b/lib/src/rendering/box.dart index 98bd982..34f5e10 100644 --- a/lib/src/rendering/box.dart +++ b/lib/src/rendering/box.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/rendering.dart'; diff --git a/lib/src/rendering/flex.dart b/lib/src/rendering/flex.dart index 02969df..b52a7d6 100644 --- a/lib/src/rendering/flex.dart +++ b/lib/src/rendering/flex.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/rendering/object.dart b/lib/src/rendering/object.dart index 7b12db5..ddd63b1 100644 --- a/lib/src/rendering/object.dart +++ b/lib/src/rendering/object.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/rendering.dart'; diff --git a/lib/src/rendering/proxy_box.dart b/lib/src/rendering/proxy_box.dart index 8153936..1e162cc 100644 --- a/lib/src/rendering/proxy_box.dart +++ b/lib/src/rendering/proxy_box.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/rendering/stack.dart b/lib/src/rendering/stack.dart index 402a085..a8aa45a 100644 --- a/lib/src/rendering/stack.dart +++ b/lib/src/rendering/stack.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/cupertino.dart'; diff --git a/lib/src/scheduler.dart b/lib/src/scheduler.dart new file mode 100644 index 0000000..4ee1e69 --- /dev/null +++ b/lib/src/scheduler.dart @@ -0,0 +1,9 @@ +const schedulerSource = ''' +library scheduler; + +//export 'src/scheduler/binding.dart'; +//export 'src/scheduler/debug.dart'; +//export 'src/scheduler/priority.dart'; +//export 'src/scheduler/service_extensions.dart'; +export 'src/scheduler/ticker.dart'; +'''; diff --git a/lib/src/scheduler/ticker.dart b/lib/src/scheduler/ticker.dart new file mode 100644 index 0000000..efb3deb --- /dev/null +++ b/lib/src/scheduler/ticker.dart @@ -0,0 +1,240 @@ +import 'package:dart_eval/dart_eval_bridge.dart'; +import 'package:dart_eval/stdlib/core.dart'; +import 'package:flutter/scheduler.dart'; + +/// dart_eval wrapper for [TickerFuture] +class $TickerFuture implements $Instance { + /// dart_eval type definition for [TickerFuture] + static const $type = BridgeTypeRef(BridgeTypeSpec( + 'package:flutter/src/scheduler/ticker.dart', 'TickerFuture')); + + /// dart_eval class declaration for [TickerFuture] + static const $declaration = BridgeClassDef( + BridgeClassType($type, $implements: [BridgeTypeRef(CoreTypes.future)]), + constructors: { + '_': BridgeConstructorDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($type), + )) + }, + methods: {}, + wrap: true); + + late final $Instance _superclass = $Future.wrap($value); + + $TickerFuture.wrap(this.$value); + + @override + final TickerFuture $value; + + @override + get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + return _superclass.$getProperty(runtime, identifier); + } + + @override + int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + return _superclass.$setProperty(runtime, identifier, value); + } +} + +/// dart_eval wrapper for [Ticker] +class $Ticker implements $Instance { + /// dart_eval type definition for [Ticker] + static const $type = BridgeTypeRef( + BridgeTypeSpec('package:flutter/src/scheduler/ticker.dart', 'Ticker')); + + /// dart_eval class declaration for [Ticker] + static const $declaration = BridgeClassDef(BridgeClassType($type), + constructors: { + '': BridgeConstructorDef( + BridgeFunctionDef(returns: BridgeTypeAnnotation($type), params: [ + BridgeParameter('_onTick', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), false), + ], namedParams: [ + BridgeParameter( + 'debugLabel', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string), + nullable: true), + true), + ])) + }, + methods: { + 'start': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($TickerFuture.$type))), + 'stop': BridgeMethodDef(BridgeFunctionDef(namedParams: [ + BridgeParameter('canceled', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)), true), + ], returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), + 'absorbTicker': BridgeMethodDef(BridgeFunctionDef(params: [ + BridgeParameter( + 'originalTicker', BridgeTypeAnnotation($Ticker.$type), false), + ], returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), + 'dispose': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), + }, + fields: { + 'muted': BridgeFieldDef( + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)), + ), + }, + getters: { + 'isTicking': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)))), + 'isActive': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)))), + 'scheduled': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)))), + }, + wrap: true); + + late final $Instance _superclass = $Object($value); + + /// Wrap a [Ticker] in a [$Ticker] + $Ticker.wrap(this.$value); + + /// Create a new [$Ticker] from [args] + static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { + return $Ticker.wrap(Ticker( + (elapsed) => (args[0] as EvalCallable).call(runtime, null, [ + $Duration.wrap(elapsed), + ])!.$value, + debugLabel: args[1]?.$value, + )); + } + + @override + final Ticker $value; + + @override + get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + switch (identifier) { + case 'muted': + return $bool($value.muted); + case 'start': + return __start; + case 'stop': + return __stop; + case 'absorbTicker': + return __absorbTicker; + case 'dispose': + return __dispose; + default: + return _superclass.$getProperty(runtime, identifier); + } + } + + static const $Function __start = $Function(_start); + static $Value? _start(Runtime runtime, $Value? target, List<$Value?> args) { + return $TickerFuture.wrap((target!.$value as Ticker).start()); + } + + static const $Function __stop = $Function(_stop); + static $Value? _stop(Runtime runtime, $Value? target, List<$Value?> args) { + (target!.$value as Ticker).stop(canceled: args[0]?.$value); + return null; + } + + static const $Function __absorbTicker = $Function(_absorbTicker); + static $Value? _absorbTicker( + Runtime runtime, $Value? target, List<$Value?> args) { + (target!.$value as Ticker).absorbTicker(args[0]?.$value); + return null; + } + + static const $Function __dispose = $Function(_dispose); + static $Value? _dispose(Runtime runtime, $Value? target, List<$Value?> args) { + (target!.$value as Ticker).dispose(); + return null; + } + + @override + int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + switch (identifier) { + case 'muted': + $value.muted = value.$value; + break; + default: + return _superclass.$setProperty(runtime, identifier, value); + } + return _superclass.$setProperty(runtime, identifier, value); + } +} + +/// dart_eval wrapper for [TickerProvider] +class $TickerProvider implements $Instance { + /// dart_eval type definition for [TickerProvider] + static const $type = BridgeTypeRef(BridgeTypeSpec( + 'package:flutter/src/scheduler/ticker.dart', 'TickerProvider')); + + /// dart_eval class declaration for [TickerProvider] + static const $declaration = BridgeClassDef(BridgeClassType($type), + constructors: { + '': BridgeConstructorDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($type), + )) + }, + methods: { + 'createTicker': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($Ticker.$type), + params: [ + BridgeParameter( + '_onTick', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), + false), + BridgeParameter( + 'debugLabel', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string), + nullable: true), + true), + ])), + }, + wrap: true); + + late final $Instance _superclass = $Object($value); + + /// Wrap a [TickerProvider] in a [$TickerProvider] + $TickerProvider.wrap(this.$value); + + @override + final TickerProvider $value; + + @override + get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + switch (identifier) { + case 'createTicker': + return __createTicker; + default: + return _superclass.$getProperty(runtime, identifier); + } + } + + static const $Function __createTicker = $Function(_createTicker); + static $Value? _createTicker( + Runtime runtime, $Value? target, List<$Value?> args) { + return $Ticker + .wrap((target!.$value as TickerProvider).createTicker(args[0]?.$value)); + } + + @override + int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + return _superclass.$setProperty(runtime, identifier, value); + } +} diff --git a/lib/src/services/binary_messenger.dart b/lib/src/services/binary_messenger.dart index 254d2e1..238ca64 100644 --- a/lib/src/services/binary_messenger.dart +++ b/lib/src/services/binary_messenger.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:dart_eval/stdlib/typed_data.dart'; diff --git a/lib/src/services/message_codec.dart b/lib/src/services/message_codec.dart index 8f40caf..d58f923 100644 --- a/lib/src/services/message_codec.dart +++ b/lib/src/services/message_codec.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:dart_eval/stdlib/typed_data.dart'; @@ -131,7 +130,8 @@ class $MethodCodec implements $Instance { Runtime runtime, $Value? target, List<$Value?> args) { final self = target as $MethodCodec; final data = args[0] as $ByteData; - return runtime.wrapRecursive(self.$value.decodeEnvelope(data.$value)); + return runtime.wrap(self.$value.decodeEnvelope(data.$value), + recursive: true); } @override diff --git a/lib/src/services/platform_channel.dart b/lib/src/services/platform_channel.dart index 74b3da2..900f573 100644 --- a/lib/src/services/platform_channel.dart +++ b/lib/src/services/platform_channel.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/services.dart'; @@ -135,7 +134,7 @@ class $MethodChannel implements $Instance { final arguments = args[1]; return $Future.wrap(self.$value .invokeMethod(method.$value, arguments?.$value) - .then(runtime.wrapRecursive)); + .then(runtime.wrap)); } static const $Function __invokeListMethod = $Function(_invokeListMethod); @@ -147,7 +146,7 @@ class $MethodChannel implements $Instance { final arguments = args[1]; return $Future.wrap(self.$value .invokeListMethod(method.$value, arguments?.$value) - .then(runtime.wrapRecursive)); + .then(runtime.wrap)); } static const $Function __invokeMapMethod = $Function(_invokeMapMethod); @@ -159,7 +158,7 @@ class $MethodChannel implements $Instance { final arguments = args[1]; return $Future.wrap(self.$value .invokeMapMethod(method.$value, arguments?.$value) - .then(runtime.wrapRecursive)); + .then(runtime.wrap)); } static const $Function __setMethodCallHandler = @@ -229,7 +228,7 @@ class $MethodCall implements $Instance { case 'arguments': return $value.arguments == null ? const $null() - : runtime.wrapRecursive($value.arguments); + : runtime.wrap($value.arguments, recursive: true); default: return _superclass.$getProperty(runtime, identifier); } diff --git a/lib/src/sky_engine/ui/geometry.dart b/lib/src/sky_engine/ui/geometry.dart index 4080926..4299ffb 100644 --- a/lib/src/sky_engine/ui/geometry.dart +++ b/lib/src/sky_engine/ui/geometry.dart @@ -1,6 +1,5 @@ import 'dart:ui'; -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; diff --git a/lib/src/sky_engine/ui/image.dart b/lib/src/sky_engine/ui/image.dart index e655401..fff6c61 100644 --- a/lib/src/sky_engine/ui/image.dart +++ b/lib/src/sky_engine/ui/image.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/sky_engine/ui/painting.dart b/lib/src/sky_engine/ui/painting.dart index 47ef81e..a6dd3e3 100644 --- a/lib/src/sky_engine/ui/painting.dart +++ b/lib/src/sky_engine/ui/painting.dart @@ -1,8 +1,7 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/painting.dart'; -/// dart_eval bridge wrapper for [Color] +/// dart_eval wrapper for [Color] class $Color implements Color, $Instance { /// dart_eval type definition for [Color] static const $type = BridgeTypeRef(BridgeTypeSpec('dart:ui', 'Color')); @@ -103,7 +102,7 @@ class $Color implements Color, $Instance { Color withRed(int r) => $value.withRed(r); } -/// dart_eval bridge wrapper for [Clip] +/// dart_eval wrapper for [Clip] class $Clip implements $Instance { /// dart_eval type definition for [Clip] static const $type = BridgeTypeRef(BridgeTypeSpec('dart:ui', 'Clip')); diff --git a/lib/src/sky_engine/ui/pointer.dart b/lib/src/sky_engine/ui/pointer.dart index c3114cb..73bf3ac 100644 --- a/lib/src/sky_engine/ui/pointer.dart +++ b/lib/src/sky_engine/ui/pointer.dart @@ -1,6 +1,5 @@ import 'dart:ui'; -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; class $PointerDeviceKind implements $Instance { diff --git a/lib/src/sky_engine/ui/text.dart b/lib/src/sky_engine/ui/text.dart index 7034743..1c35981 100644 --- a/lib/src/sky_engine/ui/text.dart +++ b/lib/src/sky_engine/ui/text.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/painting.dart'; diff --git a/lib/src/widgets.dart b/lib/src/widgets.dart index ba72d30..2b1f5f4 100644 --- a/lib/src/widgets.dart +++ b/lib/src/widgets.dart @@ -11,9 +11,12 @@ export 'src/widgets/gesture_detector.dart'; export 'src/widgets/icon.dart'; export 'src/widgets/icon_data.dart'; export 'src/widgets/image.dart'; +export 'src/widgets/navigator.dart'; +export 'src/widgets/overlay.dart'; +export 'src/widgets/pages.dart'; +export 'src/widgets/routes.dart'; export 'src/widgets/spacer.dart'; export 'src/widgets/scroll_controller.dart'; export 'src/widgets/scroll_view.dart'; export 'src/widgets/text.dart'; -export 'src/widgets/navigator.dart'; '''; diff --git a/lib/src/widgets/app.dart b/lib/src/widgets/app.dart index 5df0197..f1452a9 100644 --- a/lib/src/widgets/app.dart +++ b/lib/src/widgets/app.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/widgets/basic.dart b/lib/src/widgets/basic.dart index 410231b..bf7b832 100644 --- a/lib/src/widgets/basic.dart +++ b/lib/src/widgets/basic.dart @@ -1,5 +1,5 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; +import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_eval/src/foundation/key.dart'; import 'package:flutter_eval/src/painting/alignment.dart'; @@ -23,6 +23,7 @@ export 'package:flutter/foundation.dart' show ValueNotifier; export 'package:flutter/painting.dart'; export 'package:flutter/rendering.dart' show + Axis, BoxConstraints, CrossAxisAlignment, MainAxisSize, @@ -31,7 +32,7 @@ export 'package:flutter/rendering.dart' show HitTestBehavior; '''; -/// dart_eval bridge wrapper for [Align] +/// dart_eval wrapper for [Align] class $Align implements $Instance { /// Compile-time type definition for [$Align] static const $type = BridgeTypeRef( @@ -94,7 +95,7 @@ class $Align implements $Instance { } } -/// dart_eval bridge wrapper for [AspectRatio] +/// dart_eval wrapper for [AspectRatio] class $AspectRatio implements $Instance { /// Compile-time type definition for [$AspectRatio] static const $type = BridgeTypeRef( @@ -151,7 +152,7 @@ class $AspectRatio implements $Instance { } } -/// dart_eval bridge wrapper for [Baseline] +/// dart_eval wrapper for [Baseline] class $Baseline implements $Instance { /// Compile-time type definition for [$Baseline] static const $type = BridgeTypeRef( @@ -211,7 +212,7 @@ class $Baseline implements $Instance { } } -/// dart_eval bridge wrapper for [Builder] +/// dart_eval wrapper for [Builder] class $Builder implements $Instance { static const $type = BridgeTypeRef( BridgeTypeSpec('package:flutter/src/widgets/basic.dart', 'Builder')); @@ -261,7 +262,7 @@ class $Builder implements $Instance { } } -/// dart_eval bridge wrapper for [Center] +/// dart_eval wrapper for [Center] class $Center implements $Instance { /// Compile-time type definition for [$Center] static const $type = BridgeTypeRef( @@ -321,7 +322,7 @@ class $Center implements $Instance { } } -/// dart_eval bridge wrapper for [Column] +/// dart_eval wrapper for [Column] class $Column implements $Instance { /// Bridge type reference for [$Column] static const $type = BridgeTypeRef( @@ -393,7 +394,7 @@ class $Column implements $Instance { } } -/// dart_eval bridge wrapper for [ClipRRect] +/// dart_eval wrapper for [ClipRRect] class $ClipRRect implements $Instance { /// Compile-time type definition for [$ClipRRect] static const $type = BridgeTypeRef( @@ -453,7 +454,7 @@ class $ClipRRect implements $Instance { } } -/// dart_eval bridge wrapper for [ColoredBox] +/// dart_eval wrapper for [ColoredBox] class $ColoredBox implements $Instance { /// Compile-time type definition for [$ColoredBox] static const $type = BridgeTypeRef( @@ -510,7 +511,7 @@ class $ColoredBox implements $Instance { } } -/// dart_eval bridge wrapper for [Directionality] +/// dart_eval wrapper for [Directionality] class $Directionality implements $Instance { /// Compile-time type definition for [$Directionality] static const $type = BridgeTypeRef(BridgeTypeSpec( @@ -567,7 +568,7 @@ class $Directionality implements $Instance { } } -/// dart_eval bridge wrapper for [Expanded] +/// dart_eval wrapper for [Expanded] class $Expanded implements $Instance { /// Compile-time type definition for [$Expanded] static const $type = BridgeTypeRef( @@ -624,7 +625,7 @@ class $Expanded implements $Instance { } } -/// dart_eval bridge wrapper for [FittedBox] +/// dart_eval wrapper for [FittedBox] class $FittedBox implements $Instance { /// Compile-time type definition for [$FittedBox] static const $type = BridgeTypeRef( @@ -686,7 +687,7 @@ class $FittedBox implements $Instance { } } -/// dart_eval bridge wrapper for [FractionallySizedBox] +/// dart_eval wrapper for [FractionallySizedBox] class $FractionallySizedBox implements $Instance { /// Compile-time type definition for [$FractionallySizedBox] static const $type = BridgeTypeRef(BridgeTypeSpec( @@ -749,7 +750,7 @@ class $FractionallySizedBox implements $Instance { } } -/// dart_eval bridge wrapper for [Padding] +/// dart_eval wrapper for [Padding] class $Padding implements $Instance { static const $type = BridgeTypeRef( BridgeTypeSpec('package:flutter/src/widgets/basic.dart', 'Padding')); @@ -802,7 +803,7 @@ class $Padding implements $Instance { } } -/// dart_eval bridge wrapper for [Positioned] +/// dart_eval wrapper for [Positioned] class $Positioned implements $Instance { static const $type = BridgeTypeRef( BridgeTypeSpec('package:flutter/src/widgets/basic.dart', 'Positioned')); @@ -867,7 +868,7 @@ class $Positioned implements $Instance { } } -/// dart_eval bridge wrapper for [Row] +/// dart_eval wrapper for [Row] class $Row implements $Instance { /// Bridge type reference for [$Row] static const $type = BridgeTypeRef( @@ -901,7 +902,7 @@ class $Row implements $Instance { }, wrap: true); - /// Wraps a [Row] instance in a [$Row] bridge wrapper + /// Wraps a [Row] instance in a [$Row] wrapper $Row.wrap(this.$value) : _superclass = $Widget.wrap($value); final $Instance _superclass; @@ -939,7 +940,7 @@ class $Row implements $Instance { } } -/// dart_eval bridge wrapper for [Stack] +/// dart_eval wrapper for [Stack] class $Stack implements $Instance { /// Compile-time type definition for [$Stack] static const $type = BridgeTypeRef( @@ -1005,7 +1006,7 @@ class $Stack implements $Instance { } } -/// dart_eval bridge wrapper for [SizedBox] +/// dart_eval wrapper for [SizedBox] class $SizedBox implements $Instance { /// Compile-time type definition for [$SizedBox] static const $type = BridgeTypeRef( diff --git a/lib/src/widgets/container.dart b/lib/src/widgets/container.dart index 10c2bf7..8516854 100644 --- a/lib/src/widgets/container.dart +++ b/lib/src/widgets/container.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; diff --git a/lib/src/widgets/editable_text.dart b/lib/src/widgets/editable_text.dart index ad478f8..1e0ccbc 100644 --- a/lib/src/widgets/editable_text.dart +++ b/lib/src/widgets/editable_text.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/widgets/framework.dart b/lib/src/widgets/framework.dart index 5f4e143..14abcf0 100644 --- a/lib/src/widgets/framework.dart +++ b/lib/src/widgets/framework.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/foundation.dart'; diff --git a/lib/src/widgets/gesture_detector.dart b/lib/src/widgets/gesture_detector.dart index 2de261e..2051368 100644 --- a/lib/src/widgets/gesture_detector.dart +++ b/lib/src/widgets/gesture_detector.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/material.dart'; import 'package:flutter_eval/src/foundation/key.dart'; diff --git a/lib/src/widgets/icon.dart b/lib/src/widgets/icon.dart index 45ab00e..317ef8d 100644 --- a/lib/src/widgets/icon.dart +++ b/lib/src/widgets/icon.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_eval/src/foundation/key.dart'; @@ -7,7 +6,7 @@ import 'package:flutter_eval/src/sky_engine/ui/text.dart'; import 'package:flutter_eval/src/widgets/framework.dart'; import 'package:flutter_eval/src/widgets/icon_data.dart'; -/// dart_eval bridge wrapper for [Icon] +/// dart_eval wrapper for [Icon] class $Icon implements $Instance { /// dart_eval compile-time type definition for [Icon] static const $type = BridgeTypeRef( diff --git a/lib/src/widgets/icon_data.dart b/lib/src/widgets/icon_data.dart index 419e803..02049b7 100644 --- a/lib/src/widgets/icon_data.dart +++ b/lib/src/widgets/icon_data.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/cupertino.dart'; diff --git a/lib/src/widgets/image.dart b/lib/src/widgets/image.dart index 45931c3..686bf61 100644 --- a/lib/src/widgets/image.dart +++ b/lib/src/widgets/image.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_eval/src/foundation/key.dart'; @@ -9,7 +8,7 @@ import 'package:flutter_eval/src/sky_engine/ui/image.dart'; import 'package:flutter_eval/src/sky_engine/ui/painting.dart'; import 'package:flutter_eval/src/widgets/framework.dart'; -/// dart_eval bridge wrapper for [Image] +/// dart_eval wrapper for [Image] class $Image implements $Instance { /// dart_eval compile-time type definition for [$Image] static const $type = BridgeTypeRef( diff --git a/lib/src/widgets/navigator.dart b/lib/src/widgets/navigator.dart index a02f208..069c535 100644 --- a/lib/src/widgets/navigator.dart +++ b/lib/src/widgets/navigator.dart @@ -1,13 +1,16 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_eval/src/widgets/framework.dart'; +import 'package:flutter_eval/src/widgets/routes.dart'; +/// dart_eval wrapper for [Navigator] class $Navigator implements $Instance { + /// Compile-time type definition for [$Navigator] static const $type = BridgeTypeRef(BridgeTypeSpec( 'package:flutter/src/widgets/navigator.dart', 'Navigator')); + /// Compile-time class declaration for [$Navigator] static const $declaration = BridgeClassDef( BridgeClassType($type, isAbstract: false, $extends: $StatefulWidget$bridge.$type), @@ -27,12 +30,15 @@ class $Navigator implements $Instance { }, wrap: true); + /// Wrap a [Navigator] in a [$Navigator] const $Navigator.wrap(this.$value); + /// Create a new instance of [$Navigator] from [args] static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { return const $Navigator.wrap(Navigator()); } + /// Create a new instance of [$Navigator] calling [Navigator.of] from [args] static $Value? $of(Runtime runtime, $Value? target, List<$Value?> args) { return $NavigatorState.wrap(Navigator.of(args[0]!.$value)); } @@ -57,10 +63,13 @@ class $Navigator implements $Instance { } } +/// dart_eval wrapper for [NavigatorState] class $NavigatorState implements $Instance { + /// Compile-time type definition for [$NavigatorState] static const $type = BridgeTypeRef(BridgeTypeSpec( 'package:flutter/src/widgets/navigator.dart', 'NavigatorState')); + /// Compile-time class declaration for [$NavigatorState] static const $declaration = BridgeClassDef( BridgeClassType($type, isAbstract: false, $extends: $State$bridge.$type), constructors: {}, @@ -76,26 +85,308 @@ class $NavigatorState implements $Instance { nullable: true), true), ])), - 'pushReplacementNamed': BridgeMethodDef( - BridgeFunctionDef(returns: BridgeTypeAnnotation($type), params: [ - BridgeParameter('name', - BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false), - ], namedParams: [ - BridgeParameter( - 'arguments', - BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), - nullable: true), - true), - ])), - 'pop': BridgeMethodDef( - BridgeFunctionDef(returns: BridgeTypeAnnotation($type), params: [ - BridgeParameter('result', - BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object)), true), - ])), + 'restorablePushNamed': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), + params: [ + BridgeParameter('name', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false), + ], + namedParams: [ + BridgeParameter( + 'arguments', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + ])), + 'pushReplacementNamed': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future)), + params: [ + BridgeParameter('routeName', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false), + ], + namedParams: [ + BridgeParameter( + 'result', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + BridgeParameter( + 'arguments', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + ])), + 'restorablePushReplacementNamed': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), + params: [ + BridgeParameter('routeName', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false), + ], + namedParams: [ + BridgeParameter( + 'result', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + BridgeParameter( + 'arguments', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + ])), + 'popAndPushNamed': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future)), + params: [ + BridgeParameter('routeName', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false), + ], + namedParams: [ + BridgeParameter( + 'result', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + BridgeParameter( + 'arguments', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + ])), + 'restorablePopAndPushNamed': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), + params: [ + BridgeParameter('routeName', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false), + ], + namedParams: [ + BridgeParameter( + 'result', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + BridgeParameter( + 'arguments', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + ])), + 'pushNamedAndRemoveUntil': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future)), + params: [ + BridgeParameter('newRouteName', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false), + BridgeParameter( + 'predicate', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), + false), + ], + namedParams: [ + BridgeParameter( + 'arguments', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + ])), + 'restorablePushNamedAndRemoveUntil': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), + params: [ + BridgeParameter('newRouteName', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false), + BridgeParameter( + 'predicate', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), + false), + ], + namedParams: [ + BridgeParameter( + 'arguments', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + ])), + 'push': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future)), + params: [ + BridgeParameter( + 'route', BridgeTypeAnnotation($Route.$type), false), + ])), + 'restorablePush': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), + params: [ + BridgeParameter( + 'routeBuilder', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), + false), + ], + namedParams: [ + BridgeParameter( + 'arguments', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + ])), + 'pushReplacement': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future)), + params: [ + BridgeParameter( + 'route', BridgeTypeAnnotation($Route.$type), false), + ], + namedParams: [ + BridgeParameter( + 'result', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + ])), + 'restorablePushReplacement': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), + params: [ + BridgeParameter( + 'routeBuilder', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), + false), + ], + namedParams: [ + BridgeParameter( + 'result', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + BridgeParameter( + 'arguments', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + ])), + 'pushAndRemoveUntil': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future)), + params: [ + BridgeParameter( + 'newRoute', BridgeTypeAnnotation($Route.$type), false), + BridgeParameter('predicate', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), false), + ], + )), + 'restorablePushAndRemoveUntil': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), + params: [ + BridgeParameter( + 'newRouteBuilder', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), + false), + BridgeParameter( + 'predicate', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), + false), + ], + namedParams: [ + BridgeParameter( + 'arguments', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + ])), + 'replace': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)), + namedParams: [ + BridgeParameter( + 'oldRoute', BridgeTypeAnnotation($Route.$type), false), + BridgeParameter( + 'newRoute', BridgeTypeAnnotation($Route.$type), false), + ], + )), + 'restorableReplace': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), + namedParams: [ + BridgeParameter( + 'oldRoute', BridgeTypeAnnotation($Route.$type), false), + BridgeParameter( + 'newRouteBuilder', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), + false), + BridgeParameter( + 'arguments', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + ])), + 'replaceRouteBelow': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)), + namedParams: [ + BridgeParameter( + 'anchorRoute', BridgeTypeAnnotation($Route.$type), false), + BridgeParameter( + 'newRoute', BridgeTypeAnnotation($Route.$type), false), + ], + )), + 'restorableReplaceRouteBelow': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), + namedParams: [ + BridgeParameter( + 'anchorRoute', BridgeTypeAnnotation($Route.$type), false), + BridgeParameter( + 'newRouteBuilder', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), + false), + BridgeParameter( + 'arguments', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object), + nullable: true), + true), + ])), + 'canPop': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)), + )), + 'maybePop': BridgeMethodDef(BridgeFunctionDef( + params: [ + BridgeParameter('result', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object)), true), + ], + returns: BridgeTypeAnnotation( + BridgeTypeRef(CoreTypes.future, [ + BridgeTypeRef(CoreTypes.bool), + ]), + ), + )), + 'pop': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)), + params: [ + BridgeParameter('result', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.object)), true), + ])), + 'popUntil': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)), + params: [ + BridgeParameter('predicate', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), false), + ], + )), + 'removeRoute': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)), + params: [ + BridgeParameter('route', BridgeTypeAnnotation($Route.$type), false), + ], + )), + 'removeRouteBelow': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)), + params: [ + BridgeParameter( + 'anchorRoute', BridgeTypeAnnotation($Route.$type), false), + ], + )), + 'finalizeRoute': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)), + params: [ + BridgeParameter('route', BridgeTypeAnnotation($Route.$type), false), + ], + )), }, wrap: true); - const $NavigatorState.wrap(this.$value); + final $Instance _superclass; + + /// Wrap a [NavigatorState] in a [$NavigatorState] + $NavigatorState.wrap(this.$value) : _superclass = $Object($value); @override final NavigatorState $value; @@ -107,24 +398,343 @@ class $NavigatorState implements $Instance { $Value? $getProperty(Runtime runtime, String identifier) { switch (identifier) { case 'pushNamed': - return $Function((runtime, target, args) => $Future.wrap( - (target!.$value as NavigatorState).pushNamed( - args[0]!.$value as String, - arguments: args[1]?.$reified), - )); + return __pushNamed; case 'pushReplacementNamed': - return $Function((runtime, target, args) => $Future.wrap( - (target!.$value as NavigatorState).pushReplacementNamed( - args[0]!.$value as String, - arguments: args[1]?.$reified), - )); + return __pushReplacementNamed; + case 'restorablePushNamed': + return __restorablePushNamed; + case 'restorablePushReplacementNamed': + return __restorablePushReplacementNamed; + case 'popAndPushNamed': + return __popAndPushNamed; + case 'restorablePopAndPushNamed': + return __restorablePopAndPushNamed; + case 'pushNamedAndRemoveUntil': + return __pushNamedAndRemoveUntil; + case 'restorablePushNamedAndRemoveUntil': + return __restorablePushNamedAndRemoveUntil; + case 'push': + return __push; + case 'restorablePush': + return __restorablePush; + case 'pushReplacement': + return __pushReplacement; + case 'restorablePushReplacement': + return __restorablePushReplacement; + case 'pushAndRemoveUntil': + return __pushAndRemoveUntil; + case 'restorablePushAndRemoveUntil': + return __restorablePushAndRemoveUntil; + case 'replace': + return __replace; + case 'restorableReplace': + return __restorableReplace; + case 'replaceRouteBelow': + return __replaceRouteBelow; + case 'restorableReplaceRouteBelow': + return __restorableReplaceRouteBelow; + case 'canPop': + return __canPop; + case 'maybePop': + return __maybePop; case 'pop': - return $Function((runtime, target, args) { - (target!.$value as NavigatorState).pop(args[0]?.$reified); - return null; - }); + return __pop; + case 'popUntil': + return __popUntil; + case 'removeRoute': + return __removeRoute; + case 'removeRouteBelow': + return __removeRouteBelow; + case 'finalizeRoute': + return __finalizeRoute; + default: + return _superclass.$getProperty(runtime, identifier); } - throw UnimplementedError(); + } + + static const $Function __pushNamed = $Function(_pushNamed); + static $Value? _pushNamed( + Runtime runtime, $Value? target, List<$Value?> args) { + return $Future.wrap( + (target!.$value as NavigatorState).pushNamed( + args[0]!.$value as String, + arguments: args[1]?.$reified, + ), + ); + } + + static const $Function __pushReplacementNamed = + $Function(_pushReplacementNamed); + static $Value? _pushReplacementNamed( + Runtime runtime, $Value? target, List<$Value?> args) { + return $Future.wrap( + (target!.$value as NavigatorState).pushReplacementNamed( + args[0]!.$value as String, + result: args[1]?.$reified, + arguments: args[2]?.$reified, + ), + ); + } + + static const $Function __restorablePushNamed = + $Function(_restorablePushNamed); + static $Value? _restorablePushNamed( + Runtime runtime, $Value? target, List<$Value?> args) { + return $String( + (target!.$value as NavigatorState).restorablePushNamed( + args[0]!.$value as String, + arguments: args[1]?.$reified, + ), + ); + } + + static const $Function __restorablePushReplacementNamed = + $Function(_restorablePushReplacementNamed); + static $Value? _restorablePushReplacementNamed( + Runtime runtime, $Value? target, List<$Value?> args) { + return $String( + (target!.$value as NavigatorState).restorablePushReplacementNamed( + args[0]!.$value as String, + result: args[1]?.$reified, + arguments: args[2]?.$reified, + ), + ); + } + + static const $Function __popAndPushNamed = $Function(_popAndPushNamed); + static $Value? _popAndPushNamed( + Runtime runtime, $Value? target, List<$Value?> args) { + return $Future.wrap( + (target!.$value as NavigatorState).popAndPushNamed( + args[0]!.$value as String, + result: args[1]?.$reified, + arguments: args[2]?.$reified, + ), + ); + } + + static const $Function __restorablePopAndPushNamed = + $Function(_restorablePopAndPushNamed); + static $Value? _restorablePopAndPushNamed( + Runtime runtime, $Value? target, List<$Value?> args) { + return $String( + (target!.$value as NavigatorState).restorablePopAndPushNamed( + args[0]!.$value as String, + result: args[1]?.$reified, + arguments: args[2]?.$reified, + ), + ); + } + + static const $Function __pushNamedAndRemoveUntil = + $Function(_pushNamedAndRemoveUntil); + static $Value? _pushNamedAndRemoveUntil( + Runtime runtime, $Value? target, List<$Value?> args) { + return $Future.wrap( + (target!.$value as NavigatorState).pushNamedAndRemoveUntil( + args[0]!.$value as String, + (route) => (args[1] as EvalCallable) + .call(runtime, null, [$Route.wrap(route)])!.$value, + arguments: args[2]?.$reified, + ), + ); + } + + static const $Function __restorablePushNamedAndRemoveUntil = + $Function(_restorablePushNamedAndRemoveUntil); + static $Value? _restorablePushNamedAndRemoveUntil( + Runtime runtime, $Value? target, List<$Value?> args) { + return $String( + (target!.$value as NavigatorState).restorablePushNamedAndRemoveUntil( + args[0]!.$value as String, + (route) => (args[1] as EvalCallable) + .call(runtime, null, [$Route.wrap(route)])!.$value, + arguments: args[2]?.$reified, + ), + ); + } + + static const $Function __push = $Function(_push); + static $Value? _push(Runtime runtime, $Value? target, List<$Value?> args) { + return $Future.wrap( + (target!.$value as NavigatorState).push( + args[0]!.$value as Route, + ), + ); + } + + static const $Function __restorablePush = $Function(_restorablePush); + static $Value? _restorablePush( + Runtime runtime, $Value? target, List<$Value?> args) { + return $String( + (target!.$value as NavigatorState).restorablePush( + (context, arguments) => (args[0] as EvalCallable).call(runtime, null, + [$BuildContext.wrap(context), runtime.wrap(arguments)])!.$value, + arguments: args[1]?.$reified, + ), + ); + } + + static const $Function __pushReplacement = $Function(_pushReplacement); + static $Value? _pushReplacement( + Runtime runtime, $Value? target, List<$Value?> args) { + return $Future.wrap( + (target!.$value as NavigatorState).pushReplacement( + args[0]!.$value as Route, + result: args[1]?.$reified, + ), + ); + } + + static const $Function __restorablePushReplacement = + $Function(_restorablePushReplacement); + static $Value? _restorablePushReplacement( + Runtime runtime, $Value? target, List<$Value?> args) { + return $String( + (target!.$value as NavigatorState).restorablePushReplacement( + (context, arguments) => (args[0] as EvalCallable).call(runtime, null, + [$BuildContext.wrap(context), runtime.wrap(arguments)])!.$value, + result: args[1]?.$reified, + arguments: args[2]?.$reified, + ), + ); + } + + static const $Function __pushAndRemoveUntil = $Function(_pushAndRemoveUntil); + static $Value? _pushAndRemoveUntil( + Runtime runtime, $Value? target, List<$Value?> args) { + return $Future.wrap( + (target!.$value as NavigatorState).pushAndRemoveUntil( + args[0]!.$value as Route, + (route) => (args[1] as EvalCallable) + .call(runtime, null, [$Route.wrap(route)])!.$value, + ), + ); + } + + static const $Function __restorablePushAndRemoveUntil = + $Function(_restorablePushAndRemoveUntil); + static $Value? _restorablePushAndRemoveUntil( + Runtime runtime, $Value? target, List<$Value?> args) { + return $String( + (target!.$value as NavigatorState).restorablePushAndRemoveUntil( + (context, arguments) => (args[0] as EvalCallable).call(runtime, null, + [$BuildContext.wrap(context), runtime.wrap(arguments)])!.$value, + (route) => (args[1] as EvalCallable) + .call(runtime, null, [$Route.wrap(route)])!.$value, + arguments: args[2]?.$reified, + ), + ); + } + + static const $Function __replace = $Function(_replace); + static $Value? _replace(Runtime runtime, $Value? target, List<$Value?> args) { + (target!.$value as NavigatorState).replace( + oldRoute: args[0]!.$value as Route, + newRoute: args[1]!.$value as Route, + ); + return null; + } + + static const $Function __restorableReplace = $Function(_restorableReplace); + static $Value? _restorableReplace( + Runtime runtime, $Value? target, List<$Value?> args) { + return $String( + (target!.$value as NavigatorState).restorableReplace( + oldRoute: args[0]!.$value as Route, + newRouteBuilder: (context, arguments) => (args[1] as EvalCallable).call( + runtime, + null, + [$BuildContext.wrap(context), runtime.wrap(arguments)])!.$value, + arguments: args[2]?.$reified, + ), + ); + } + + static const $Function __replaceRouteBelow = $Function(_replaceRouteBelow); + static $Value? _replaceRouteBelow( + Runtime runtime, $Value? target, List<$Value?> args) { + (target!.$value as NavigatorState).replaceRouteBelow( + anchorRoute: args[0]!.$value as Route, + newRoute: args[1]!.$value as Route, + ); + return null; + } + + static const $Function __restorableReplaceRouteBelow = + $Function(_restorableReplaceRouteBelow); + static $Value? _restorableReplaceRouteBelow( + Runtime runtime, $Value? target, List<$Value?> args) { + return $String( + (target!.$value as NavigatorState).restorableReplaceRouteBelow( + anchorRoute: args[0]!.$value as Route, + newRouteBuilder: (context, arguments) => (args[1] as EvalCallable).call( + runtime, + null, + [$BuildContext.wrap(context), runtime.wrap(arguments)])!.$value, + arguments: args[2]?.$reified, + ), + ); + } + + static const $Function __canPop = $Function(_canPop); + static $Value? _canPop(Runtime runtime, $Value? target, List<$Value?> args) { + return $bool((target!.$value as NavigatorState).canPop()); + } + + static const $Function __maybePop = $Function(_maybePop); + static $Value? _maybePop( + Runtime runtime, $Value? target, List<$Value?> args) { + return $Future.wrap( + (target!.$value as NavigatorState).maybePop( + args[0]?.$reified, + ), + ); + } + + static const $Function __pop = $Function(_pop); + static $Value? _pop(Runtime runtime, $Value? target, List<$Value?> args) { + (target!.$value as NavigatorState).pop( + args[0]?.$reified, + ); + return null; + } + + static const $Function __popUntil = $Function(_popUntil); + static $Value? _popUntil( + Runtime runtime, $Value? target, List<$Value?> args) { + (target!.$value as NavigatorState).popUntil( + (route) => (args[0] as EvalCallable) + .call(runtime, null, [$Route.wrap(route)])!.$value, + ); + return null; + } + + static const $Function __removeRoute = $Function(_removeRoute); + static $Value? _removeRoute( + Runtime runtime, $Value? target, List<$Value?> args) { + (target!.$value as NavigatorState).removeRoute( + args[0]!.$value as Route, + ); + return null; + } + + static const $Function __removeRouteBelow = $Function(_removeRouteBelow); + static $Value? _removeRouteBelow( + Runtime runtime, $Value? target, List<$Value?> args) { + (target!.$value as NavigatorState).removeRouteBelow( + args[0]!.$value as Route, + ); + return null; + } + + static const $Function __finalizeRoute = $Function(_finalizeRoute); + static $Value? _finalizeRoute( + Runtime runtime, $Value? target, List<$Value?> args) { + (target!.$value as NavigatorState).finalizeRoute( + args[0]!.$value as Route, + ); + return null; } @override @@ -132,6 +742,6 @@ class $NavigatorState implements $Instance { @override void $setProperty(Runtime runtime, String identifier, $Value value) { - throw UnimplementedError(); + return _superclass.$setProperty(runtime, identifier, value); } } diff --git a/lib/src/widgets/overlay.dart b/lib/src/widgets/overlay.dart new file mode 100644 index 0000000..3acebbc --- /dev/null +++ b/lib/src/widgets/overlay.dart @@ -0,0 +1,157 @@ +// ignore_for_file: invalid_use_of_protected_member + +import 'package:dart_eval/dart_eval_bridge.dart'; +import 'package:dart_eval/stdlib/core.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_eval/src/foundation/change_notifier.dart'; +import 'package:flutter_eval/src/widgets/framework.dart'; + +/// dart_eval wrapper for [OverlayEntry] +class $OverlayEntry implements $Instance { + static const $type = BridgeTypeRef(BridgeTypeSpec( + 'package:flutter/src/widgets/overlay.dart', 'OverlayEntry')); + + static const $declaration = + BridgeClassDef(BridgeClassType($type, isAbstract: false), + constructors: { + '': BridgeConstructorDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($type), + namedParams: [ + BridgeParameter( + 'builder', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), + false), + BridgeParameter( + 'opaque', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)), + true, + ), + BridgeParameter( + 'maintainState', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool), + nullable: true), + true), + BridgeParameter( + 'canSizeOverlay', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)), + true), + ])) + }, + methods: { + 'remove': BridgeMethodDef(BridgeFunctionDef( + returns: + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))) + }, + fields: {}, + wrap: true); + + late final $Instance _superclass = $Listenable.wrap($value); + + $OverlayEntry.wrap(this.$value); + + static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { + return $OverlayEntry.wrap(OverlayEntry( + builder: (context) => (args[0] as EvalCallable) + .call(runtime, null, [$BuildContext.wrap(context)])!.$value, + opaque: args[1]?.$value ?? false, + maintainState: args[2]?.$value ?? false, + canSizeOverlay: args[3]?.$value ?? false, + )); + } + + @override + final OverlayEntry $value; + + @override + OverlayEntry get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + switch (identifier) { + case 'remove': + return $Function((runtime, target, args) { + (target!.$value as OverlayEntry).remove(); + return null; + }); + case 'dispose': + return $Function((runtime, target, args) { + (target!.$value as OverlayEntry).dispose(); + return null; + }); + } + return _superclass.$getProperty(runtime, identifier); + } + + @override + int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + return _superclass.$setProperty(runtime, identifier, value); + } +} + +/// dart_eval wrapper for [RouteSettings] +class $RouteSettings implements $Instance { + static const $spec = BridgeTypeSpec( + 'package:flutter/src/widgets/routes.dart', 'RouteSettings'); + static const $type = BridgeTypeRef($spec); + + static const $declaration = BridgeClassDef(BridgeClassType($type), + constructors: { + '': BridgeConstructorDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($type), + namedParams: [ + BridgeParameter( + 'name', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string), + nullable: true), + true), + BridgeParameter( + 'arguments', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.dynamic), + nullable: true), + true), + ])) + }, + getters: { + 'name': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string), + nullable: true))), + 'arguments': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.dynamic), + nullable: true))), + }, + fields: {}, + wrap: true); + + late final $Instance _superclass = $Object($value); + + $RouteSettings.wrap(this.$value); + + static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { + return $RouteSettings.wrap(RouteSettings( + name: args[0]?.$value, + arguments: args[1]?.$value, + )); + } + + @override + final RouteSettings $value; + + @override + RouteSettings get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + return _superclass.$getProperty(runtime, identifier); + } + + @override + int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + return _superclass.$setProperty(runtime, identifier, value); + } +} diff --git a/lib/src/widgets/pages.dart b/lib/src/widgets/pages.dart new file mode 100644 index 0000000..0e1411b --- /dev/null +++ b/lib/src/widgets/pages.dart @@ -0,0 +1,389 @@ +// ignore_for_file: must_call_super, invalid_use_of_protected_member + +import 'dart:ui'; + +import 'package:dart_eval/dart_eval_bridge.dart'; +import 'package:dart_eval/stdlib/core.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_eval/animation.dart'; +import 'package:flutter_eval/src/animation/animation.dart'; +import 'package:flutter_eval/src/animation/animation_controller.dart'; +import 'package:flutter_eval/src/sky_engine/ui/painting.dart'; +import 'package:flutter_eval/src/widgets/framework.dart'; +import 'package:flutter_eval/src/widgets/navigator.dart'; +import 'package:flutter_eval/src/widgets/routes.dart'; + +/// dart_eval bridge class for [PageRoute] +class $PageRoute$bridge extends PageRoute with $Bridge { + static const $spec = + BridgeTypeSpec('package:flutter/src/widgets/pages.dart', 'PageRoute'); + static const $type = BridgeTypeRef($spec); + + static const $declaration = BridgeClassDef( + BridgeClassType( + $type, + isAbstract: true, + generics: {'T': BridgeGenericParam()}, + $extends: BridgeTypeRef($TransitionRoute.$spec, [ + BridgeTypeRef.ref('T'), + ]), + ), + constructors: {}, + methods: {}, + bridge: true); + + @override + bool get offstage => $_get('offstage'); + + @override + bool get willDisposeAnimationController => + $_get('willDisposeAnimationController'); + + @override + $Value? $bridgeGet(String identifier) { + switch (identifier) { + case 'offstage': + return $bool(super.offstage); + case 'willDisposeAnimationController': + return $bool(super.willDisposeAnimationController); + case 'allowSnapshotting': + return $bool(super.allowSnapshotting); + } + throw UnimplementedError(); + } + + @override + void $bridgeSet(String identifier, $Value value) { + throw UnimplementedError(); + } + + @override + void addLocalHistoryEntry(LocalHistoryEntry entry) => + throw UnimplementedError(); + + @override + // ignore: deprecated_member_use + void addScopedWillPopCallback(WillPopCallback callback) => + $_invoke('addScopedWillPopCallback', [ + $Function((runtime, target, args) => + $Future.wrap(callback().then((value) => $bool(value)))) + ]); + + @override + bool get allowSnapshotting => $_get('allowSnapshotting'); + + @override + Animation? get animation => $_get('animation'); + + @override + Color? get barrierColor => $_get('barrierColor'); + + @override + Curve get barrierCurve => $_get('barrierCurve'); + + @override + bool get barrierDismissible => $_get('barrierDismissible'); + + @override + String? get barrierLabel => $_get('barrierLabel'); + + @override + Widget buildModalBarrier() => $_invoke('buildModalBarrier', []); + + @override + Widget buildPage(BuildContext context, Animation animation, + Animation secondaryAnimation) { + return $_invoke('buildPage', [ + $BuildContext.wrap(context), + $Animation.wrap(animation), + $Animation.wrap(secondaryAnimation) + ]); + } + + @override + Widget buildTransitions(BuildContext context, Animation animation, + Animation secondaryAnimation, Widget child) { + return $_invoke('buildTransitions', [ + $BuildContext.wrap(context), + $Animation.wrap(animation), + $Animation.wrap(secondaryAnimation), + $Widget.wrap(child) + ]); + } + + @override + bool get canPop => $_get('canPop'); + + @override + bool canTransitionFrom(TransitionRoute previousRoute) => + $_invoke('canTransitionFrom', [$TransitionRoute.wrap(previousRoute)]); + + @override + bool canTransitionTo(TransitionRoute nextRoute) => + $_invoke('canTransitionTo', [$TransitionRoute.wrap(nextRoute)]); + + @override + void changedExternalState() => $_invoke('changedExternalState', []); + + @override + void changedInternalState() => $_invoke('changedInternalState', []); + + @override + Future get completed => $_get('completed'); + + @override + AnimationController? get controller => $_get('controller'); + + @override + Animation createAnimation() => $_invoke('createAnimation', []); + + @override + AnimationController createAnimationController() => + $_invoke('createAnimationController', []); + + @override + Iterable createOverlayEntries() => + $_invoke('createOverlayEntries', []); + + @override + get currentResult => $_get('currentResult'); + + @override + String get debugLabel => $_get('debugLabel'); + + @override + void didAdd() => $_invoke('didAdd', []); + + @override + void didChangeNext(Route? nextRoute) => $_invoke('didChangeNext', + [nextRoute == null ? const $null() : $Route.wrap(nextRoute)]); + + @override + void didChangePrevious(Route? previousRoute) => $_invoke('didChangePrevious', + [previousRoute == null ? const $null() : $Route.wrap(previousRoute)]); + + @override + void didComplete(result) => + $_invoke('didComplete', [$runtime.wrapAlways(result)]); + + @override + bool didPop(result) => $_invoke('didPop', [$runtime.wrapAlways(result)]); + + @override + void didPopNext(Route nextRoute) => + $_invoke('didPopNext', [$Route.wrap(nextRoute)]); + + @override + TickerFuture didPush() => $_invoke('didPush', []); + + @override + void didReplace(Route? oldRoute) => $_invoke( + 'didReplace', [oldRoute == null ? const $null() : $Route.wrap(oldRoute)]); + + @override + void dispose() => $_invoke('dispose', []); + + @override + ImageFilter? get filter => $_get('filter'); + + @override + bool get finishedWhenPopped => $_get('finishedWhenPopped'); + + @override + bool get fullscreenDialog => $_get('fullscreenDialog'); + + @override + bool get hasActiveRouteBelow => $_get('hasActiveRouteBelow'); + + @override + bool get hasScopedWillPopCallback => $_get('hasScopedWillPopCallback'); + + @override + bool get impliesAppBarDismissal => $_get('impliesAppBarDismissal'); + + @override + void install() => $_invoke('install', []); + + @override + bool get isActive => $_get('isActive'); + + @override + bool get isCurrent => $_get('isCurrent'); + + @override + bool get isFirst => $_get('isFirst'); + + @override + bool get maintainState => $_get('maintainState'); + + @override + NavigatorState? get navigator => $_get('navigator'); + + @override + void onPopInvoked(bool didPop) => $_invoke('onPopInvoked', [$bool(didPop)]); + + @override + bool get opaque => $_get('opaque'); + + @override + List get overlayEntries => $_get('overlayEntries'); + + @override + RoutePopDisposition get popDisposition => $_get('popDisposition'); + + @override + Future get popped => $_get('popped'); + + @override + void registerPopEntry(PopEntry popEntry) => + $_invoke('registerPopEntry', [$PopEntry.wrap(popEntry)]); + + @override + void removeLocalHistoryEntry(LocalHistoryEntry entry) { + throw UnimplementedError(); + } + + @override + // ignore: deprecated_member_use + void removeScopedWillPopCallback(WillPopCallback callback) { + throw UnimplementedError(); + } + + @override + ValueListenable get restorationScopeId => + $_get('restorationScopeId'); + + @override + Duration get reverseTransitionDuration => $_get('reverseTransitionDuration'); + + @override + Animation? get secondaryAnimation => $_get('secondaryAnimation'); + + @override + bool get semanticsDismissible => $_get('semanticsDismissible'); + + @override + void setState(VoidCallback fn) => $_invoke('setState', [ + $Function((runtime, target, args) { + fn(); + return const $null(); + }) + ]); + + @override + RouteSettings get settings => $_get('settings'); + + @override + BuildContext? get subtreeContext => $_get('subtreeContext'); + + @override + Duration get transitionDuration => $_get('transitionDuration'); + + @override + TraversalEdgeBehavior? get traversalEdgeBehavior => + $_get('traversalEdgeBehavior'); + + @override + void unregisterPopEntry(PopEntry popEntry) => + $_invoke('unregisterPopEntry', [$PopEntry.wrap(popEntry)]); + + @override + bool get willHandlePopInternally => $_get('willHandlePopInternally'); + + @override + Future willPop() => $_invoke('willPop', []); + + @override + set offstage(bool value) => $_set('offstage', $bool(value)); + + @override + set willDisposeAnimationController(bool value) => + $_set('willDisposeAnimationController', $bool(value)); +} + +/// dart_eval wrapper for [PageRoute] +class $PageRoute implements $Instance { + static const $declaration = $PageRoute$bridge.$declaration; + + late final $Instance _superclass = $OverlayRoute.wrap($value); + + $PageRoute.wrap(this.$value); + + @override + final PageRoute $value; + + @override + PageRoute get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + switch (identifier) { + case 'offstage': + return $bool($value.offstage); + case 'willDisposeAnimationController': + return $bool($value.willDisposeAnimationController); + case 'allowSnapshotting': + return $bool($value.allowSnapshotting); + case 'animation': + final animation = $value.animation; + if (animation == null) return const $null(); + return $Animation.wrap(animation); + case 'barrierColor': + return $value.barrierColor == null + ? const $null() + : $Color.wrap($value.barrierColor!); + case 'barrierCurve': + return $Curve.wrap($value.barrierCurve); + case 'barrierDismissible': + return $bool($value.barrierDismissible); + case 'barrierLabel': + return $value.barrierLabel == null + ? const $null() + : $String($value.barrierLabel!); + case 'canPop': + return $bool($value.canPop); + case 'controller': + return $value.controller == null + ? const $null() + : $AnimationController.wrap($value.controller!); + case 'currentResult': + return $value.currentResult == null + ? const $null() + : runtime.wrapAlways($value.currentResult); + case 'debugLabel': + return $String($value.debugLabel); + case 'filter': + throw UnimplementedError(); + case 'finishedWhenPopped': + return $bool($value.finishedWhenPopped); + case 'fullscreenDialog': + return $bool($value.fullscreenDialog); + case 'hasActiveRouteBelow': + return $bool($value.hasActiveRouteBelow); + case 'hasScopedWillPopCallback': + // ignore: deprecated_member_use + return $bool($value.hasScopedWillPopCallback); + case 'impliesAppBarDismissal': + return $bool($value.impliesAppBarDismissal); + case 'maintainState': + return $bool($value.maintainState); + case 'navigator': + return $value.navigator == null + ? const $null() + : $NavigatorState.wrap($value.navigator!); + case 'opaque': + return $bool($value.opaque); + } + return _superclass.$getProperty(runtime, identifier); + } + + @override + int $getRuntimeType(Runtime runtime) => + runtime.lookupType($PageRoute$bridge.$type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + return _superclass.$setProperty(runtime, identifier, value); + } +} diff --git a/lib/src/widgets/routes.dart b/lib/src/widgets/routes.dart new file mode 100644 index 0000000..87e1fee --- /dev/null +++ b/lib/src/widgets/routes.dart @@ -0,0 +1,500 @@ +// ignore_for_file: invalid_use_of_protected_member + +import 'package:dart_eval/dart_eval_bridge.dart'; +import 'package:dart_eval/stdlib/core.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_eval/src/animation/animation.dart'; +import 'package:flutter_eval/src/animation/animation_controller.dart'; +import 'package:flutter_eval/src/foundation/change_notifier.dart'; +import 'package:flutter_eval/src/widgets/navigator.dart'; +import 'package:flutter_eval/src/widgets/overlay.dart'; + +/// dart_eval wrapper for [Route] +class $Route implements $Instance { + static const $type = BridgeTypeRef( + BridgeTypeSpec('package:flutter/src/widgets/routes.dart', 'Route')); + + static const $declaration = BridgeClassDef( + BridgeClassType($type, generics: {'T': BridgeGenericParam()}), + constructors: { + '': BridgeConstructorDef(BridgeFunctionDef(namedParams: [ + BridgeParameter('settings', + BridgeTypeAnnotation($RouteSettings.$type, nullable: true), true), + ], returns: BridgeTypeAnnotation($type))) + }, + methods: { + 'didPop': BridgeMethodDef(BridgeFunctionDef(namedParams: [ + BridgeParameter( + 'result', + BridgeTypeAnnotation(BridgeTypeRef.ref('T'), nullable: true), + true), + ], returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)))), + 'didComplete': BridgeMethodDef(BridgeFunctionDef(namedParams: [ + BridgeParameter( + 'result', + BridgeTypeAnnotation(BridgeTypeRef.ref('T'), nullable: true), + true), + ], returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), + 'didPopNext': BridgeMethodDef(BridgeFunctionDef(namedParams: [ + BridgeParameter( + 'nextRoute', BridgeTypeAnnotation($Route.$type), true), + ], returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), + 'didChangeNext': BridgeMethodDef(BridgeFunctionDef(namedParams: [ + BridgeParameter('nextRoute', + BridgeTypeAnnotation($Route.$type, nullable: true), true), + ], returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), + 'didChangePrevious': BridgeMethodDef(BridgeFunctionDef(namedParams: [ + BridgeParameter('previousRoute', + BridgeTypeAnnotation($Route.$type, nullable: true), true), + ], returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), + 'changedInternalState': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), + 'dispose': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), + 'install': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), + 'didAdd': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), + 'didPush': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future)))), + 'didReplace': BridgeMethodDef(BridgeFunctionDef(namedParams: [ + BridgeParameter('oldRoute', + BridgeTypeAnnotation($Route.$type, nullable: true), true), + ], returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.voidType)))), + }, + getters: { + 'settings': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($RouteSettings.$type))), + 'navigator': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($NavigatorState.$type))), + 'restorationScopeId': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef( + BridgeTypeSpec( + 'package:flutter/src/foundation/change_notifier.dart', + 'ValueListenable'), + [BridgeTypeRef(CoreTypes.string)])))), + 'willHandlePopInternally': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)))), + 'currentResult': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef.ref('T')))), + 'popped': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation( + BridgeTypeRef(CoreTypes.future, [BridgeTypeRef.ref('T')])))), + 'isCurrent': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)))), + 'isFirst': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)))), + 'hasActiveRouteBelow': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)))), + 'isActive': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)))), + }, + fields: {}, + wrap: true); + + late final $Instance _superclass = $Object($value); + + $Route.wrap(this.$value); + + @override + final Route $value; + + @override + Route get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + switch (identifier) { + case 'settings': + return $RouteSettings.wrap($value.settings); + case 'navigator': + final navigator = $value.navigator; + return navigator == null + ? const $null() + : $NavigatorState.wrap(navigator); + case 'restorationScopeId': + return $ValueListenable.wrap($value.restorationScopeId); + case 'willHandlePopInternally': + return $bool($value.willHandlePopInternally); + case 'currentResult': + return $value.currentResult == null + ? const $null() + : runtime.wrap($value.currentResult, recursive: true); + case 'popped': + return $Future.wrap($value.popped); + case 'isCurrent': + return $bool($value.isCurrent); + case 'isFirst': + return $bool($value.isFirst); + case 'hasActiveRouteBelow': + return $bool($value.hasActiveRouteBelow); + case 'isActive': + return $bool($value.isActive); + case 'didPop': + return __didPop; + case 'didComplete': + return __didComplete; + case 'didPopNext': + return __didPopNext; + case 'didChangeNext': + return __didChangeNext; + case 'didChangePrevious': + return __didChangePrevious; + case 'changedInternalState': + return __changedInternalState; + case 'dispose': + return __dispose; + case 'install': + return __install; + case 'didPush': + return __didPush; + case 'didReplace': + return __didReplace; + case 'didAdd': + return __didAdd; + } + return _superclass.$getProperty(runtime, identifier); + } + + static const $Function __didPop = $Function(_didPop); + static $Value? _didPop(Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $Route; + return $bool(self.$value.didPop(args[0]?.$value)); + } + + static const $Function __didComplete = $Function(_didComplete); + static $Value? _didComplete( + Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $Route; + self.$value.didComplete(args[0]?.$value); + return null; + } + + static const $Function __didPopNext = $Function(_didPopNext); + static $Value? _didPopNext( + Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $Route; + self.$value.didPopNext(args[0]?.$value); + return null; + } + + static const $Function __didChangeNext = $Function(_didChangeNext); + static $Value? _didChangeNext( + Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $Route; + self.$value.didChangeNext(args[0]?.$value); + return null; + } + + static const $Function __didChangePrevious = $Function(_didChangePrevious); + static $Value? _didChangePrevious( + Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $Route; + self.$value.didChangePrevious(args[0]?.$value); + return null; + } + + static const $Function __changedInternalState = + $Function(_changedInternalState); + static $Value? _changedInternalState( + Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $Route; + self.$value.changedInternalState(); + return null; + } + + static const $Function __dispose = $Function(_dispose); + static $Value? _dispose(Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $Route; + self.$value.dispose(); + return null; + } + + static const $Function __install = $Function(_install); + static $Value? _install(Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $Route; + self.$value.install(); + return null; + } + + static const $Function __didPush = $Function(_didPush); + static $Value? _didPush(Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $Route; + return $Future.wrap(self.$value.didPush()); + } + + static const $Function __didReplace = $Function(_didReplace); + static $Value? _didReplace( + Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $Route; + self.$value.didReplace(args[0]?.$value); + return null; + } + + static const $Function __didAdd = $Function(_didAdd); + static $Value? _didAdd(Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $Route; + self.$value.didAdd(); + return null; + } + + @override + int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + return _superclass.$setProperty(runtime, identifier, value); + } +} + +/// dart_eval wrapper for [OverlayRoute] +class $OverlayRoute implements $Instance { + static const $spec = + BridgeTypeSpec('package:flutter/src/widgets/routes.dart', 'OverlayRoute'); + static const $type = BridgeTypeRef($spec); + + static const $declaration = BridgeClassDef( + BridgeClassType($type, + generics: { + 'T': BridgeGenericParam(), + }, + $extends: $Route.$type), + constructors: {}, + methods: { + 'createOverlayEntries': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation( + BridgeTypeRef(CoreTypes.iterable, [$OverlayEntry.$type])))), + }, + getters: { + 'overlayEntries': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation( + BridgeTypeRef(CoreTypes.iterable, [$OverlayEntry.$type])))), + }, + fields: {}, + wrap: true); + + late final $Instance _superclass = $Route.wrap($value); + + $OverlayRoute.wrap(this.$value); + + @override + final OverlayRoute $value; + + @override + OverlayRoute get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + switch (identifier) { + case 'createOverlayEntries': + return __createOverlayEntries; + case 'overlayEntries': + return $List.wrap($value.overlayEntries); + } + return _superclass.$getProperty(runtime, identifier); + } + + static const $Function __createOverlayEntries = + $Function(_createOverlayEntries); + static $Value? _createOverlayEntries( + Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $OverlayRoute; + return $Iterable.wrap(self.$value.createOverlayEntries()); + } + + @override + int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + return _superclass.$setProperty(runtime, identifier, value); + } +} + +/// dart_eval wrapper for [TransitionRoute] +class $TransitionRoute implements $Instance { + static const $spec = BridgeTypeSpec( + 'package:flutter/src/widgets/routes.dart', 'TransitionRoute'); + static const $type = BridgeTypeRef($spec); + + static const $declaration = BridgeClassDef( + BridgeClassType($type, + generics: { + 'T': BridgeGenericParam(), + }, + $extends: BridgeTypeRef($OverlayRoute.$spec, [ + BridgeTypeRef.ref('T'), + ])), + constructors: {}, + methods: { + 'createAnimation': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef($Animation.$spec, [ + BridgeTypeRef(CoreTypes.double), + ])))), + 'createAnimationController': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($AnimationController.$type))), + 'canTransitionTo': BridgeMethodDef(BridgeFunctionDef( + params: [ + BridgeParameter('nextRoute', + BridgeTypeAnnotation($TransitionRoute.$type), true), + ], + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool), + nullable: true))), + 'canTransitionFrom': BridgeMethodDef(BridgeFunctionDef( + params: [ + BridgeParameter('previousRoute', + BridgeTypeAnnotation($TransitionRoute.$type), true), + ], + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool), + nullable: true))), + }, + getters: { + 'animation': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation( + BridgeTypeRef($Animation.$spec, [ + BridgeTypeRef(CoreTypes.double), + ]), + nullable: true))), + 'controller': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation($AnimationController.$type, + nullable: true))), + 'secondaryAnimation': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation( + BridgeTypeRef($Animation.$spec, [ + BridgeTypeRef(CoreTypes.double), + ]), + nullable: true))), + }, + fields: {}, + wrap: true); + + late final $Instance _superclass = $OverlayRoute.wrap($value); + + $TransitionRoute.wrap(this.$value); + + @override + final TransitionRoute $value; + + @override + TransitionRoute get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + switch (identifier) { + case 'createAnimation': + return __createAnimation; + case 'createAnimationController': + return __createAnimationController; + case 'canTransitionTo': + return __canTransitionTo; + case 'canTransitionFrom': + return __canTransitionFrom; + case 'animation': + final animation = $value.animation; + return animation == null ? const $null() : $Animation.wrap(animation); + case 'controller': + final controller = $value.controller; + return controller == null + ? const $null() + : $AnimationController.wrap(controller); + case 'secondaryAnimation': + final secondaryAnimation = $value.secondaryAnimation; + return secondaryAnimation == null + ? const $null() + : $Animation.wrap(secondaryAnimation); + } + return _superclass.$getProperty(runtime, identifier); + } + + static const $Function __createAnimation = $Function(_createAnimation); + static $Value? _createAnimation( + Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $TransitionRoute; + return $Animation.wrap(self.$value.createAnimation()); + } + + static const $Function __createAnimationController = + $Function(_createAnimationController); + static $Value? _createAnimationController( + Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $TransitionRoute; + return $AnimationController.wrap(self.$value.createAnimationController()); + } + + static const $Function __canTransitionTo = $Function(_canTransitionTo); + static $Value? _canTransitionTo( + Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $TransitionRoute; + return $bool(self.$value.canTransitionTo(args[0]?.$value)); + } + + static const $Function __canTransitionFrom = $Function(_canTransitionFrom); + static $Value? _canTransitionFrom( + Runtime runtime, $Value? target, List<$Value?> args) { + final self = target as $TransitionRoute; + return $bool(self.$value.canTransitionFrom(args[0]?.$value)); + } + + @override + int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + return _superclass.$setProperty(runtime, identifier, value); + } +} + +/// dart_eval wrapper for [PopEntry] +class $PopEntry implements $Instance { + static const $type = BridgeTypeRef( + BridgeTypeSpec('package:flutter/src/widgets/routes.dart', 'PopEntry')); + + static const $declaration = + BridgeClassDef(BridgeClassType($type, isAbstract: true), + constructors: {}, + getters: { + 'onPopInvoked': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.function)), + )), + 'canPopNotifier': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef( + $ValueListenable.$spec, [BridgeTypeRef(CoreTypes.bool)])), + )), + }, + methods: {}, + bridge: true); + + late final $Instance _superclass = $Object($value); + + $PopEntry.wrap(this.$value); + + @override + final PopEntry $value; + + @override + PopEntry get $reified => $value; + + @override + $Value? $getProperty(Runtime runtime, String identifier) { + switch (identifier) { + case 'onPopInvoked': + final onPopInvoked = $value.onPopInvoked; + if (onPopInvoked == null) return const $null(); + return $Function((runtime, target, args) { + onPopInvoked(args[0]!.$value); + return const $null(); + }); + case 'canPopNotifier': + return $ValueListenable.wrap($value.canPopNotifier); + } + return _superclass.$getProperty(runtime, identifier); + } + + @override + int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!); + + @override + void $setProperty(Runtime runtime, String identifier, $Value value) { + return _superclass.$setProperty(runtime, identifier, value); + } +} diff --git a/lib/src/widgets/scroll_controller.dart b/lib/src/widgets/scroll_controller.dart index d5d47ec..03844ee 100644 --- a/lib/src/widgets/scroll_controller.dart +++ b/lib/src/widgets/scroll_controller.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/cupertino.dart'; diff --git a/lib/src/widgets/scroll_view.dart b/lib/src/widgets/scroll_view.dart index d10b125..c5f6c01 100644 --- a/lib/src/widgets/scroll_view.dart +++ b/lib/src/widgets/scroll_view.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/cupertino.dart'; diff --git a/lib/src/widgets/spacer.dart b/lib/src/widgets/spacer.dart index 1d44792..fe57a1f 100644 --- a/lib/src/widgets/spacer.dart +++ b/lib/src/widgets/spacer.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_eval/src/foundation/key.dart'; diff --git a/lib/src/widgets/text.dart b/lib/src/widgets/text.dart index 90be661..0194122 100644 --- a/lib/src/widgets/text.dart +++ b/lib/src/widgets/text.dart @@ -1,4 +1,3 @@ -import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; @@ -6,7 +5,7 @@ import 'package:flutter_eval/src/foundation/key.dart'; import 'package:flutter_eval/src/painting/text_style.dart'; import 'package:flutter_eval/src/widgets/framework.dart'; -/// dart_eval bridge wrapper for [Text] +/// dart_eval wrapper for [Text] class $Text implements Text, $Instance { /// dart_eval compile-time type definition for [Text] static const $type = BridgeTypeRef( diff --git a/pubspec.yaml b/pubspec.yaml index 8fac8a8..db67946 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_eval description: Flutter bridge library for dart_eval, enabling creation of fully dynamic Flutter apps and widgets that can be loaded from a file or the Internet at runtime. -version: 0.7.4 +version: 0.7.5 homepage: https://github.com/ethanblake4/flutter_eval platforms: @@ -25,7 +25,7 @@ environment: dependencies: flutter: sdk: flutter - dart_eval: ^0.7.4 + dart_eval: ^0.7.9 path_provider: ^2.1.0 http: ^1.1.0 diff --git a/test/flutter_eval_test.dart b/test/flutter_eval_test.dart index 58bf002..84da04b 100644 --- a/test/flutter_eval_test.dart +++ b/test/flutter_eval_test.dart @@ -8,9 +8,14 @@ import 'package:flutter_eval/src/painting/alignment.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { + late final Compiler compiler; + + setUpAll(() { + compiler = Compiler(); + compiler.addPlugin(flutterEvalPlugin); + }); + test('Can extend StatelessWidget', () { - final compiler = Compiler(); - setupFlutterForCompile(compiler); final program = compiler.compile({ 'example': { 'main.dart': ''' @@ -28,15 +33,13 @@ void main() { } }); final runtime = Runtime(program.write().buffer.asByteData()); - setupFlutterForRuntime(runtime); + runtime.addPlugin(flutterEvalPlugin); final result = runtime.executeLib('package:example/main.dart', 'MyApp.'); expect(result, isNotNull); expect(result, isA()); }); test('Listener disposal on a ChangeNotifier', () { - final compiler = Compiler(); - setupFlutterForCompile(compiler); final program = compiler.compile({ 'example': { 'main.dart': ''' @@ -56,14 +59,12 @@ void main() { } }); final runtime = Runtime(program.write().buffer.asByteData()); - setupFlutterForRuntime(runtime); + runtime.addPlugin(flutterEvalPlugin); expect(() => runtime.executeLib('package:example/main.dart', 'main'), prints('listener\n')); }); testWidgets('TextField test', (WidgetTester tester) async { - final compiler = Compiler(); - setupFlutterForCompile(compiler); final program = compiler.compile({ 'example': { 'main.dart': ''' @@ -107,7 +108,7 @@ void main() { } }); final runtime = Runtime(program.write().buffer.asByteData()); - setupFlutterForRuntime(runtime); + runtime.addPlugin(flutterEvalPlugin); await tester.pumpWidget( runtime.executeLib('package:example/main.dart', 'MyWidget.')); await tester.enterText(find.byType(TextField), 'Hello'); @@ -116,8 +117,6 @@ void main() { }); test('Alignment', () { - final compiler = Compiler(); - setupFlutterForCompile(compiler); final program = compiler.compile({ 'example': { 'main.dart': ''' @@ -130,7 +129,7 @@ void main() { } }); final runtime = Runtime(program.write().buffer.asByteData()); - setupFlutterForRuntime(runtime); + runtime.addPlugin(flutterEvalPlugin); final result = runtime.executeLib('package:example/main.dart', 'main'); expect(result, isNotNull); expect(result[0], isA<$Alignment>()); @@ -139,8 +138,6 @@ void main() { }); test('Curves.easeIn and easeOut', () { - final compiler = Compiler(); - setupFlutterForCompile(compiler); final program = compiler.compile({ 'example': { 'main.dart': ''' @@ -153,7 +150,7 @@ void main() { } }); final runtime = Runtime(program.write().buffer.asByteData()); - setupFlutterForRuntime(runtime); + runtime.addPlugin(flutterEvalPlugin); final result = runtime.executeLib('package:example/main.dart', 'main'); expect(result, isNotNull); expect(result[0], isA<$Cubic>()); @@ -169,8 +166,6 @@ void main() { }); test('AppBar with title and actions', () { - final compiler = Compiler(); - setupFlutterForCompile(compiler); final program = compiler.compile({ 'example': { 'main.dart': ''' @@ -193,7 +188,7 @@ void main() { } }); final runtime = Runtime(program.write().buffer.asByteData()); - setupFlutterForRuntime(runtime); + runtime.addPlugin(flutterEvalPlugin); final result = runtime.executeLib('package:example/main.dart', 'main'); expect(result, isNotNull); expect(result.$value, isA()); @@ -201,8 +196,6 @@ void main() { }); test('BoxDecoration with Border.all', () { - final compiler = Compiler(); - setupFlutterForCompile(compiler); final program = compiler.compile({ 'example': { 'main.dart': ''' @@ -220,7 +213,7 @@ void main() { } }); final runtime = Runtime(program.write().buffer.asByteData()); - setupFlutterForRuntime(runtime); + runtime.addPlugin(flutterEvalPlugin); final result = runtime.executeLib('package:example/main.dart', 'main'); expect(result, isNotNull); expect(result.$value, isA()); @@ -231,8 +224,6 @@ void main() { }); test('Stack and Positioned', () { - final compiler = Compiler(); - setupFlutterForCompile(compiler); final program = compiler.compile({ 'example': { 'main.dart': ''' @@ -258,7 +249,7 @@ void main() { } }); final runtime = Runtime(program.write().buffer.asByteData()); - setupFlutterForRuntime(runtime); + runtime.addPlugin(flutterEvalPlugin); final result = runtime.executeLib('package:example/main.dart', 'main'); expect(result, isNotNull); expect(result.$value, isA()); @@ -268,8 +259,6 @@ void main() { }); test('ClipRRect', () { - final compiler = Compiler(); - setupFlutterForCompile(compiler); final program = compiler.compile({ 'example': { 'main.dart': ''' @@ -286,7 +275,7 @@ void main() { } }); final runtime = Runtime(program.write().buffer.asByteData()); - setupFlutterForRuntime(runtime); + runtime.addPlugin(flutterEvalPlugin); final result = runtime.executeLib('package:example/main.dart', 'main'); expect(result, isNotNull); expect(result.$value, isA()); @@ -295,8 +284,6 @@ void main() { }); testWidgets('Passing a Map', (WidgetTester tester) async { - final compiler = Compiler(); - setupFlutterForCompile(compiler); final program = compiler.compile({ 'example': { 'main.dart': ''' @@ -322,7 +309,7 @@ void main() { } }); final runtime = Runtime(program.write().buffer.asByteData()); - setupFlutterForRuntime(runtime); + runtime.addPlugin(flutterEvalPlugin); final Map<$String, $Value> map = {$String('title'): $String('Hello World')}; final result = runtime.executeLib( 'package:example/main.dart', 'MyWidget.', [$Map.wrap(map), null]); @@ -331,8 +318,6 @@ void main() { }); testWidgets('Callback onClick', (WidgetTester tester) async { - final compiler = Compiler(); - setupFlutterForCompile(compiler); final program = compiler.compile({ 'example': { 'main.dart': ''' @@ -358,7 +343,7 @@ void main() { } }); final runtime = Runtime(program.write().buffer.asByteData()); - setupFlutterForRuntime(runtime); + runtime.addPlugin(flutterEvalPlugin); String strval = ''; final result = runtime.executeLib('package:example/main.dart', 'MyWidget.', [ @@ -374,8 +359,6 @@ void main() { }); testWidgets('GestureDetector onTap', (WidgetTester tester) async { - final compiler = Compiler(); - setupFlutterForCompile(compiler); final program = compiler.compile({ 'example': { 'main.dart': ''' @@ -401,7 +384,7 @@ void main() { } }); final runtime = Runtime(program.write().buffer.asByteData()); - setupFlutterForRuntime(runtime); + runtime.addPlugin(flutterEvalPlugin); bool tapped = false; final result = runtime.executeLib('package:example/main.dart', 'MyWidget.', [ @@ -415,4 +398,46 @@ void main() { await tester.tap(find.text('Click me')); expect(tapped, isTrue); }); + + testWidgets('Navigator.push(MaterialPageRoute)', (WidgetTester tester) async { + final program = compiler.compile({ + 'example': { + 'main.dart': ''' + import 'package:flutter/material.dart'; + class MyWidget extends StatelessWidget { + final void Function(BuildContext context) onTap; + + MyWidget(this.onTap, {super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: GestureDetector( + onTap: () => onTap(context), + child: Text('Click me'), + ), + ), + ); + } + } + Widget main() { + return MaterialApp(home: MyWidget((BuildContext context) { + Navigator.of(context).push(MaterialPageRoute(builder: (context) { + return Text('Hello'); + })); + })); + } + ''' + } + }); + final runtime = Runtime(program.write().buffer.asByteData()); + runtime.addPlugin(flutterEvalPlugin); + await tester.pumpWidget( + runtime.executeLib('package:example/main.dart', 'main').$value); + expect(find.text('Hello'), findsNothing); + await tester.tap(find.text('Click me')); + await tester.pumpAndSettle(); + expect(find.text('Hello'), findsOneWidget); + }); } diff --git a/test/method_channel_test.dart b/test/method_channel_test.dart index 9ed352c..706b64c 100644 --- a/test/method_channel_test.dart +++ b/test/method_channel_test.dart @@ -14,7 +14,7 @@ void main() { return 'result'; }); final compiler = Compiler(); - setupFlutterForCompile(compiler); + compiler.addPlugin(flutterEvalPlugin); final program = compiler.compile({ 'example': { 'main.dart': ''' @@ -29,7 +29,7 @@ void main() { }); final runtime = Runtime(program.write().buffer.asByteData()); runtime.grant(const MethodChannelPermission('test_channel')); - setupFlutterForRuntime(runtime); + runtime.addPlugin(flutterEvalPlugin); expect( () async => await runtime.executeLib('package:example/main.dart', 'main'),